/ Hex Artifact Content
Login

Artifact 7e806af12d7915445e46407d32b275d8ca9db4e7:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 66  ******.** Code f
0180: 6f 72 20 74 65 73 74 69 6e 67 20 61 6c 6c 20 73  or testing all s
0190: 6f 72 74 73 20 6f 66 20 53 51 4c 69 74 65 20 69  orts of SQLite i
01a0: 6e 74 65 72 66 61 63 65 73 2e 20 20 54 68 69 73  nterfaces.  This
01b0: 20 63 6f 64 65 0a 2a 2a 20 69 73 20 6e 6f 74 20   code.** is not 
01c0: 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
01d0: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 20  SQLite library. 
01e0: 20 49 74 20 69 73 20 75 73 65 64 20 66 6f 72 20   It is used for 
01f0: 61 75 74 6f 6d 61 74 65 64 0a 2a 2a 20 74 65 73  automated.** tes
0200: 74 69 6e 67 20 6f 66 20 74 68 65 20 53 51 4c 69  ting of the SQLi
0210: 74 65 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23  te library..*/.#
0220: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0230: 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54 45  nt.h".#if SQLITE
0240: 5f 4f 53 5f 57 49 4e 0a 23 20 20 69 6e 63 6c 75  _OS_WIN.#  inclu
0250: 64 65 20 22 6f 73 5f 77 69 6e 2e 68 22 0a 23 65  de "os_win.h".#e
0260: 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 22  ndif..#include "
0270: 76 64 62 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c  vdbeInt.h".#incl
0280: 75 64 65 20 22 74 63 6c 2e 68 22 0a 23 69 6e 63  ude "tcl.h".#inc
0290: 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a  lude <stdlib.h>.
02a0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67  #include <string
02b0: 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .h>../*.** This 
02c0: 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
02d0: 20 66 69 72 73 74 20 70 61 72 74 20 6f 66 20 74   first part of t
02e0: 68 65 20 53 71 6c 69 74 65 44 62 20 73 74 72 75  he SqliteDb stru
02f0: 63 74 75 72 65 20 69 6e 20 0a 2a 2a 20 74 63 6c  cture in .** tcl
0300: 73 71 6c 69 74 65 2e 63 2e 20 20 57 65 20 6e 65  sqlite.c.  We ne
0310: 65 64 20 69 74 20 68 65 72 65 20 73 6f 20 74 68  ed it here so th
0320: 61 74 20 74 68 65 20 67 65 74 5f 73 71 6c 69 74  at the get_sqlit
0330: 65 5f 70 6f 69 6e 74 65 72 20 72 6f 75 74 69 6e  e_pointer routin
0340: 65 0a 2a 2a 20 63 61 6e 20 65 78 74 72 61 63 74  e.** can extract
0350: 20 74 68 65 20 73 71 6c 69 74 65 33 2a 20 70 6f   the sqlite3* po
0360: 69 6e 74 65 72 20 66 72 6f 6d 20 61 6e 20 65 78  inter from an ex
0370: 69 73 74 69 6e 67 20 54 63 6c 20 53 51 4c 69 74  isting Tcl SQLit
0380: 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  e.** connection.
0390: 0a 2a 2f 0a 73 74 72 75 63 74 20 53 71 6c 69 74  .*/.struct Sqlit
03a0: 65 44 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  eDb {.  sqlite3 
03b0: 2a 64 62 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  *db;.};../*.** C
03c0: 6f 6e 76 65 72 74 20 74 65 78 74 20 67 65 6e 65  onvert text gene
03d0: 72 61 74 65 64 20 62 79 20 74 68 65 20 22 25 70  rated by the "%p
03e0: 22 20 63 6f 6e 76 65 72 73 69 6f 6e 20 66 6f 72  " conversion for
03f0: 6d 61 74 20 62 61 63 6b 20 69 6e 74 6f 0a 2a 2a  mat back into.**
0400: 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73   a pointer..*/.s
0410: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 48 65  tatic int testHe
0420: 78 54 6f 49 6e 74 28 69 6e 74 20 68 29 7b 0a 20  xToInt(int h){. 
0430: 20 69 66 28 20 68 3e 3d 27 30 27 20 26 26 20 68   if( h>='0' && h
0440: 3c 3d 27 39 27 20 29 7b 0a 20 20 20 20 72 65 74  <='9' ){.    ret
0450: 75 72 6e 20 68 20 2d 20 27 30 27 3b 0a 20 20 7d  urn h - '0';.  }
0460: 65 6c 73 65 20 69 66 28 20 68 3e 3d 27 61 27 20  else if( h>='a' 
0470: 26 26 20 68 3c 3d 27 66 27 20 29 7b 0a 20 20 20  && h<='f' ){.   
0480: 20 72 65 74 75 72 6e 20 68 20 2d 20 27 61 27 20   return h - 'a' 
0490: 2b 20 31 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  + 10;.  }else{. 
04a0: 20 20 20 61 73 73 65 72 74 28 20 68 3e 3d 27 41     assert( h>='A
04b0: 27 20 26 26 20 68 3c 3d 27 46 27 20 29 3b 0a 20  ' && h<='F' );. 
04c0: 20 20 20 72 65 74 75 72 6e 20 68 20 2d 20 27 41     return h - 'A
04d0: 27 20 2b 20 31 30 3b 0a 20 20 7d 0a 7d 0a 76 6f  ' + 10;.  }.}.vo
04e0: 69 64 20 2a 73 71 6c 69 74 65 33 54 65 73 74 54  id *sqlite3TestT
04f0: 65 78 74 54 6f 50 74 72 28 63 6f 6e 73 74 20 63  extToPtr(const c
0500: 68 61 72 20 2a 7a 29 7b 0a 20 20 76 6f 69 64 20  har *z){.  void 
0510: 2a 70 3b 0a 20 20 75 36 34 20 76 3b 0a 20 20 75  *p;.  u64 v;.  u
0520: 33 32 20 76 32 3b 0a 20 20 69 66 28 20 7a 5b 30  32 v2;.  if( z[0
0530: 5d 3d 3d 27 30 27 20 26 26 20 7a 5b 31 5d 3d 3d  ]=='0' && z[1]==
0540: 27 78 27 20 29 7b 0a 20 20 20 20 7a 20 2b 3d 20  'x' ){.    z += 
0550: 32 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 30 3b 0a  2;.  }.  v = 0;.
0560: 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20    while( *z ){. 
0570: 20 20 20 76 20 3d 20 28 76 3c 3c 34 29 20 2b 20     v = (v<<4) + 
0580: 74 65 73 74 48 65 78 54 6f 49 6e 74 28 2a 7a 29  testHexToInt(*z)
0590: 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 7d 0a 20  ;.    z++;.  }. 
05a0: 20 69 66 28 20 73 69 7a 65 6f 66 28 70 29 3d 3d   if( sizeof(p)==
05b0: 73 69 7a 65 6f 66 28 76 29 20 29 7b 0a 20 20 20  sizeof(v) ){.   
05c0: 20 6d 65 6d 63 70 79 28 26 70 2c 20 26 76 2c 20   memcpy(&p, &v, 
05d0: 73 69 7a 65 6f 66 28 70 29 29 3b 0a 20 20 7d 65  sizeof(p));.  }e
05e0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
05f0: 20 73 69 7a 65 6f 66 28 70 29 3d 3d 73 69 7a 65   sizeof(p)==size
0600: 6f 66 28 76 32 29 20 29 3b 0a 20 20 20 20 76 32  of(v2) );.    v2
0610: 20 3d 20 28 75 33 32 29 76 3b 0a 20 20 20 20 6d   = (u32)v;.    m
0620: 65 6d 63 70 79 28 26 70 2c 20 26 76 32 2c 20 73  emcpy(&p, &v2, s
0630: 69 7a 65 6f 66 28 70 29 29 3b 0a 20 20 7d 0a 20  izeof(p));.  }. 
0640: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f   return p;.}.../
0650: 2a 0a 2a 2a 20 41 20 54 43 4c 20 63 6f 6d 6d 61  *.** A TCL comma
0660: 6e 64 20 74 68 61 74 20 72 65 74 75 72 6e 73 20  nd that returns 
0670: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
0680: 68 65 20 73 71 6c 69 74 65 2a 20 70 6f 69 6e 74  he sqlite* point
0690: 65 72 0a 2a 2a 20 66 6f 72 20 61 6e 20 73 71 6c  er.** for an sql
06a0: 69 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  ite connection i
06b0: 6e 73 74 61 6e 63 65 2e 20 20 42 61 64 20 74 68  nstance.  Bad th
06c0: 69 6e 67 73 20 68 61 70 70 65 6e 20 69 66 20 74  ings happen if t
06d0: 68 65 0a 2a 2a 20 69 6e 70 75 74 20 69 73 20 6e  he.** input is n
06e0: 6f 74 20 61 6e 20 73 71 6c 69 74 65 20 63 6f 6e  ot an sqlite con
06f0: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  nection..*/.stat
0700: 69 63 20 69 6e 74 20 67 65 74 5f 73 71 6c 69 74  ic int get_sqlit
0710: 65 5f 70 6f 69 6e 74 65 72 28 0a 20 20 76 6f 69  e_pointer(.  voi
0720: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
0730: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
0740: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
0750: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
0760: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
0770: 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 2a  truct SqliteDb *
0780: 70 3b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f  p;.  Tcl_CmdInfo
0790: 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 63 68 61 72   cmdInfo;.  char
07a0: 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 69 66   zBuf[100];.  if
07b0: 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
07c0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
07d0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
07e0: 76 2c 20 22 53 51 4c 49 54 45 2d 43 4f 4e 4e 45  v, "SQLITE-CONNE
07f0: 43 54 49 4f 4e 22 29 3b 0a 20 20 20 20 72 65 74  CTION");.    ret
0800: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
0810: 20 7d 0a 20 20 69 66 28 20 21 54 63 6c 5f 47 65   }.  if( !Tcl_Ge
0820: 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74  tCommandInfo(int
0830: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
0840: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 63 6d  ng(objv[1]), &cm
0850: 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54 63  dInfo) ){.    Tc
0860: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
0870: 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20  nterp, "command 
0880: 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 0a 20 20  not found: ",.  
0890: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74           Tcl_Get
08a0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
08b0: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
08c0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
08d0: 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 28 73 74 72  ;.  }.  p = (str
08e0: 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29 63 6d  uct SqliteDb*)cm
08f0: 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44  dInfo.objClientD
0900: 61 74 61 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a  ata;.  sprintf(z
0910: 42 75 66 2c 20 22 25 70 22 2c 20 70 2d 3e 64 62  Buf, "%p", p->db
0920: 29 3b 0a 20 20 69 66 28 20 73 74 72 6e 63 6d 70  );.  if( strncmp
0930: 28 7a 42 75 66 2c 22 30 78 22 2c 32 29 20 29 7b  (zBuf,"0x",2) ){
0940: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
0950: 66 2c 20 22 30 78 25 70 22 2c 20 70 2d 3e 64 62  f, "0x%p", p->db
0960: 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70  );.  }.  Tcl_App
0970: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
0980: 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65  , zBuf, 0);.  re
0990: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
09a0: 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 70  /*.** Decode a p
09b0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
09c0: 69 74 65 33 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  ite3 object..*/.
09d0: 69 6e 74 20 67 65 74 44 62 50 6f 69 6e 74 65 72  int getDbPointer
09e0: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
09f0: 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  erp, const char 
0a00: 2a 7a 41 2c 20 73 71 6c 69 74 65 33 20 2a 2a 70  *zA, sqlite3 **p
0a10: 70 44 62 29 7b 0a 20 20 73 74 72 75 63 74 20 53  pDb){.  struct S
0a20: 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20 54 63  qliteDb *p;.  Tc
0a30: 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66  l_CmdInfo cmdInf
0a40: 6f 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  o;.  if( Tcl_Get
0a50: 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65  CommandInfo(inte
0a60: 72 70 2c 20 7a 41 2c 20 26 63 6d 64 49 6e 66 6f  rp, zA, &cmdInfo
0a70: 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 73 74  ) ){.    p = (st
0a80: 72 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29 63  ruct SqliteDb*)c
0a90: 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74  mdInfo.objClient
0aa0: 44 61 74 61 3b 0a 20 20 20 20 2a 70 70 44 62 20  Data;.    *ppDb 
0ab0: 3d 20 70 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65  = p->db;.  }else
0ac0: 7b 0a 20 20 20 20 2a 70 70 44 62 20 3d 20 28 73  {.    *ppDb = (s
0ad0: 71 6c 69 74 65 33 2a 29 73 71 6c 69 74 65 33 54  qlite3*)sqlite3T
0ae0: 65 73 74 54 65 78 74 54 6f 50 74 72 28 7a 41 29  estTextToPtr(zA)
0af0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
0b00: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  CL_OK;.}..#if SQ
0b10: 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a  LITE_OS_WIN./*.*
0b20: 2a 20 44 65 63 6f 64 65 20 61 20 57 69 6e 33 32  * Decode a Win32
0b30: 20 48 41 4e 44 4c 45 20 6f 62 6a 65 63 74 2e 0a   HANDLE object..
0b40: 2a 2f 0a 69 6e 74 20 67 65 74 57 69 6e 33 32 48  */.int getWin32H
0b50: 61 6e 64 6c 65 28 54 63 6c 5f 49 6e 74 65 72 70  andle(Tcl_Interp
0b60: 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20   *interp, const 
0b70: 63 68 61 72 20 2a 7a 41 2c 20 4c 50 48 41 4e 44  char *zA, LPHAND
0b80: 4c 45 20 70 68 46 69 6c 65 29 7b 0a 20 20 2a 70  LE phFile){.  *p
0b90: 68 46 69 6c 65 20 3d 20 28 48 41 4e 44 4c 45 29  hFile = (HANDLE)
0ba0: 73 71 6c 69 74 65 33 54 65 73 74 54 65 78 74 54  sqlite3TestTextT
0bb0: 6f 50 74 72 28 7a 41 29 3b 0a 20 20 72 65 74 75  oPtr(zA);.  retu
0bc0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e  rn TCL_OK;.}.#en
0bd0: 64 69 66 0a 0a 65 78 74 65 72 6e 20 63 6f 6e 73  dif..extern cons
0be0: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45  t char *sqlite3E
0bf0: 72 72 4e 61 6d 65 28 69 6e 74 29 3b 0a 23 64 65  rrName(int);.#de
0c00: 66 69 6e 65 20 74 31 45 72 72 6f 72 4e 61 6d 65  fine t1ErrorName
0c10: 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 0a   sqlite3ErrName.
0c20: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
0c30: 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 20  n sqlite3_stmt* 
0c40: 69 6e 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 2a  into an sqlite3*
0c50: 2e 20 20 54 68 69 73 20 64 65 70 65 6e 64 73 20  .  This depends 
0c60: 6f 6e 20 74 68 65 0a 2a 2a 20 66 61 63 74 20 74  on the.** fact t
0c70: 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 2a  hat the sqlite3*
0c80: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 66 69   is the first fi
0c90: 65 6c 64 20 69 6e 20 74 68 65 20 56 64 62 65 20  eld in the Vdbe 
0ca0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 23 64  structure..*/.#d
0cb0: 65 66 69 6e 65 20 53 74 6d 74 54 6f 44 62 28 58  efine StmtToDb(X
0cc0: 29 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 68  )   sqlite3_db_h
0cd0: 61 6e 64 6c 65 28 58 29 0a 0a 2f 2a 0a 2a 2a 20  andle(X)../*.** 
0ce0: 43 68 65 63 6b 20 61 20 72 65 74 75 72 6e 20 76  Check a return v
0cf0: 61 6c 75 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  alue to make sur
0d00: 65 20 69 74 20 61 67 72 65 65 73 20 77 69 74 68  e it agrees with
0d10: 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20   the results.** 
0d20: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65 72 72  from sqlite3_err
0d30: 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  code..*/.int sql
0d40: 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
0d50: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
0d60: 72 70 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  rp, sqlite3 *db,
0d70: 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 66 28 20   int rc){.  if( 
0d80: 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 73 61  sqlite3_threadsa
0d90: 66 65 28 29 3d 3d 30 20 26 26 20 72 63 21 3d 53  fe()==0 && rc!=S
0da0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 26 26 20  QLITE_MISUSE && 
0db0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  rc!=SQLITE_OK.  
0dc0: 20 26 26 20 73 71 6c 69 74 65 33 5f 65 72 72 63   && sqlite3_errc
0dd0: 6f 64 65 28 64 62 29 21 3d 72 63 20 29 7b 0a 20  ode(db)!=rc ){. 
0de0: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30     char zBuf[200
0df0: 5d 3b 0a 20 20 20 20 69 6e 74 20 72 32 20 3d 20  ];.    int r2 = 
0e00: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
0e10: 64 62 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66  db);.    sprintf
0e20: 28 7a 42 75 66 2c 20 22 65 72 72 6f 72 20 63 6f  (zBuf, "error co
0e30: 64 65 20 25 73 20 28 25 64 29 20 64 6f 65 73 20  de %s (%d) does 
0e40: 6e 6f 74 20 6d 61 74 63 68 20 73 71 6c 69 74 65  not match sqlite
0e50: 33 5f 65 72 72 63 6f 64 65 20 25 73 20 28 25 64  3_errcode %s (%d
0e60: 29 22 2c 0a 20 20 20 20 20 20 20 74 31 45 72 72  )",.       t1Err
0e70: 6f 72 4e 61 6d 65 28 72 63 29 2c 20 72 63 2c 20  orName(rc), rc, 
0e80: 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 32 29 2c  t1ErrorName(r2),
0e90: 20 72 32 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65   r2);.    Tcl_Re
0ea0: 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  setResult(interp
0eb0: 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  );.    Tcl_Appen
0ec0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
0ed0: 7a 42 75 66 2c 20 30 29 3b 0a 20 20 20 20 72 65  zBuf, 0);.    re
0ee0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
0ef0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
0f00: 20 44 65 63 6f 64 65 20 61 20 70 6f 69 6e 74 65   Decode a pointe
0f10: 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f  r to an sqlite3_
0f20: 73 74 6d 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  stmt object..*/.
0f30: 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 53 74  static int getSt
0f40: 6d 74 50 6f 69 6e 74 65 72 28 0a 20 20 54 63 6c  mtPointer(.  Tcl
0f50: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
0f60: 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
0f70: 7a 41 72 67 2c 20 20 0a 20 20 73 71 6c 69 74 65  zArg,  .  sqlite
0f80: 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 0a  3_stmt **ppStmt.
0f90: 29 7b 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 28  ){.  *ppStmt = (
0fa0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 73 71  sqlite3_stmt*)sq
0fb0: 6c 69 74 65 33 54 65 73 74 54 65 78 74 54 6f 50  lite3TestTextToP
0fc0: 74 72 28 7a 41 72 67 29 3b 0a 20 20 72 65 74 75  tr(zArg);.  retu
0fd0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
0fe0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 74  .** Generate a t
0ff0: 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ext representati
1000: 6f 6e 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20  on of a pointer 
1010: 74 68 61 74 20 63 61 6e 20 62 65 20 75 6e 64 65  that can be unde
1020: 72 73 74 6f 6f 64 0a 2a 2a 20 62 79 20 74 68 65  rstood.** by the
1030: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 20 61 6e   getDbPointer an
1040: 64 20 67 65 74 56 6d 50 6f 69 6e 74 65 72 20 72  d getVmPointer r
1050: 6f 75 74 69 6e 65 73 20 61 62 6f 76 65 2e 0a 2a  outines above..*
1060: 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 62 6c 65 6d  *.** The problem
1070: 20 69 73 2c 20 6f 6e 20 73 6f 6d 65 20 6d 61 63   is, on some mac
1080: 68 69 6e 65 73 20 28 53 6f 6c 61 72 69 73 29 20  hines (Solaris) 
1090: 69 66 20 79 6f 75 20 64 6f 20 61 20 70 72 69 6e  if you do a prin
10a0: 74 66 20 77 69 74 68 0a 2a 2a 20 22 25 70 22 20  tf with.** "%p" 
10b0: 79 6f 75 20 63 61 6e 6e 6f 74 20 74 75 72 6e 20  you cannot turn 
10c0: 61 72 6f 75 6e 64 20 61 6e 64 20 64 6f 20 61 20  around and do a 
10d0: 73 63 61 6e 66 20 77 69 74 68 20 74 68 65 20 73  scanf with the s
10e0: 61 6d 65 20 22 25 70 22 20 61 6e 64 0a 2a 2a 20  ame "%p" and.** 
10f0: 67 65 74 20 79 6f 75 72 20 70 6f 69 6e 74 65 72  get your pointer
1100: 20 62 61 63 6b 2e 20 20 59 6f 75 20 68 61 76 65   back.  You have
1110: 20 74 6f 20 70 72 65 70 65 6e 64 20 61 20 22 30   to prepend a "0
1120: 78 22 20 62 65 66 6f 72 65 20 69 74 20 77 69 6c  x" before it wil
1130: 6c 0a 2a 2a 20 77 6f 72 6b 2e 20 20 4f 72 20 61  l.** work.  Or a
1140: 74 20 6c 65 61 73 74 20 74 68 61 74 20 69 73 20  t least that is 
1150: 77 68 61 74 20 69 73 20 72 65 70 6f 72 74 65 64  what is reported
1160: 20 74 6f 20 6d 65 20 28 64 72 68 29 2e 20 20 42   to me (drh).  B
1170: 75 74 20 74 68 69 73 0a 2a 2a 20 62 65 68 61 76  ut this.** behav
1180: 69 6f 72 20 76 61 72 69 65 73 20 66 72 6f 6d 20  ior varies from 
1190: 6d 61 63 68 69 6e 65 20 74 6f 20 6d 61 63 68 69  machine to machi
11a0: 6e 65 2e 20 20 54 68 65 20 73 6f 6c 75 74 69 6f  ne.  The solutio
11b0: 6e 20 75 73 65 64 20 68 65 72 20 69 73 0a 2a 2a  n used her is.**
11c0: 20 74 6f 20 74 65 73 74 20 74 68 65 20 73 74 72   to test the str
11d0: 69 6e 67 20 72 69 67 68 74 20 61 66 74 65 72 20  ing right after 
11e0: 69 74 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  it is generated 
11f0: 74 6f 20 73 65 65 20 69 66 20 69 74 20 63 61 6e  to see if it can
1200: 20 62 65 0a 2a 2a 20 75 6e 64 65 72 73 74 6f 6f   be.** understoo
1210: 64 20 62 79 20 73 63 61 6e 66 2c 20 61 6e 64 20  d by scanf, and 
1220: 69 66 20 6e 6f 74 2c 20 74 72 79 20 70 72 65 70  if not, try prep
1230: 65 6e 64 69 6e 67 20 61 6e 20 22 30 78 22 20 74  ending an "0x" t
1240: 6f 20 73 65 65 20 69 66 0a 2a 2a 20 74 68 61 74  o see if.** that
1250: 20 68 65 6c 70 73 2e 20 20 49 66 20 6e 6f 74 68   helps.  If noth
1260: 69 6e 67 20 77 6f 72 6b 73 2c 20 61 20 66 61 74  ing works, a fat
1270: 61 6c 20 65 72 72 6f 72 20 69 73 20 67 65 6e 65  al error is gene
1280: 72 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rated..*/.int sq
1290: 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
12a0: 6e 74 65 72 53 74 72 28 54 63 6c 5f 49 6e 74 65  nterStr(Tcl_Inte
12b0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 63 68 61 72  rp *interp, char
12c0: 20 2a 7a 50 74 72 2c 20 76 6f 69 64 20 2a 70 29   *zPtr, void *p)
12d0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  {.  sqlite3_snpr
12e0: 69 6e 74 66 28 31 30 30 2c 20 7a 50 74 72 2c 20  intf(100, zPtr, 
12f0: 22 25 70 22 2c 20 70 29 3b 0a 20 20 72 65 74 75  "%p", p);.  retu
1300: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1310: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b  .** The callback
1320: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 71 6c   routine for sql
1330: 69 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74 66  ite3_exec_printf
1340: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
1350: 74 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63 62  t exec_printf_cb
1360: 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74  (void *pArg, int
1370: 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72   argc, char **ar
1380: 67 76 2c 20 63 68 61 72 20 2a 2a 6e 61 6d 65 29  gv, char **name)
1390: 7b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  {.  Tcl_DString 
13a0: 2a 73 74 72 20 3d 20 28 54 63 6c 5f 44 53 74 72  *str = (Tcl_DStr
13b0: 69 6e 67 2a 29 70 41 72 67 3b 0a 20 20 69 6e 74  ing*)pArg;.  int
13c0: 20 69 3b 0a 0a 20 20 69 66 28 20 54 63 6c 5f 44   i;..  if( Tcl_D
13d0: 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 73 74 72  StringLength(str
13e0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28  )==0 ){.    for(
13f0: 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  i=0; i<argc; i++
1400: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 53 74  ){.      Tcl_DSt
1410: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
1420: 74 28 73 74 72 2c 20 6e 61 6d 65 5b 69 5d 20 3f  t(str, name[i] ?
1430: 20 6e 61 6d 65 5b 69 5d 20 3a 20 22 4e 55 4c 4c   name[i] : "NULL
1440: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ");.    }.  }.  
1450: 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b  for(i=0; i<argc;
1460: 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 44   i++){.    Tcl_D
1470: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
1480: 65 6e 74 28 73 74 72 2c 20 61 72 67 76 5b 69 5d  ent(str, argv[i]
1490: 20 3f 20 61 72 67 76 5b 69 5d 20 3a 20 22 4e 55   ? argv[i] : "NU
14a0: 4c 4c 22 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  LL");.  }.  retu
14b0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
14c0: 68 65 20 49 2f 4f 20 74 72 61 63 69 6e 67 20 63  he I/O tracing c
14d0: 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 23 69 66 20  allback..*/.#if 
14e0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
14f0: 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64  OMIT_TRACE) && d
1500: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
1510: 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 73 74  ABLE_IOTRACE).st
1520: 61 74 69 63 20 46 49 4c 45 20 2a 69 6f 74 72 61  atic FILE *iotra
1530: 63 65 5f 66 69 6c 65 20 3d 20 30 3b 0a 73 74 61  ce_file = 0;.sta
1540: 74 69 63 20 76 6f 69 64 20 69 6f 5f 74 72 61 63  tic void io_trac
1550: 65 5f 63 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74  e_callback(const
1560: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
1570: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
1580: 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  ap;.  va_start(a
1590: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 76  p, zFormat);.  v
15a0: 66 70 72 69 6e 74 66 28 69 6f 74 72 61 63 65 5f  fprintf(iotrace_
15b0: 66 69 6c 65 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  file, zFormat, a
15c0: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
15d0: 3b 0a 20 20 66 66 6c 75 73 68 28 69 6f 74 72 61  ;.  fflush(iotra
15e0: 63 65 5f 66 69 6c 65 29 3b 0a 7d 0a 23 65 6e 64  ce_file);.}.#end
15f0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  if../*.** Usage:
1600: 20 20 69 6f 5f 74 72 61 63 65 20 46 49 4c 45 4e    io_trace FILEN
1610: 41 4d 45 0a 2a 2a 0a 2a 2a 20 54 75 72 6e 20 49  AME.**.** Turn I
1620: 2f 4f 20 74 72 61 63 69 6e 67 20 6f 6e 20 6f 72  /O tracing on or
1630: 20 6f 66 66 2e 20 20 49 66 20 46 49 4c 45 4e 41   off.  If FILENA
1640: 4d 45 20 69 73 20 6e 6f 74 20 61 6e 20 65 6d 70  ME is not an emp
1650: 74 79 20 73 74 72 69 6e 67 2c 0a 2a 2a 20 49 2f  ty string,.** I/
1660: 4f 20 74 72 61 63 69 6e 67 20 62 65 67 69 6e 73  O tracing begins
1670: 20 67 6f 69 6e 67 20 69 6e 74 6f 20 46 49 4c 45   going into FILE
1680: 4e 41 4d 45 2e 20 49 66 20 46 49 4c 45 4e 41 4d  NAME. If FILENAM
1690: 45 20 69 73 20 61 6e 20 65 6d 70 74 79 0a 2a 2a  E is an empty.**
16a0: 20 73 74 72 69 6e 67 2c 20 49 2f 4f 20 74 72 61   string, I/O tra
16b0: 63 69 6e 67 20 69 73 20 74 75 72 6e 65 64 20 6f  cing is turned o
16c0: 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ff..*/.static in
16d0: 74 20 74 65 73 74 5f 69 6f 5f 74 72 61 63 65 28  t test_io_trace(
16e0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
16f0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1700: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
1710: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
1720: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
1730: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
1740: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
1750: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1760: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
1770: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
1780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
1790: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
17a0: 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 21 64  ent */.){.#if !d
17b0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
17c0: 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66  IT_TRACE) && def
17d0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
17e0: 4c 45 5f 49 4f 54 52 41 43 45 29 0a 20 20 69 66  LE_IOTRACE).  if
17f0: 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20  ( argc!=2 ){.   
1800: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1810: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1820: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1830: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
1840: 0a 20 20 20 20 20 20 20 20 20 20 22 20 46 49 4c  .          " FIL
1850: 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20  ENAME\"", 0);.  
1860: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1870: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 6f  OR;.  }.  if( io
1880: 74 72 61 63 65 5f 66 69 6c 65 20 29 7b 0a 20 20  trace_file ){.  
1890: 20 20 69 66 28 20 69 6f 74 72 61 63 65 5f 66 69    if( iotrace_fi
18a0: 6c 65 21 3d 73 74 64 6f 75 74 20 26 26 20 69 6f  le!=stdout && io
18b0: 74 72 61 63 65 5f 66 69 6c 65 21 3d 73 74 64 65  trace_file!=stde
18c0: 72 72 20 29 7b 0a 20 20 20 20 20 20 66 63 6c 6f  rr ){.      fclo
18d0: 73 65 28 69 6f 74 72 61 63 65 5f 66 69 6c 65 29  se(iotrace_file)
18e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6f 74 72  ;.    }.    iotr
18f0: 61 63 65 5f 66 69 6c 65 20 3d 20 30 3b 0a 20 20  ace_file = 0;.  
1900: 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65    sqlite3IoTrace
1910: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
1920: 61 72 67 76 5b 31 5d 5b 30 5d 20 29 7b 0a 20 20  argv[1][0] ){.  
1930: 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67    if( strcmp(arg
1940: 76 5b 31 5d 2c 22 73 74 64 6f 75 74 22 29 3d 3d  v[1],"stdout")==
1950: 30 20 29 7b 0a 20 20 20 20 20 20 69 6f 74 72 61  0 ){.      iotra
1960: 63 65 5f 66 69 6c 65 20 3d 20 73 74 64 6f 75 74  ce_file = stdout
1970: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1980: 73 74 72 63 6d 70 28 61 72 67 76 5b 31 5d 2c 22  strcmp(argv[1],"
1990: 73 74 64 65 72 72 22 29 3d 3d 30 20 29 7b 0a 20  stderr")==0 ){. 
19a0: 20 20 20 20 20 69 6f 74 72 61 63 65 5f 66 69 6c       iotrace_fil
19b0: 65 20 3d 20 73 74 64 65 72 72 3b 0a 20 20 20 20  e = stderr;.    
19c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6f 74  }else{.      iot
19d0: 72 61 63 65 5f 66 69 6c 65 20 3d 20 66 6f 70 65  race_file = fope
19e0: 6e 28 61 72 67 76 5b 31 5d 2c 20 22 77 22 29 3b  n(argv[1], "w");
19f0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1a00: 65 33 49 6f 54 72 61 63 65 20 3d 20 69 6f 5f 74  e3IoTrace = io_t
1a10: 72 61 63 65 5f 63 61 6c 6c 62 61 63 6b 3b 0a 20  race_callback;. 
1a20: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
1a30: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1a40: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 63 6c 61 6e  .** Usage:  clan
1a50: 67 5f 73 61 6e 69 74 69 7a 65 5f 61 64 64 72 65  g_sanitize_addre
1a60: 73 73 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ss .**.** Return
1a70: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 70 72  s true if the pr
1a80: 6f 67 72 61 6d 20 77 61 73 20 63 6f 6d 70 69 6c  ogram was compil
1a90: 65 64 20 75 73 69 6e 67 20 63 6c 61 6e 67 20 77  ed using clang w
1aa0: 69 74 68 20 74 68 65 20 0a 2a 2a 20 2d 66 73 61  ith the .** -fsa
1ab0: 6e 69 74 69 7a 65 3d 61 64 64 72 65 73 73 20 73  nitize=address s
1ac0: 77 69 74 63 68 20 6f 6e 20 74 68 65 20 63 6f 6d  witch on the com
1ad0: 6d 61 6e 64 20 6c 69 6e 65 2e 20 46 61 6c 73 65  mand line. False
1ae0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
1af0: 74 61 74 69 63 20 69 6e 74 20 63 6c 61 6e 67 5f  tatic int clang_
1b00: 73 61 6e 69 74 69 7a 65 5f 61 64 64 72 65 73 73  sanitize_address
1b10: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
1b20: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
1b30: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
1b40: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
1b50: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
1b60: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
1b70: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
1b80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1b90: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
1ba0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1bc0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
1bd0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ment */.){.  int
1be0: 20 72 65 73 20 3d 20 30 3b 0a 23 69 66 20 64 65   res = 0;.#if de
1bf0: 66 69 6e 65 64 28 5f 5f 68 61 73 5f 66 65 61 74  fined(__has_feat
1c00: 75 72 65 29 0a 23 20 69 66 20 5f 5f 68 61 73 5f  ure).# if __has_
1c10: 66 65 61 74 75 72 65 28 61 64 64 72 65 73 73 5f  feature(address_
1c20: 73 61 6e 69 74 69 7a 65 72 29 0a 20 20 72 65 73  sanitizer).  res
1c30: 20 3d 20 31 3b 0a 23 20 65 6e 64 69 66 0a 23 65   = 1;.# endif.#e
1c40: 6e 64 69 66 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ndif.  Tcl_SetOb
1c50: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
1c60: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65  Tcl_NewIntObj(re
1c70: 73 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  s));.  return TC
1c80: 4c 5f 4f 4b 3b 0a 7d 0a 20 20 0a 2f 2a 0a 2a 2a  L_OK;.}.  ./*.**
1c90: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
1ca0: 5f 65 78 65 63 5f 70 72 69 6e 74 66 20 20 44 42  _exec_printf  DB
1cb0: 20 20 46 4f 52 4d 41 54 20 20 53 54 52 49 4e 47    FORMAT  STRING
1cc0: 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  .**.** Invoke th
1cd0: 65 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 70  e sqlite3_exec_p
1ce0: 72 69 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63  rintf() interfac
1cf0: 65 20 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e  e using the open
1d00: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 44 42 2e   database.** DB.
1d10: 20 20 54 68 65 20 53 51 4c 20 69 73 20 74 68 65    The SQL is the
1d20: 20 73 74 72 69 6e 67 20 46 4f 52 4d 41 54 2e 20   string FORMAT. 
1d30: 20 54 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69   The format stri
1d40: 6e 67 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69  ng should contai
1d50: 6e 0a 2a 2a 20 6f 6e 65 20 25 73 20 6f 72 20 25  n.** one %s or %
1d60: 71 2e 20 20 53 54 52 49 4e 47 20 69 73 20 74 68  q.  STRING is th
1d70: 65 20 76 61 6c 75 65 20 69 6e 73 65 72 74 65 64  e value inserted
1d80: 20 69 6e 74 6f 20 25 73 20 6f 72 20 25 71 2e 0a   into %s or %q..
1d90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1da0: 73 74 5f 65 78 65 63 5f 70 72 69 6e 74 66 28 0a  st_exec_printf(.
1db0: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
1dc0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1dd0: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
1de0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
1df0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
1e00: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
1e10: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
1e20: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1e30: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
1e40: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
1e50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
1e60: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
1e70: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
1e80: 65 33 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53  e3 *db;.  Tcl_DS
1e90: 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74  tring str;.  int
1ea0: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72   rc;.  char *zEr
1eb0: 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  r = 0;.  char *z
1ec0: 53 71 6c 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  Sql;.  char zBuf
1ed0: 5b 33 30 5d 3b 0a 20 20 69 66 28 20 61 72 67 63  [30];.  if( argc
1ee0: 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
1ef0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1f00: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1f10: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1f20: 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
1f30: 20 20 20 22 20 44 42 20 46 4f 52 4d 41 54 20 53     " DB FORMAT S
1f40: 54 52 49 4e 47 22 2c 20 30 29 3b 0a 20 20 20 20  TRING", 0);.    
1f50: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1f60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
1f70: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
1f80: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
1f90: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1fa0: 52 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  R;.  Tcl_DString
1fb0: 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 7a 53  Init(&str);.  zS
1fc0: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
1fd0: 69 6e 74 66 28 61 72 67 76 5b 32 5d 2c 20 61 72  intf(argv[2], ar
1fe0: 67 76 5b 33 5d 29 3b 0a 20 20 72 63 20 3d 20 73  gv[3]);.  rc = s
1ff0: 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20  qlite3_exec(db, 
2000: 7a 53 71 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74  zSql, exec_print
2010: 66 5f 63 62 2c 20 26 73 74 72 2c 20 26 7a 45 72  f_cb, &str, &zEr
2020: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  r);.  sqlite3_fr
2030: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 73 70 72 69  ee(zSql);.  spri
2040: 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20  ntf(zBuf, "%d", 
2050: 72 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  rc);.  Tcl_Appen
2060: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2070: 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70   zBuf);.  Tcl_Ap
2080: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2090: 72 70 2c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rp, rc==SQLITE_O
20a0: 4b 20 3f 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  K ? Tcl_DStringV
20b0: 61 6c 75 65 28 26 73 74 72 29 20 3a 20 7a 45 72  alue(&str) : zEr
20c0: 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  r);.  Tcl_DStrin
20d0: 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 69  gFree(&str);.  i
20e0: 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74 65  f( zErr ) sqlite
20f0: 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20  3_free(zErr);.  
2100: 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
2110: 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
2120: 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
2130: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74  TCL_ERROR;.  ret
2140: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
2150: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
2160: 69 74 65 33 5f 65 78 65 63 5f 68 65 78 20 20 44  ite3_exec_hex  D
2170: 42 20 20 48 45 58 0a 2a 2a 0a 2a 2a 20 49 6e 76  B  HEX.**.** Inv
2180: 6f 6b 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  oke the sqlite3_
2190: 65 78 65 63 28 29 20 6f 6e 20 61 20 73 74 72 69  exec() on a stri
21a0: 6e 67 20 74 68 61 74 20 69 73 20 6f 62 74 61 69  ng that is obtai
21b0: 6e 65 64 20 62 79 20 74 72 61 6e 73 6c 61 74 69  ned by translati
21c0: 6e 67 0a 2a 2a 20 48 45 58 20 69 6e 74 6f 20 41  ng.** HEX into A
21d0: 53 43 49 49 2e 20 20 4d 6f 73 74 20 63 68 61 72  SCII.  Most char
21e0: 61 63 74 65 72 73 20 61 72 65 20 74 72 61 6e 73  acters are trans
21f0: 6c 61 74 65 64 20 61 73 20 69 73 2e 20 20 25 48  lated as is.  %H
2200: 48 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 61 20 68  H becomes.** a h
2210: 65 78 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f  ex character..*/
2220: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
2230: 5f 65 78 65 63 5f 68 65 78 28 0a 20 20 76 6f 69  _exec_hex(.  voi
2240: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
2250: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2260: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
2270: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
2280: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
2290: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
22a0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
22b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
22c0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
22d0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
22e0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
22f0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
2300: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
2310: 62 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  b;.  Tcl_DString
2320: 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63 2c 20   str;.  int rc, 
2330: 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 2a 7a 45  i, j;.  char *zE
2340: 72 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  rr = 0;.  char *
2350: 7a 48 65 78 3b 0a 20 20 63 68 61 72 20 7a 53 71  zHex;.  char zSq
2360: 6c 5b 35 30 30 5d 3b 0a 20 20 63 68 61 72 20 7a  l[500];.  char z
2370: 42 75 66 5b 33 30 5d 3b 0a 20 20 69 66 28 20 61  Buf[30];.  if( a
2380: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
2390: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
23a0: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
23b0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
23c0: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
23d0: 20 20 20 20 20 20 22 20 44 42 20 48 45 58 22 2c        " DB HEX",
23e0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
23f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2400: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
2410: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
2420: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
2430: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 48   TCL_ERROR;.  zH
2440: 65 78 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20  ex = argv[2];.  
2450: 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 73 69 7a  for(i=j=0; i<siz
2460: 65 6f 66 28 7a 53 71 6c 29 20 26 26 20 7a 48 65  eof(zSql) && zHe
2470: 78 5b 6a 5d 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b  x[j]; i++, j++){
2480: 0a 20 20 20 20 69 66 28 20 7a 48 65 78 5b 6a 5d  .    if( zHex[j]
2490: 3d 3d 27 25 27 20 26 26 20 7a 48 65 78 5b 6a 2b  =='%' && zHex[j+
24a0: 32 5d 20 26 26 20 7a 48 65 78 5b 6a 2b 32 5d 20  2] && zHex[j+2] 
24b0: 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 69 5d  ){.      zSql[i]
24c0: 20 3d 20 28 74 65 73 74 48 65 78 54 6f 49 6e 74   = (testHexToInt
24d0: 28 7a 48 65 78 5b 6a 2b 31 5d 29 3c 3c 34 29 20  (zHex[j+1])<<4) 
24e0: 2b 20 74 65 73 74 48 65 78 54 6f 49 6e 74 28 7a  + testHexToInt(z
24f0: 48 65 78 5b 6a 2b 32 5d 29 3b 0a 20 20 20 20 20  Hex[j+2]);.     
2500: 20 6a 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65 6c   j += 2;.    }el
2510: 73 65 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 69  se{.      zSql[i
2520: 5d 20 3d 20 7a 48 65 78 5b 6a 5d 3b 0a 20 20 20  ] = zHex[j];.   
2530: 20 7d 0a 20 20 7d 0a 20 20 7a 53 71 6c 5b 69 5d   }.  }.  zSql[i]
2540: 20 3d 20 30 3b 0a 20 20 54 63 6c 5f 44 53 74 72   = 0;.  Tcl_DStr
2550: 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20  ingInit(&str);. 
2560: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
2570: 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 65 78 65  ec(db, zSql, exe
2580: 63 5f 70 72 69 6e 74 66 5f 63 62 2c 20 26 73 74  c_printf_cb, &st
2590: 72 2c 20 26 7a 45 72 72 29 3b 0a 20 20 73 70 72  r, &zErr);.  spr
25a0: 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c  intf(zBuf, "%d",
25b0: 20 72 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65   rc);.  Tcl_Appe
25c0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
25d0: 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41  , zBuf);.  Tcl_A
25e0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
25f0: 65 72 70 2c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  erp, rc==SQLITE_
2600: 4f 4b 20 3f 20 54 63 6c 5f 44 53 74 72 69 6e 67  OK ? Tcl_DString
2610: 56 61 6c 75 65 28 26 73 74 72 29 20 3a 20 7a 45  Value(&str) : zE
2620: 72 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  rr);.  Tcl_DStri
2630: 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20  ngFree(&str);.  
2640: 69 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74  if( zErr ) sqlit
2650: 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20  e3_free(zErr);. 
2660: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
2670: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
2680: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
2690: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
26a0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
26b0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 64 62  /*.** Usage:  db
26c0: 5f 65 6e 74 65 72 20 44 42 0a 2a 2a 20 20 20 20  _enter DB.**    
26d0: 20 20 20 20 20 64 62 5f 6c 65 61 76 65 20 44 42       db_leave DB
26e0: 0a 2a 2a 0a 2a 2a 20 45 6e 74 65 72 20 6f 72 20  .**.** Enter or 
26f0: 6c 65 61 76 65 20 74 68 65 20 6d 75 74 65 78 20  leave the mutex 
2700: 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  on a database co
2710: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nnection..*/.sta
2720: 74 69 63 20 69 6e 74 20 64 62 5f 65 6e 74 65 72  tic int db_enter
2730: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
2740: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
2750: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
2760: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
2770: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
2780: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
2790: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
27a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
27b0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
27c0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
27e0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
27f0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
2800: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
2810: 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  argc!=2 ){.    T
2820: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2830: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
2840: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
2850: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a   \"", argv[0], .
2860: 20 20 20 20 20 20 20 22 20 44 42 22 2c 20 30 29         " DB", 0)
2870: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2880: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
2890: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
28a0: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
28b0: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
28c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74  L_ERROR;.  sqlit
28d0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
28e0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
28f0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 73 74  urn TCL_OK;.}.st
2900: 61 74 69 63 20 69 6e 74 20 64 62 5f 6c 65 61 76  atic int db_leav
2910: 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  e(.  void *NotUs
2920: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
2930: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
2940: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
2950: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
2960: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
2970: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
2980: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2990: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
29a0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
29b0: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
29c0: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
29d0: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71  ument */.){.  sq
29e0: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28  lite3 *db;.  if(
29f0: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
2a00: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2a10: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
2a20: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
2a30: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
2a40: 0a 20 20 20 20 20 20 20 22 20 44 42 22 2c 20 30  .       " DB", 0
2a50: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2a60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
2a70: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
2a80: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
2a90: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
2aa0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69  CL_ERROR;.  sqli
2ab0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
2ac0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
2ad0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
2ae0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
2af0: 6c 69 74 65 33 5f 65 78 65 63 20 20 44 42 20 20  lite3_exec  DB  
2b00: 53 51 4c 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  SQL.**.** Invoke
2b10: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 65 78 65   the sqlite3_exe
2b20: 63 20 69 6e 74 65 72 66 61 63 65 20 75 73 69 6e  c interface usin
2b30: 67 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  g the open datab
2b40: 61 73 65 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63  ase DB.*/.static
2b50: 20 69 6e 74 20 74 65 73 74 5f 65 78 65 63 28 0a   int test_exec(.
2b60: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
2b70: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2b80: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
2b90: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
2ba0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
2bb0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
2bc0: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
2bd0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2be0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
2bf0: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
2c00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
2c10: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
2c20: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
2c30: 65 33 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53  e3 *db;.  Tcl_DS
2c40: 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74  tring str;.  int
2c50: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72   rc;.  char *zEr
2c60: 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  r = 0;.  char *z
2c70: 53 71 6c 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  Sql;.  int i, j;
2c80: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d  .  char zBuf[30]
2c90: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
2ca0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
2cb0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2cc0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
2cd0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
2ce0: 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22  gv[0], .       "
2cf0: 20 44 42 20 53 51 4c 22 2c 20 30 29 3b 0a 20 20   DB SQL", 0);.  
2d00: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2d10: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
2d20: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
2d30: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
2d40: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2d50: 52 4f 52 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  ROR;.  Tcl_DStri
2d60: 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20  ngInit(&str);.  
2d70: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
2d80: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 61 72 67  printf("%s", arg
2d90: 76 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 6a  v[2]);.  for(i=j
2da0: 3d 30 3b 20 7a 53 71 6c 5b 69 5d 3b 29 7b 0a 20  =0; zSql[i];){. 
2db0: 20 20 20 69 66 28 20 7a 53 71 6c 5b 69 5d 3d 3d     if( zSql[i]==
2dc0: 27 25 27 20 29 7b 0a 20 20 20 20 20 20 7a 53 71  '%' ){.      zSq
2dd0: 6c 5b 6a 2b 2b 5d 20 3d 20 28 74 65 73 74 48 65  l[j++] = (testHe
2de0: 78 54 6f 49 6e 74 28 7a 53 71 6c 5b 69 2b 31 5d  xToInt(zSql[i+1]
2df0: 29 3c 3c 34 29 20 2b 20 74 65 73 74 48 65 78 54  )<<4) + testHexT
2e00: 6f 49 6e 74 28 7a 53 71 6c 5b 69 2b 32 5d 29 3b  oInt(zSql[i+2]);
2e10: 0a 20 20 20 20 20 20 69 20 2b 3d 20 33 3b 0a 20  .      i += 3;. 
2e20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e30: 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 7a 53 71 6c  zSql[j++] = zSql
2e40: 5b 69 2b 2b 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  [i++];.    }.  }
2e50: 0a 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a  .  zSql[j] = 0;.
2e60: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
2e70: 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 65 78  xec(db, zSql, ex
2e80: 65 63 5f 70 72 69 6e 74 66 5f 63 62 2c 20 26 73  ec_printf_cb, &s
2e90: 74 72 2c 20 26 7a 45 72 72 29 3b 0a 20 20 73 71  tr, &zErr);.  sq
2ea0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
2eb0: 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66  ;.  sprintf(zBuf
2ec0: 2c 20 22 25 64 22 2c 20 72 63 29 3b 0a 20 20 54  , "%d", rc);.  T
2ed0: 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  cl_AppendElement
2ee0: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a  (interp, zBuf);.
2ef0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d    Tcl_AppendElem
2f00: 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 63 3d 3d  ent(interp, rc==
2f10: 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 63 6c 5f  SQLITE_OK ? Tcl_
2f20: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74  DStringValue(&st
2f30: 72 29 20 3a 20 7a 45 72 72 29 3b 0a 20 20 54 63  r) : zErr);.  Tc
2f40: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 73  l_DStringFree(&s
2f50: 74 72 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20  tr);.  if( zErr 
2f60: 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a  ) sqlite3_free(z
2f70: 45 72 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  Err);.  if( sqli
2f80: 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
2f90: 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
2fa0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2fb0: 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  R;.  return TCL_
2fc0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
2fd0: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65 78 65  ge:  sqlite3_exe
2fe0: 63 5f 6e 72 20 20 44 42 20 20 53 51 4c 0a 2a 2a  c_nr  DB  SQL.**
2ff0: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73  .** Invoke the s
3000: 71 6c 69 74 65 33 5f 65 78 65 63 20 69 6e 74 65  qlite3_exec inte
3010: 72 66 61 63 65 20 75 73 69 6e 67 20 74 68 65 20  rface using the 
3020: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 44 42  open database DB
3030: 2e 20 20 44 69 73 63 61 72 64 0a 2a 2a 20 61 6c  .  Discard.** al
3040: 6c 20 72 65 73 75 6c 74 73 0a 2a 2f 0a 73 74 61  l results.*/.sta
3050: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 78 65  tic int test_exe
3060: 63 5f 6e 72 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  c_nr(.  void *No
3070: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
3080: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
3090: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
30a0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
30b0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
30c0: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30e0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
30f0: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
3100: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
3110: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
3120: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
3130: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
3140: 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a  int rc;.  char *
3150: 7a 45 72 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  zErr = 0;.  if( 
3160: 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  argc!=3 ){.    T
3170: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
3180: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
3190: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
31a0: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a   \"", argv[0], .
31b0: 20 20 20 20 20 20 20 22 20 44 42 20 53 51 4c 22         " DB SQL"
31c0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
31d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
31e0: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
31f0: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
3200: 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
3210: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
3220: 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
3230: 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 30 2c  (db, argv[2], 0,
3240: 20 30 2c 20 26 7a 45 72 72 29 3b 0a 20 20 69 66   0, &zErr);.  if
3250: 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
3260: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
3270: 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
3280: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72  L_ERROR;.  retur
3290: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
32a0: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
32b0: 65 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f 74 65 73  e3_mprintf_z_tes
32c0: 74 20 20 53 45 50 41 52 41 54 4f 52 20 20 41 52  t  SEPARATOR  AR
32d0: 47 30 20 20 41 52 47 31 20 2e 2e 2e 0a 2a 2a 0a  G0  ARG1 ....**.
32e0: 2a 2a 20 54 65 73 74 20 74 68 65 20 25 7a 20 66  ** Test the %z f
32f0: 6f 72 6d 61 74 20 6f 66 20 73 71 6c 69 74 65 5f  ormat of sqlite_
3300: 6d 70 72 69 6e 74 66 28 29 2e 20 20 55 73 65 20  mprintf().  Use 
3310: 6d 75 6c 74 69 70 6c 65 20 6d 70 72 69 6e 74 66  multiple mprintf
3320: 28 29 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20  () calls to .** 
3330: 63 6f 6e 63 61 74 65 6e 61 74 65 20 61 72 67 30  concatenate arg0
3340: 20 74 68 72 6f 75 67 68 20 61 72 67 6e 20 75 73   through argn us
3350: 69 6e 67 20 73 65 70 61 72 61 74 6f 72 20 61 73  ing separator as
3360: 20 74 68 65 20 73 65 70 61 72 61 74 6f 72 2e 0a   the separator..
3370: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  ** Return the re
3380: 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sult..*/.static 
3390: 69 6e 74 20 74 65 73 74 5f 6d 70 72 69 6e 74 66  int test_mprintf
33a0: 5f 7a 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  _z(.  void *NotU
33b0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
33c0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
33d0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
33e0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
33f0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
3400: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
3410: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3420: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
3430: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
3440: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
3450: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
3460: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63  gument */.){.  c
3470: 68 61 72 20 2a 7a 52 65 73 75 6c 74 20 3d 20 30  har *zResult = 0
3480: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 66 6f  ;.  int i;..  fo
3490: 72 28 69 3d 32 3b 20 69 3c 61 72 67 63 20 26 26  r(i=2; i<argc &&
34a0: 20 28 69 3d 3d 32 20 7c 7c 20 7a 52 65 73 75 6c   (i==2 || zResul
34b0: 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 52  t); i++){.    zR
34c0: 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 5f  esult = sqlite3_
34d0: 6d 70 72 69 6e 74 66 28 22 25 7a 25 73 25 73 22  mprintf("%z%s%s"
34e0: 2c 20 7a 52 65 73 75 6c 74 2c 20 61 72 67 76 5b  , zResult, argv[
34f0: 31 5d 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20  1], argv[i]);.  
3500: 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  }.  Tcl_AppendRe
3510: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 52 65  sult(interp, zRe
3520: 73 75 6c 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69  sult, 0);.  sqli
3530: 74 65 33 5f 66 72 65 65 28 7a 52 65 73 75 6c 74  te3_free(zResult
3540: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
3550: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
3560: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge:  sqlite3_mpr
3570: 69 6e 74 66 5f 6e 5f 74 65 73 74 20 20 53 54 52  intf_n_test  STR
3580: 49 4e 47 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  ING.**.** Test t
3590: 68 65 20 25 6e 20 66 6f 72 6d 61 74 20 6f 66 20  he %n format of 
35a0: 73 71 6c 69 74 65 5f 6d 70 72 69 6e 74 66 28 29  sqlite_mprintf()
35b0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65  .  Return the le
35c0: 6e 67 74 68 20 6f 66 20 74 68 65 0a 2a 2a 20 69  ngth of the.** i
35d0: 6e 70 75 74 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  nput string..*/.
35e0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
35f0: 6d 70 72 69 6e 74 66 5f 6e 28 0a 20 20 76 6f 69  mprintf_n(.  voi
3600: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
3610: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
3620: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
3630: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
3640: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
3650: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
3660: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
3670: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
3680: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
3690: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
36a0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
36b0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
36c0: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 53 74 72  .){.  char *zStr
36d0: 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  ;.  int n = 0;. 
36e0: 20 7a 53 74 72 20 3d 20 73 71 6c 69 74 65 33 5f   zStr = sqlite3_
36f0: 6d 70 72 69 6e 74 66 28 22 25 73 25 6e 22 2c 20  mprintf("%s%n", 
3700: 61 72 67 76 5b 31 5d 2c 20 26 6e 29 3b 0a 20 20  argv[1], &n);.  
3710: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 74  sqlite3_free(zSt
3720: 72 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  r);.  Tcl_SetObj
3730: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
3740: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 29 29  cl_NewIntObj(n))
3750: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
3760: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
3770: 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  e:  sqlite3_snpr
3780: 69 6e 74 66 5f 69 6e 74 20 20 53 49 5a 45 20 46  intf_int  SIZE F
3790: 4f 52 4d 41 54 20 20 49 4e 54 0a 2a 2a 0a 2a 2a  ORMAT  INT.**.**
37a0: 20 54 65 73 74 20 74 68 65 20 6f 66 20 73 71 6c   Test the of sql
37b0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 29 20  ite3_snprintf() 
37c0: 72 6f 75 74 69 6e 65 2e 20 20 53 49 5a 45 20 69  routine.  SIZE i
37d0: 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
37e0: 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66  e.** output buff
37f0: 65 72 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68  er in bytes.  Th
3800: 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 69  e maximum size i
3810: 73 20 31 30 30 2e 20 20 46 4f 52 4d 41 54 20 69  s 100.  FORMAT i
3820: 73 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 61 74 20  s the.** format 
3830: 73 74 72 69 6e 67 2e 20 20 49 4e 54 20 69 73 20  string.  INT is 
3840: 61 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72  a single integer
3850: 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 20   argument.  The 
3860: 46 4f 52 4d 41 54 0a 2a 2a 20 73 74 72 69 6e 67  FORMAT.** string
3870: 20 6d 75 73 74 20 72 65 71 75 69 72 65 20 6e 6f   must require no
3880: 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 69 73 20   more than this 
3890: 6f 6e 65 20 69 6e 74 65 67 65 72 20 61 72 67 75  one integer argu
38a0: 6d 65 6e 74 2e 20 20 49 66 0a 2a 2a 20 59 6f 75  ment.  If.** You
38b0: 20 70 61 73 73 20 69 6e 20 61 20 66 6f 72 6d 61   pass in a forma
38c0: 74 20 73 74 72 69 6e 67 20 74 68 61 74 20 72 65  t string that re
38d0: 71 75 69 72 65 73 20 6d 6f 72 65 20 74 68 61 6e  quires more than
38e0: 20 6f 6e 65 20 61 72 67 75 6d 65 6e 74 2c 0a 2a   one argument,.*
38f0: 2a 20 62 61 64 20 74 68 69 6e 67 73 20 77 69 6c  * bad things wil
3900: 6c 20 68 61 70 70 65 6e 2e 0a 2a 2f 0a 73 74 61  l happen..*/.sta
3910: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 6e 70  tic int test_snp
3920: 72 69 6e 74 66 5f 69 6e 74 28 0a 20 20 76 6f 69  rintf_int(.  voi
3930: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
3940: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
3950: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
3960: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
3970: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
3980: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
3990: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
39a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
39b0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
39c0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
39d0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
39e0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
39f0: 0a 29 7b 0a 20 20 63 68 61 72 20 7a 53 74 72 5b  .){.  char zStr[
3a00: 31 30 30 5d 3b 0a 20 20 69 6e 74 20 6e 20 3d 20  100];.  int n = 
3a10: 61 74 6f 69 28 61 72 67 76 5b 31 5d 29 3b 0a 20  atoi(argv[1]);. 
3a20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
3a30: 72 6d 61 74 20 3d 20 61 72 67 76 5b 32 5d 3b 0a  rmat = argv[2];.
3a40: 20 20 69 6e 74 20 61 31 20 3d 20 61 74 6f 69 28    int a1 = atoi(
3a50: 61 72 67 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20  argv[3]);.  if( 
3a60: 6e 3e 73 69 7a 65 6f 66 28 7a 53 74 72 29 20 29  n>sizeof(zStr) )
3a70: 20 6e 20 3d 20 73 69 7a 65 6f 66 28 7a 53 74 72   n = sizeof(zStr
3a80: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  );.  sqlite3_snp
3a90: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 53 74  rintf(sizeof(zSt
3aa0: 72 29 2c 20 7a 53 74 72 2c 20 22 61 62 63 64 65  r), zStr, "abcde
3ab0: 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
3ac0: 76 77 78 79 7a 22 29 3b 0a 20 20 73 71 6c 69 74  vwxyz");.  sqlit
3ad0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a  e3_snprintf(n, z
3ae0: 53 74 72 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 31  Str, zFormat, a1
3af0: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
3b00: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 53  esult(interp, zS
3b10: 74 72 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  tr, 0);.  return
3b20: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e   TCL_OK;.}..#ifn
3b30: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3b40: 47 45 54 5f 54 41 42 4c 45 0a 0a 2f 2a 0a 2a 2a  GET_TABLE../*.**
3b50: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
3b60: 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74  _get_table_print
3b70: 66 20 20 44 42 20 20 46 4f 52 4d 41 54 20 20 53  f  DB  FORMAT  S
3b80: 54 52 49 4e 47 20 20 3f 2d 2d 6e 6f 2d 63 6f 75  TRING  ?--no-cou
3b90: 6e 74 73 3f 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b  nts?.**.** Invok
3ba0: 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 67 65  e the sqlite3_ge
3bb0: 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 28 29  t_table_printf()
3bc0: 20 69 6e 74 65 72 66 61 63 65 20 75 73 69 6e 67   interface using
3bd0: 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
3be0: 73 65 0a 2a 2a 20 44 42 2e 20 20 54 68 65 20 53  se.** DB.  The S
3bf0: 51 4c 20 69 73 20 74 68 65 20 73 74 72 69 6e 67  QL is the string
3c00: 20 46 4f 52 4d 41 54 2e 20 20 54 68 65 20 66 6f   FORMAT.  The fo
3c10: 72 6d 61 74 20 73 74 72 69 6e 67 20 73 68 6f 75  rmat string shou
3c20: 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6f 6e  ld contain.** on
3c30: 65 20 25 73 20 6f 72 20 25 71 2e 20 20 53 54 52  e %s or %q.  STR
3c40: 49 4e 47 20 69 73 20 74 68 65 20 76 61 6c 75 65  ING is the value
3c50: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 25   inserted into %
3c60: 73 20 6f 72 20 25 71 2e 0a 2a 2f 0a 73 74 61 74  s or %q..*/.stat
3c70: 69 63 20 69 6e 74 20 74 65 73 74 5f 67 65 74 5f  ic int test_get_
3c80: 74 61 62 6c 65 5f 70 72 69 6e 74 66 28 0a 20 20  table_printf(.  
3c90: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
3ca0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
3cb0: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
3cc0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
3cd0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
3ce0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
3cf0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
3d00: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3d10: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
3d20: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
3d30: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
3d40: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
3d50: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
3d60: 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53 74 72   *db;.  Tcl_DStr
3d70: 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 72  ing str;.  int r
3d80: 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20  c;.  char *zErr 
3d90: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52 6f 77 2c  = 0;.  int nRow,
3da0: 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 2a   nCol;.  char **
3db0: 61 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 69  aResult;.  int i
3dc0: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30  ;.  char zBuf[30
3dd0: 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  ];.  char *zSql;
3de0: 0a 20 20 69 6e 74 20 72 65 73 43 6f 75 6e 74 20  .  int resCount 
3df0: 3d 20 2d 31 3b 0a 20 20 69 66 28 20 61 72 67 63  = -1;.  if( argc
3e00: 3d 3d 35 20 29 7b 0a 20 20 20 20 69 66 28 20 54  ==5 ){.    if( T
3e10: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
3e20: 2c 20 61 72 67 76 5b 34 5d 2c 20 26 72 65 73 43  , argv[4], &resC
3e30: 6f 75 6e 74 29 20 29 20 72 65 74 75 72 6e 20 54  ount) ) return T
3e40: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
3e50: 69 66 28 20 61 72 67 63 21 3d 34 20 26 26 20 61  if( argc!=4 && a
3e60: 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63  rgc!=5 ){.    Tc
3e70: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
3e80: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
3e90: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
3ea0: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
3eb0: 20 20 20 20 20 20 22 20 44 42 20 46 4f 52 4d 41        " DB FORMA
3ec0: 54 20 53 54 52 49 4e 47 20 3f 43 4f 55 4e 54 3f  T STRING ?COUNT?
3ed0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
3ee0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
3ef0: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
3f00: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
3f10: 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
3f20: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
3f30: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
3f40: 26 73 74 72 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  &str);.  zSql = 
3f50: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
3f60: 61 72 67 76 5b 32 5d 2c 61 72 67 76 5b 33 5d 29  argv[2],argv[3])
3f70: 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 35 20  ;.  if( argc==5 
3f80: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
3f90: 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 28 64 62  te3_get_table(db
3fa0: 2c 20 7a 53 71 6c 2c 20 26 61 52 65 73 75 6c 74  , zSql, &aResult
3fb0: 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 29 3b 0a  , 0, 0, &zErr);.
3fc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
3fd0: 3d 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61  = sqlite3_get_ta
3fe0: 62 6c 65 28 64 62 2c 20 7a 53 71 6c 2c 20 26 61  ble(db, zSql, &a
3ff0: 52 65 73 75 6c 74 2c 20 26 6e 52 6f 77 2c 20 26  Result, &nRow, &
4000: 6e 43 6f 6c 2c 20 26 7a 45 72 72 29 3b 0a 20 20  nCol, &zErr);.  
4010: 20 20 72 65 73 43 6f 75 6e 74 20 3d 20 28 6e 52    resCount = (nR
4020: 6f 77 2b 31 29 2a 6e 43 6f 6c 3b 0a 20 20 7d 0a  ow+1)*nCol;.  }.
4030: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
4040: 53 71 6c 29 3b 0a 20 20 73 70 72 69 6e 74 66 28  Sql);.  sprintf(
4050: 7a 42 75 66 2c 20 22 25 64 22 2c 20 72 63 29 3b  zBuf, "%d", rc);
4060: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65  .  Tcl_AppendEle
4070: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  ment(interp, zBu
4080: 66 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  f);.  if( rc==SQ
4090: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
40a0: 66 28 20 61 72 67 63 3d 3d 34 20 29 7b 0a 20 20  f( argc==4 ){.  
40b0: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66      sprintf(zBuf
40c0: 2c 20 22 25 64 22 2c 20 6e 52 6f 77 29 3b 0a 20  , "%d", nRow);. 
40d0: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 45       Tcl_AppendE
40e0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a  lement(interp, z
40f0: 42 75 66 29 3b 0a 20 20 20 20 20 20 73 70 72 69  Buf);.      spri
4100: 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20  ntf(zBuf, "%d", 
4110: 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 54 63 6c  nCol);.      Tcl
4120: 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  _AppendElement(i
4130: 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20  nterp, zBuf);.  
4140: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
4150: 20 69 3c 72 65 73 43 6f 75 6e 74 3b 20 69 2b 2b   i<resCount; i++
4160: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
4170: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
4180: 70 2c 20 61 52 65 73 75 6c 74 5b 69 5d 20 3f 20  p, aResult[i] ? 
4190: 61 52 65 73 75 6c 74 5b 69 5d 20 3a 20 22 4e 55  aResult[i] : "NU
41a0: 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  LL");.    }.  }e
41b0: 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  lse{.    Tcl_App
41c0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
41d0: 70 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20  p, zErr);.  }.  
41e0: 73 71 6c 69 74 65 33 5f 66 72 65 65 5f 74 61 62  sqlite3_free_tab
41f0: 6c 65 28 61 52 65 73 75 6c 74 29 3b 0a 20 20 69  le(aResult);.  i
4200: 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74 65  f( zErr ) sqlite
4210: 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20  3_free(zErr);.  
4220: 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
4230: 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
4240: 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
4250: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74  TCL_ERROR;.  ret
4260: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23  urn TCL_OK;.}..#
4270: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
4280: 4f 4d 49 54 5f 47 45 54 5f 54 41 42 4c 45 20 2a  OMIT_GET_TABLE *
4290: 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  /.../*.** Usage:
42a0: 20 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69    sqlite3_last_i
42b0: 6e 73 65 72 74 5f 72 6f 77 69 64 20 44 42 0a 2a  nsert_rowid DB.*
42c0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65  *.** Returns the
42d0: 20 69 6e 74 65 67 65 72 20 52 4f 57 49 44 20 6f   integer ROWID o
42e0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
42f0: 74 20 69 6e 73 65 72 74 2e 0a 2a 2f 0a 73 74 61  t insert..*/.sta
4300: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 61 73  tic int test_las
4310: 74 5f 72 6f 77 69 64 28 0a 20 20 76 6f 69 64 20  t_rowid(.  void 
4320: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
4330: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
4340: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
4350: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
4360: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
4370: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
4380: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
4390: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
43a0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
43b0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
43c0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
43d0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
43e0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
43f0: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d  .  char zBuf[30]
4400: 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  ;..  if( argc!=2
4410: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
4420: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
4430: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
4440: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
4450: 72 67 76 5b 30 5d 2c 20 22 20 44 42 5c 22 22 2c  rgv[0], " DB\"",
4460: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
4470: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
4480: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
4490: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
44a0: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
44b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 70   TCL_ERROR;.  sp
44c0: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 6c 6c  rintf(zBuf, "%ll
44d0: 64 22 2c 20 73 71 6c 69 74 65 33 5f 6c 61 73 74  d", sqlite3_last
44e0: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 64 62  _insert_rowid(db
44f0: 29 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  ));.  Tcl_Append
4500: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
4510: 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  Buf, 0);.  retur
4520: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
4530: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
4540: 6c 69 74 65 33 5f 6b 65 79 20 44 42 20 4b 45 59  lite3_key DB KEY
4550: 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63  .**.** Set the c
4560: 6f 64 65 63 20 6b 65 79 2e 0a 2a 2f 0a 73 74 61  odec key..*/.sta
4570: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6b 65 79  tic int test_key
4580: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
4590: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
45a0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
45b0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
45c0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
45d0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
45e0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
45f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4600: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
4610: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
4620: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4630: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
4640: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66 64 65  ment */.){.#ifde
4650: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4660: 45 43 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  EC.  sqlite3 *db
4670: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
4680: 7a 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4b 65 79  zKey;.  int nKey
4690: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
46a0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
46b0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
46c0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
46d0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
46e0: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
46f0: 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b  FILENAME\"", 0);
4700: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
4710: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
4720: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
4730: 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
4740: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
4750: 5f 45 52 52 4f 52 3b 0a 20 20 7a 4b 65 79 20 3d  _ERROR;.  zKey =
4760: 20 61 72 67 76 5b 32 5d 3b 0a 20 20 6e 4b 65 79   argv[2];.  nKey
4770: 20 3d 20 73 74 72 6c 65 6e 28 7a 4b 65 79 29 3b   = strlen(zKey);
4780: 0a 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 28 64  .  sqlite3_key(d
4790: 62 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a  b, zKey, nKey);.
47a0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
47b0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
47c0: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
47d0: 5f 72 65 6b 65 79 20 44 42 20 4b 45 59 0a 2a 2a  _rekey DB KEY.**
47e0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63  .** Change the c
47f0: 6f 64 65 63 20 6b 65 79 2e 0a 2a 2f 0a 73 74 61  odec key..*/.sta
4800: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 72 65 6b  tic int test_rek
4810: 65 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  ey(.  void *NotU
4820: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
4830: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
4840: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
4850: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
4860: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
4870: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
4880: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4890: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
48a0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
48b0: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
48c0: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
48d0: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66  gument */.){.#if
48e0: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
48f0: 4f 44 45 43 0a 20 20 73 71 6c 69 74 65 33 20 2a  ODEC.  sqlite3 *
4900: 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
4910: 20 2a 7a 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4b   *zKey;.  int nK
4920: 65 79 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  ey;.  if( argc!=
4930: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
4940: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
4950: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
4960: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
4970: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
4980: 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30  " FILENAME\"", 0
4990: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
49a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
49b0: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
49c0: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
49d0: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
49e0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4b 65 79  CL_ERROR;.  zKey
49f0: 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20 6e 4b   = argv[2];.  nK
4a00: 65 79 20 3d 20 73 74 72 6c 65 6e 28 7a 4b 65 79  ey = strlen(zKey
4a10: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 6b  );.  sqlite3_rek
4a20: 65 79 28 64 62 2c 20 7a 4b 65 79 2c 20 6e 4b 65  ey(db, zKey, nKe
4a30: 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  y);.#endif.  ret
4a40: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
4a50: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
4a60: 69 74 65 33 5f 63 6c 6f 73 65 20 44 42 0a 2a 2a  ite3_close DB.**
4a70: 0a 2a 2a 20 43 6c 6f 73 65 73 20 74 68 65 20 64  .** Closes the d
4a80: 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62  atabase opened b
4a90: 79 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 2e 0a  y sqlite3_open..
4aa0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
4ab0: 6c 69 74 65 5f 74 65 73 74 5f 63 6c 6f 73 65 28  lite_test_close(
4ac0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
4ad0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
4ae0: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
4af0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
4b00: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
4b10: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
4b20: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
4b30: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4b40: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
4b50: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
4b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
4b70: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
4b80: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ent */.){.  sqli
4b90: 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
4ba0: 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  c;.  if( argc!=2
4bb0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
4bc0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
4bd0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
4be0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
4bf0: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
4c00: 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29   FILENAME\"", 0)
4c10: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
4c20: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
4c30: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
4c40: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
4c50: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
4c60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
4c70: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62  sqlite3_close(db
4c80: 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  );.  Tcl_SetResu
4c90: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
4ca0: 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
4cb0: 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  c), TCL_STATIC);
4cc0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
4cd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
4ce0: 3a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  :  sqlite3_close
4cf0: 5f 76 32 20 44 42 0a 2a 2a 0a 2a 2a 20 43 6c 6f  _v2 DB.**.** Clo
4d00: 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ses the database
4d10: 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74   opened by sqlit
4d20: 65 33 5f 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74  e3_open..*/.stat
4d30: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f 74 65  ic int sqlite_te
4d40: 73 74 5f 63 6c 6f 73 65 5f 76 32 28 0a 20 20 76  st_close_v2(.  v
4d50: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
4d60: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
4d70: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
4d80: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
4d90: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
4da0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
4db0: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
4dc0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4dd0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
4de0: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
4df0: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
4e00: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
4e10: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
4e20: 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *db;.  int rc;. 
4e30: 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a   if( argc!=2 ){.
4e40: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
4e50: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
4e60: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
4e70: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
4e80: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c  0],.       " FIL
4e90: 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20  ENAME\"", 0);.  
4ea0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
4eb0: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
4ec0: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
4ed0: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
4ee0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
4ef0: 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
4f00: 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 64 62 29  te3_close_v2(db)
4f10: 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ;.  Tcl_SetResul
4f20: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
4f30: 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
4f40: 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
4f50: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
4f60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
4f70: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
4f80: 78 5f 63 6f 61 6c 65 73 63 65 28 29 20 66 75 6e  x_coalesce() fun
4f90: 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e  ction..** Return
4fa0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
4fb0: 65 6e 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67  ent non-NULL arg
4fc0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
4fd0: 20 76 6f 69 64 20 74 31 5f 69 66 6e 75 6c 6c 46   void t1_ifnullF
4fe0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
4ff0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
5000: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
5010: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
5020: 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  rgv.){.  int i;.
5030: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
5040: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  c; i++){.    if(
5050: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71   SQLITE_NULL!=sq
5060: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
5070: 28 61 72 67 76 5b 69 5d 29 20 29 7b 0a 20 20 20  (argv[i]) ){.   
5080: 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74     int n = sqlit
5090: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
50a0: 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73  rgv[i]);.      s
50b0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
50c0: 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61  xt(context, (cha
50d0: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
50e0: 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29 2c 0a  _text(argv[i]),.
50f0: 20 20 20 20 20 20 20 20 20 20 6e 2c 20 53 51 4c            n, SQL
5100: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
5110: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5120: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
5130: 54 68 65 73 65 20 61 72 65 20 74 65 73 74 20 66  These are test f
5140: 75 6e 63 74 69 6f 6e 73 2e 20 20 20 20 68 65 78  unctions.    hex
5150: 38 28 29 20 69 6e 74 65 72 70 72 65 74 73 20 69  8() interprets i
5160: 74 73 20 61 72 67 75 6d 65 6e 74 20 61 73 0a 2a  ts argument as.*
5170: 2a 20 55 54 46 38 20 61 6e 64 20 72 65 74 75 72  * UTF8 and retur
5180: 6e 73 20 61 20 68 65 78 20 65 6e 63 6f 64 69 6e  ns a hex encodin
5190: 67 2e 20 20 68 65 78 31 36 6c 65 28 29 20 69 6e  g.  hex16le() in
51a0: 74 65 72 70 72 65 74 73 20 69 74 73 20 61 72 67  terprets its arg
51b0: 75 6d 65 6e 74 0a 2a 2a 20 61 73 20 55 54 46 31  ument.** as UTF1
51c0: 36 6c 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20  6le and returns 
51d0: 61 20 68 65 78 20 65 6e 63 6f 64 69 6e 67 2e 0a  a hex encoding..
51e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  */.static void h
51f0: 65 78 38 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  ex8Func(sqlite3_
5200: 63 6f 6e 74 65 78 74 20 2a 70 2c 20 69 6e 74 20  context *p, int 
5210: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
5220: 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63  lue **argv){.  c
5230: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
5240: 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 69 3b 0a  ar *z;.  int i;.
5250: 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d    char zBuf[200]
5260: 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  z = sqlite3_
5270: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
5280: 30 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  0]);.  for(i=0; 
5290: 69 3c 73 69 7a 65 6f 66 28 7a 42 75 66 29 2f 32  i<sizeof(zBuf)/2
52a0: 20 2d 20 32 20 26 26 20 7a 5b 69 5d 3b 20 69 2b   - 2 && z[i]; i+
52b0: 2b 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28  +){.    sprintf(
52c0: 26 7a 42 75 66 5b 69 2a 32 5d 2c 20 22 25 30 32  &zBuf[i*2], "%02
52d0: 78 22 2c 20 7a 5b 69 5d 26 30 78 66 66 29 3b 0a  x", z[i]&0xff);.
52e0: 20 20 7d 0a 20 20 7a 42 75 66 5b 69 2a 32 5d 20    }.  zBuf[i*2] 
52f0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  = 0;.  sqlite3_r
5300: 65 73 75 6c 74 5f 74 65 78 74 28 70 2c 20 28 63  esult_text(p, (c
5310: 68 61 72 2a 29 7a 42 75 66 2c 20 2d 31 2c 20 53  har*)zBuf, -1, S
5320: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
5330: 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ;.}.#ifndef SQLI
5340: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 73 74  TE_OMIT_UTF16.st
5350: 61 74 69 63 20 76 6f 69 64 20 68 65 78 31 36 46  atic void hex16F
5360: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
5370: 65 78 74 20 2a 70 2c 20 69 6e 74 20 61 72 67 63  ext *p, int argc
5380: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
5390: 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74  **argv){.  const
53a0: 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20   unsigned short 
53b0: 69 6e 74 20 2a 7a 3b 0a 20 20 69 6e 74 20 69 3b  int *z;.  int i;
53c0: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 34 30 30  .  char zBuf[400
53d0: 5d 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  ];.  z = sqlite3
53e0: 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 61 72  _value_text16(ar
53f0: 67 76 5b 30 5d 29 3b 0a 20 20 66 6f 72 28 69 3d  gv[0]);.  for(i=
5400: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 42 75 66  0; i<sizeof(zBuf
5410: 29 2f 34 20 2d 20 34 20 26 26 20 7a 5b 69 5d 3b  )/4 - 4 && z[i];
5420: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 70 72 69 6e   i++){.    sprin
5430: 74 66 28 26 7a 42 75 66 5b 69 2a 34 5d 2c 20 22  tf(&zBuf[i*4], "
5440: 25 30 34 78 22 2c 20 7a 5b 69 5d 26 30 78 66 66  %04x", z[i]&0xff
5450: 29 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 69 2a  );.  }.  zBuf[i*
5460: 34 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  4] = 0;.  sqlite
5470: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 2c  3_result_text(p,
5480: 20 28 63 68 61 72 2a 29 7a 42 75 66 2c 20 2d 31   (char*)zBuf, -1
5490: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
54a0: 4e 54 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  NT);.}.#endif../
54b0: 2a 0a 2a 2a 20 41 20 73 74 72 75 63 74 75 72 65  *.** A structure
54c0: 20 69 6e 74 6f 20 77 68 69 63 68 20 74 6f 20 61   into which to a
54d0: 63 63 75 6d 75 6c 61 74 65 20 74 65 78 74 2e 0a  ccumulate text..
54e0: 2a 2f 0a 73 74 72 75 63 74 20 64 73 74 72 20 7b  */.struct dstr {
54f0: 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20  .  int nAlloc;  
5500: 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74  /* Space allocat
5510: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 73 65  ed */.  int nUse
5520: 64 3b 20 20 20 2f 2a 20 53 70 61 63 65 20 75 73  d;   /* Space us
5530: 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b  ed */.  char *z;
5540: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 61 63       /* The spac
5550: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  e */.};../*.** A
5560: 70 70 65 6e 64 20 74 65 78 74 20 74 6f 20 61 20  ppend text to a 
5570: 64 73 74 72 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dstr.*/.static v
5580: 6f 69 64 20 64 73 74 72 41 70 70 65 6e 64 28 73  oid dstrAppend(s
5590: 74 72 75 63 74 20 64 73 74 72 20 2a 70 2c 20 63  truct dstr *p, c
55a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
55b0: 74 20 64 69 76 69 64 65 72 29 7b 0a 20 20 69 6e  t divider){.  in
55c0: 74 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  t n = (int)strle
55d0: 6e 28 7a 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  n(z);.  if( p->n
55e0: 55 73 65 64 20 2b 20 6e 20 2b 20 32 20 3e 20 70  Used + n + 2 > p
55f0: 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
5600: 63 68 61 72 20 2a 7a 4e 65 77 3b 0a 20 20 20 20  char *zNew;.    
5610: 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e  p->nAlloc = p->n
5620: 41 6c 6c 6f 63 2a 32 20 2b 20 6e 20 2b 20 32 30  Alloc*2 + n + 20
5630: 30 3b 0a 20 20 20 20 7a 4e 65 77 20 3d 20 73 71  0;.    zNew = sq
5640: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 2d  lite3_realloc(p-
5650: 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a  >z, p->nAlloc);.
5660: 20 20 20 20 69 66 28 20 7a 4e 65 77 3d 3d 30 20      if( zNew==0 
5670: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5680: 5f 66 72 65 65 28 70 2d 3e 7a 29 3b 0a 20 20 20  _free(p->z);.   
5690: 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20     memset(p, 0, 
56a0: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 20  sizeof(*p));.   
56b0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
56c0: 0a 20 20 20 20 70 2d 3e 7a 20 3d 20 7a 4e 65 77  .    p->z = zNew
56d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 69 76 69  ;.  }.  if( divi
56e0: 64 65 72 20 26 26 20 70 2d 3e 6e 55 73 65 64 3e  der && p->nUsed>
56f0: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 7a 5b 70 2d  0 ){.    p->z[p-
5700: 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20 64 69 76 69  >nUsed++] = divi
5710: 64 65 72 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70  der;.  }.  memcp
5720: 79 28 26 70 2d 3e 7a 5b 70 2d 3e 6e 55 73 65 64  y(&p->z[p->nUsed
5730: 5d 2c 20 7a 2c 20 6e 2b 31 29 3b 0a 20 20 70 2d  ], z, n+1);.  p-
5740: 3e 6e 55 73 65 64 20 2b 3d 20 6e 3b 0a 7d 0a 0a  >nUsed += n;.}..
5750: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 64 20 66 6f  /*.** Invoked fo
5760: 72 20 65 61 63 68 20 63 61 6c 6c 62 61 63 6b 20  r each callback 
5770: 66 72 6f 6d 20 73 71 6c 69 74 65 33 45 78 65 63  from sqlite3Exec
5780: 46 75 6e 63 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Func.*/.static i
5790: 6e 74 20 65 78 65 63 46 75 6e 63 43 61 6c 6c 62  nt execFuncCallb
57a0: 61 63 6b 28 76 6f 69 64 20 2a 70 44 61 74 61 2c  ack(void *pData,
57b0: 20 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20   int argc, char 
57c0: 2a 2a 61 72 67 76 2c 20 63 68 61 72 20 2a 2a 4e  **argv, char **N
57d0: 6f 74 55 73 65 64 29 7b 0a 20 20 73 74 72 75 63  otUsed){.  struc
57e0: 74 20 64 73 74 72 20 2a 70 20 3d 20 28 73 74 72  t dstr *p = (str
57f0: 75 63 74 20 64 73 74 72 2a 29 70 44 61 74 61 3b  uct dstr*)pData;
5800: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
5810: 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  i=0; i<argc; i++
5820: 29 7b 0a 20 20 20 20 69 66 28 20 61 72 67 76 5b  ){.    if( argv[
5830: 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64  i]==0 ){.      d
5840: 73 74 72 41 70 70 65 6e 64 28 70 2c 20 22 4e 55  strAppend(p, "NU
5850: 4c 4c 22 2c 20 27 20 27 29 3b 0a 20 20 20 20 7d  LL", ' ');.    }
5860: 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 73 74 72  else{.      dstr
5870: 41 70 70 65 6e 64 28 70 2c 20 61 72 67 76 5b 69  Append(p, argv[i
5880: 5d 2c 20 27 20 27 29 3b 0a 20 20 20 20 7d 0a 20  ], ' ');.    }. 
5890: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
58a0: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
58b0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 78 5f  tation of the x_
58c0: 73 71 6c 69 74 65 5f 65 78 65 63 28 29 20 66 75  sqlite_exec() fu
58d0: 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 66 75  nction.  This fu
58e0: 6e 63 74 69 6f 6e 20 74 61 6b 65 73 0a 2a 2a 20  nction takes.** 
58f0: 61 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e  a single argumen
5900: 74 20 61 6e 64 20 61 74 74 65 6d 70 74 73 20 74  t and attempts t
5910: 6f 20 65 78 65 63 75 74 65 20 74 68 61 74 20 61  o execute that a
5920: 72 67 75 6d 65 6e 74 20 61 73 20 53 51 4c 20 63  rgument as SQL c
5930: 6f 64 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  ode..** This is 
5940: 69 6c 6c 65 67 61 6c 20 61 6e 64 20 73 68 6f 75  illegal and shou
5950: 6c 64 20 73 65 74 20 74 68 65 20 53 51 4c 49 54  ld set the SQLIT
5960: 45 5f 4d 49 53 55 53 45 20 66 6c 61 67 20 6f 6e  E_MISUSE flag on
5970: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
5980: 2a 0a 2a 2a 20 32 30 30 34 2d 4a 61 6e 2d 30 37  *.** 2004-Jan-07
5990: 3a 20 20 57 65 20 68 61 76 65 20 63 68 61 6e 67  :  We have chang
59a0: 65 64 20 74 68 69 73 20 74 6f 20 6d 61 6b 65 20  ed this to make 
59b0: 69 74 20 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c  it legal to call
59c0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 0a   sqlite3_exec().
59d0: 2a 2a 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61  ** from within a
59e0: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 20   function call. 
59f0: 20 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f   .** .** This ro
5a00: 75 74 69 6e 65 20 73 69 6d 75 6c 61 74 65 73 20  utine simulates 
5a10: 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 68 61  the effect of ha
5a20: 76 69 6e 67 20 74 77 6f 20 74 68 72 65 61 64 73  ving two threads
5a30: 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 75   attempt to.** u
5a40: 73 65 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  se the same data
5a50: 62 61 73 65 20 61 74 20 74 68 65 20 73 61 6d 65  base at the same
5a60: 20 74 69 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   time..*/.static
5a70: 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 65   void sqlite3Exe
5a80: 63 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  cFunc(.  sqlite3
5a90: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
5aa0: 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20  t, .  int argc, 
5ab0: 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   .  sqlite3_valu
5ac0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 74  e **argv.){.  st
5ad0: 72 75 63 74 20 64 73 74 72 20 78 3b 0a 20 20 6d  ruct dstr x;.  m
5ae0: 65 6d 73 65 74 28 26 78 2c 20 30 2c 20 73 69 7a  emset(&x, 0, siz
5af0: 65 6f 66 28 78 29 29 3b 0a 20 20 28 76 6f 69 64  eof(x));.  (void
5b00: 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28 28 73  )sqlite3_exec((s
5b10: 71 6c 69 74 65 33 2a 29 73 71 6c 69 74 65 33 5f  qlite3*)sqlite3_
5b20: 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78  user_data(contex
5b30: 74 29 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  t),.      (char*
5b40: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
5b50: 65 78 74 28 61 72 67 76 5b 30 5d 29 2c 0a 20 20  ext(argv[0]),.  
5b60: 20 20 20 20 65 78 65 63 46 75 6e 63 43 61 6c 6c      execFuncCall
5b70: 62 61 63 6b 2c 20 26 78 2c 20 30 29 3b 0a 20 20  back, &x, 0);.  
5b80: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
5b90: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 78 2e 7a  ext(context, x.z
5ba0: 2c 20 78 2e 6e 55 73 65 64 2c 20 53 51 4c 49 54  , x.nUsed, SQLIT
5bb0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
5bc0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 78 2e 7a  sqlite3_free(x.z
5bd0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  );.}../*.** Impl
5be0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 6b  ementation of tk
5bf0: 74 32 32 31 33 66 75 6e 63 28 29 2c 20 61 20 73  t2213func(), a s
5c00: 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 74  calar function t
5c10: 68 61 74 20 74 61 6b 65 73 20 65 78 61 63 74 6c  hat takes exactl
5c20: 79 0a 2a 2a 20 6f 6e 65 20 61 72 67 75 6d 65 6e  y.** one argumen
5c30: 74 2e 20 49 74 20 68 61 73 20 74 77 6f 20 69 6e  t. It has two in
5c40: 74 65 72 65 73 74 69 6e 67 20 66 65 61 74 75 72  teresting featur
5c50: 65 73 3a 0a 2a 2a 0a 2a 2a 20 2a 20 49 74 20 63  es:.**.** * It c
5c60: 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f 76 61 6c  alls sqlite3_val
5c70: 75 65 5f 74 65 78 74 28 29 20 33 20 74 69 6d 65  ue_text() 3 time
5c80: 73 20 6f 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  s on the argumen
5c90: 74 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  t sqlite3_value*
5ca0: 2e 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 74 68  ..**   If the th
5cb0: 72 65 65 20 70 6f 69 6e 74 65 72 73 20 72 65 74  ree pointers ret
5cc0: 75 72 6e 65 64 20 61 72 65 20 6e 6f 74 20 74 68  urned are not th
5cd0: 65 20 73 61 6d 65 20 61 6e 20 53 51 4c 20 65 72  e same an SQL er
5ce0: 72 6f 72 20 69 73 20 72 61 69 73 65 64 2e 0a 2a  ror is raised..*
5cf0: 2a 0a 2a 2a 20 2a 20 4f 74 68 65 72 77 69 73 65  *.** * Otherwise
5d00: 20 69 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f   it returns a co
5d10: 70 79 20 6f 66 20 74 68 65 20 74 65 78 74 20 72  py of the text r
5d20: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
5d30: 20 69 74 73 20 0a 2a 2a 20 20 20 61 72 67 75 6d   its .**   argum
5d40: 65 6e 74 20 69 6e 20 73 75 63 68 20 61 20 77 61  ent in such a wa
5d50: 79 20 61 73 20 74 68 65 20 56 44 42 45 20 72 65  y as the VDBE re
5d60: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 73 20  presentation is 
5d70: 61 20 4d 65 6d 2a 20 63 65 6c 6c 20 0a 2a 2a 20  a Mem* cell .** 
5d80: 20 20 77 69 74 68 20 74 68 65 20 4d 45 4d 5f 54    with the MEM_T
5d90: 65 72 6d 20 66 6c 61 67 20 63 6c 65 61 72 2e 20  erm flag clear. 
5da0: 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23 32  .**.** Ticket #2
5db0: 32 31 33 20 63 61 6e 20 74 68 65 72 65 66 6f 72  213 can therefor
5dc0: 65 20 62 65 20 74 65 73 74 65 64 20 62 79 20 65  e be tested by e
5dd0: 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 66 6f  valuating the fo
5de0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 53 51 4c 20 65  llowing.** SQL e
5df0: 78 70 72 65 73 73 69 6f 6e 3a 0a 2a 2a 0a 2a 2a  xpression:.**.**
5e00: 20 20 20 74 6b 74 32 32 31 33 66 75 6e 63 28 74     tkt2213func(t
5e10: 6b 74 32 32 31 33 66 75 6e 63 28 27 61 20 73 74  kt2213func('a st
5e20: 72 69 6e 67 27 29 29 3b 0a 2a 2f 0a 73 74 61 74  ring'));.*/.stat
5e30: 69 63 20 76 6f 69 64 20 74 6b 74 32 32 31 33 46  ic void tkt2213F
5e40: 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  unction(.  sqlit
5e50: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
5e60: 65 78 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63  ext, .  int argc
5e70: 2c 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  ,  .  sqlite3_va
5e80: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
5e90: 69 6e 74 20 6e 54 65 78 74 3b 0a 20 20 75 6e 73  int nText;.  uns
5ea0: 69 67 6e 65 64 20 63 68 61 72 20 63 6f 6e 73 74  igned char const
5eb0: 20 2a 7a 54 65 78 74 31 3b 0a 20 20 75 6e 73 69   *zText1;.  unsi
5ec0: 67 6e 65 64 20 63 68 61 72 20 63 6f 6e 73 74 20  gned char const 
5ed0: 2a 7a 54 65 78 74 32 3b 0a 20 20 75 6e 73 69 67  *zText2;.  unsig
5ee0: 6e 65 64 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ned char const *
5ef0: 7a 54 65 78 74 33 3b 0a 0a 20 20 6e 54 65 78 74  zText3;..  nText
5f00: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
5f10: 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b  _bytes(argv[0]);
5f20: 0a 20 20 7a 54 65 78 74 31 20 3d 20 73 71 6c 69  .  zText1 = sqli
5f30: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
5f40: 72 67 76 5b 30 5d 29 3b 0a 20 20 7a 54 65 78 74  rgv[0]);.  zText
5f50: 32 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  2 = sqlite3_valu
5f60: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
5f70: 0a 20 20 7a 54 65 78 74 33 20 3d 20 73 71 6c 69  .  zText3 = sqli
5f80: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
5f90: 72 67 76 5b 30 5d 29 3b 0a 0a 20 20 69 66 28 20  rgv[0]);..  if( 
5fa0: 7a 54 65 78 74 31 21 3d 7a 54 65 78 74 32 20 7c  zText1!=zText2 |
5fb0: 7c 20 7a 54 65 78 74 32 21 3d 7a 54 65 78 74 33  | zText2!=zText3
5fc0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
5fd0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
5fe0: 74 65 78 74 2c 20 22 74 6b 74 32 32 31 33 20 69  text, "tkt2213 i
5ff0: 73 20 6e 6f 74 20 66 69 78 65 64 22 2c 20 2d 31  s not fixed", -1
6000: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
6010: 63 68 61 72 20 2a 7a 43 6f 70 79 20 3d 20 28 63  char *zCopy = (c
6020: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  har *)sqlite3_ma
6030: 6c 6c 6f 63 28 6e 54 65 78 74 29 3b 0a 20 20 20  lloc(nText);.   
6040: 20 6d 65 6d 63 70 79 28 7a 43 6f 70 79 2c 20 7a   memcpy(zCopy, z
6050: 54 65 78 74 31 2c 20 6e 54 65 78 74 29 3b 0a 20  Text1, nText);. 
6060: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
6070: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
6080: 7a 43 6f 70 79 2c 20 6e 54 65 78 74 2c 20 73 71  zCopy, nText, sq
6090: 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d  lite3_free);.  }
60a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
60b0: 6c 6c 6f 77 69 6e 67 20 53 51 4c 20 66 75 6e 63  llowing SQL func
60c0: 74 69 6f 6e 20 74 61 6b 65 73 20 34 20 61 72 67  tion takes 4 arg
60d0: 75 6d 65 6e 74 73 2e 20 20 54 68 65 20 32 6e 64  uments.  The 2nd
60e0: 20 61 6e 64 0a 2a 2a 20 34 74 68 20 61 72 67 75   and.** 4th argu
60f0: 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 6f 6e 65  ment must be one
6100: 20 6f 66 20 74 68 65 73 65 20 73 74 72 69 6e 67   of these string
6110: 73 3a 20 20 27 74 65 78 74 27 2c 20 27 74 65 78  s:  'text', 'tex
6120: 74 31 36 27 2c 0a 2a 2a 20 6f 72 20 27 62 6c 6f  t16',.** or 'blo
6130: 62 27 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  b' corresponding
6140: 20 74 6f 20 41 50 49 20 66 75 6e 63 74 69 6f 6e   to API function
6150: 73 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c  s.**.**      sql
6160: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
6170: 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
6180: 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 29  3_value_text16()
6190: 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
61a0: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 29 0a 2a 2a  _value_blob().**
61b0: 0a 2a 2a 20 54 68 65 20 74 68 69 72 64 20 61 72  .** The third ar
61c0: 67 75 6d 65 6e 74 20 69 73 20 61 20 73 74 72 69  gument is a stri
61d0: 6e 67 2c 20 65 69 74 68 65 72 20 27 62 79 74 65  ng, either 'byte
61e0: 73 27 20 6f 72 20 27 62 79 74 65 73 31 36 27 20  s' or 'bytes16' 
61f0: 6f 72 20 27 6e 6f 6f 70 27 2c 0a 2a 2a 20 63 6f  or 'noop',.** co
6200: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 41  rresponding to A
6210: 50 49 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  PIs:.**.**      
6220: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
6230: 74 65 73 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  tes().**      sq
6240: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
6250: 73 31 36 28 29 0a 2a 2a 20 20 20 20 20 20 6e 6f  s16().**      no
6260: 6f 70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 41 50 49  op.**.** The API
6270: 73 20 64 65 73 69 67 6e 61 74 65 64 20 62 79 20  s designated by 
6280: 74 68 65 20 32 6e 64 20 74 68 72 6f 75 67 68 20  the 2nd through 
6290: 34 74 68 20 61 72 67 75 6d 65 6e 74 73 20 61 72  4th arguments ar
62a0: 65 20 61 70 70 6c 69 65 64 0a 2a 2a 20 74 6f 20  e applied.** to 
62b0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
62c0: 6e 74 20 69 6e 20 6f 72 64 65 72 2e 20 20 49 66  nt in order.  If
62d0: 20 74 68 65 20 70 6f 69 6e 74 65 72 73 20 72 65   the pointers re
62e0: 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a  turned by the.**
62f0: 20 73 65 63 6f 6e 64 20 61 6e 64 20 66 6f 75 72   second and four
6300: 74 68 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  th are different
6310: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
6320: 65 74 75 72 6e 73 20 31 2e 20 20 4f 74 68 65 72  eturns 1.  Other
6330: 77 69 73 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f  wise,.** this ro
6340: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 30 2e  utine returns 0.
6350: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
6360: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
6370: 74 65 73 74 20 74 6f 20 73 65 65 20 77 68 65 6e  test to see when
6380: 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65   returned pointe
6390: 72 73 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 5f  rs from.** the _
63a0: 74 65 78 74 28 29 2c 20 5f 74 65 78 74 31 36 28  text(), _text16(
63b0: 29 20 61 6e 64 20 5f 62 6c 6f 62 28 29 20 41 50  ) and _blob() AP
63c0: 49 73 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69  Is become invali
63d0: 64 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  dated..*/.static
63e0: 20 76 6f 69 64 20 70 74 72 43 68 6e 67 46 75 6e   void ptrChngFun
63f0: 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ction(.  sqlite3
6400: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
6410: 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20  t, .  int argc, 
6420: 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   .  sqlite3_valu
6430: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f  e **argv.){.  co
6440: 6e 73 74 20 76 6f 69 64 20 2a 70 31 2c 20 2a 70  nst void *p1, *p
6450: 32 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  2;.  const char 
6460: 2a 7a 43 6d 64 3b 0a 20 20 69 66 28 20 61 72 67  *zCmd;.  if( arg
6470: 63 21 3d 34 20 29 20 72 65 74 75 72 6e 3b 0a 20  c!=4 ) return;. 
6480: 20 7a 43 6d 64 20 3d 20 28 63 6f 6e 73 74 20 63   zCmd = (const c
6490: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
64a0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
64b0: 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20  ;.  if( zCmd==0 
64c0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
64d0: 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22 74 65 78  strcmp(zCmd,"tex
64e0: 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 31  t")==0 ){.    p1
64f0: 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29   = (const void*)
6500: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
6510: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 23 69 66  xt(argv[0]);.#if
6520: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6530: 5f 55 54 46 31 36 0a 20 20 7d 65 6c 73 65 20 69  _UTF16.  }else i
6540: 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20  f( strcmp(zCmd, 
6550: 22 74 65 78 74 31 36 22 29 3d 3d 30 20 29 7b 0a  "text16")==0 ){.
6560: 20 20 20 20 70 31 20 3d 20 28 63 6f 6e 73 74 20      p1 = (const 
6570: 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61  void*)sqlite3_va
6580: 6c 75 65 5f 74 65 78 74 31 36 28 61 72 67 76 5b  lue_text16(argv[
6590: 30 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  0]);.#endif.  }e
65a0: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
65b0: 43 6d 64 2c 20 22 62 6c 6f 62 22 29 3d 3d 30 20  Cmd, "blob")==0 
65c0: 29 7b 0a 20 20 20 20 70 31 20 3d 20 28 63 6f 6e  ){.    p1 = (con
65d0: 73 74 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  st void*)sqlite3
65e0: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76  _value_blob(argv
65f0: 5b 30 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  [0]);.  }else{. 
6600: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
6610: 20 7a 43 6d 64 20 3d 20 28 63 6f 6e 73 74 20 63   zCmd = (const c
6620: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
6630: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 32 5d 29  ue_text(argv[2])
6640: 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20  ;.  if( zCmd==0 
6650: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
6660: 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22 62 79 74  strcmp(zCmd,"byt
6670: 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  es")==0 ){.    s
6680: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
6690: 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 23 69 66  es(argv[0]);.#if
66a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
66b0: 5f 55 54 46 31 36 0a 20 20 7d 65 6c 73 65 20 69  _UTF16.  }else i
66c0: 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20  f( strcmp(zCmd, 
66d0: 22 62 79 74 65 73 31 36 22 29 3d 3d 30 20 29 7b  "bytes16")==0 ){
66e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  .    sqlite3_val
66f0: 75 65 5f 62 79 74 65 73 31 36 28 61 72 67 76 5b  ue_bytes16(argv[
6700: 30 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  0]);.#endif.  }e
6710: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
6720: 43 6d 64 2c 20 22 6e 6f 6f 70 22 29 3d 3d 30 20  Cmd, "noop")==0 
6730: 29 7b 0a 20 20 20 20 2f 2a 20 64 6f 20 6e 6f 74  ){.    /* do not
6740: 68 69 6e 67 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  hing */.  }else{
6750: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
6760: 0a 20 20 7a 43 6d 64 20 3d 20 28 63 6f 6e 73 74  .  zCmd = (const
6770: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
6780: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 33  alue_text(argv[3
6790: 5d 29 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d  ]);.  if( zCmd==
67a0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
67b0: 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22 74  ( strcmp(zCmd,"t
67c0: 65 78 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ext")==0 ){.    
67d0: 70 32 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64  p2 = (const void
67e0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
67f0: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 23  text(argv[0]);.#
6800: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6810: 49 54 5f 55 54 46 31 36 0a 20 20 7d 65 6c 73 65  IT_UTF16.  }else
6820: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64   if( strcmp(zCmd
6830: 2c 20 22 74 65 78 74 31 36 22 29 3d 3d 30 20 29  , "text16")==0 )
6840: 7b 0a 20 20 20 20 70 32 20 3d 20 28 63 6f 6e 73  {.    p2 = (cons
6850: 74 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f  t void*)sqlite3_
6860: 76 61 6c 75 65 5f 74 65 78 74 31 36 28 61 72 67  value_text16(arg
6870: 76 5b 30 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20  v[0]);.#endif.  
6880: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
6890: 28 7a 43 6d 64 2c 20 22 62 6c 6f 62 22 29 3d 3d  (zCmd, "blob")==
68a0: 30 20 29 7b 0a 20 20 20 20 70 32 20 3d 20 28 63  0 ){.    p2 = (c
68b0: 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c 69 74  onst void*)sqlit
68c0: 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72  e3_value_blob(ar
68d0: 67 76 5b 30 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b  gv[0]);.  }else{
68e0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
68f0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
6900: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 70  t_int(context, p
6910: 31 21 3d 70 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  1!=p2);.}../*.**
6920: 20 54 68 69 73 20 53 51 4c 20 66 75 6e 63 74 69   This SQL functi
6930: 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 64 69 66  on returns a dif
6940: 66 65 72 65 6e 74 20 61 6e 73 77 65 72 20 65 61  ferent answer ea
6950: 63 68 20 74 69 6d 65 20 69 74 20 69 73 20 63 61  ch time it is ca
6960: 6c 6c 65 64 2c 20 65 76 65 6e 20 69 66 0a 2a 2a  lled, even if.**
6970: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 61   the arguments a
6980: 72 65 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a  re the same..*/.
6990: 73 74 61 74 69 63 20 76 6f 69 64 20 6e 6f 6e 64  static void nond
69a0: 65 74 65 72 6d 69 6e 69 73 74 69 63 46 75 6e 63  eterministicFunc
69b0: 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  tion(.  sqlite3_
69c0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
69d0: 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  , .  int argc,  
69e0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
69f0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 74 61   **argv.){.  sta
6a00: 74 69 63 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  tic int cnt = 0;
6a10: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
6a20: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 63  t_int(context, c
6a30: 6e 74 2b 2b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nt++);.}../*.** 
6a40: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
6a50: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20  create_function 
6a60: 44 42 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68  DB.**.** Call th
6a70: 65 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  e sqlite3_create
6a80: 5f 66 75 6e 63 74 69 6f 6e 20 41 50 49 20 6f 6e  _function API on
6a90: 20 74 68 65 20 67 69 76 65 6e 20 64 61 74 61 62   the given datab
6aa0: 61 73 65 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20  ase in order.** 
6ab0: 74 6f 20 63 72 65 61 74 65 20 61 20 66 75 6e 63  to create a func
6ac0: 74 69 6f 6e 20 6e 61 6d 65 64 20 22 78 5f 63 6f  tion named "x_co
6ad0: 61 6c 65 73 63 65 22 2e 20 20 54 68 69 73 20 66  alesce".  This f
6ae0: 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65  unction does the
6af0: 20 73 61 6d 65 20 74 68 69 6e 67 0a 2a 2a 20 61   same thing.** a
6b00: 73 20 74 68 65 20 22 63 6f 61 6c 65 73 63 65 22  s the "coalesce"
6b10: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73   function.  This
6b20: 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 72   function also r
6b30: 65 67 69 73 74 65 72 73 20 61 6e 20 53 51 4c 20  egisters an SQL 
6b40: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6e 61 6d 65  function.** name
6b50: 64 20 22 78 5f 73 71 6c 69 74 65 5f 65 78 65 63  d "x_sqlite_exec
6b60: 22 20 74 68 61 74 20 69 6e 76 6f 6b 65 73 20 73  " that invokes s
6b70: 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 20 20  qlite3_exec().  
6b80: 49 6e 76 6f 6b 69 6e 67 20 73 71 6c 69 74 65 33  Invoking sqlite3
6b90: 5f 65 78 65 63 28 29 0a 2a 2a 20 69 6e 20 74 68  _exec().** in th
6ba0: 69 73 20 77 61 79 20 69 73 20 69 6c 6c 65 67 61  is way is illega
6bb0: 6c 20 72 65 63 75 72 73 69 6f 6e 20 61 6e 64 20  l recursion and 
6bc0: 73 68 6f 75 6c 64 20 72 61 69 73 65 20 61 6e 20  should raise an 
6bd0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 65 72  SQLITE_MISUSE er
6be0: 72 6f 72 2e 0a 2a 2a 20 54 68 65 20 65 66 66 65  ror..** The effe
6bf0: 63 74 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  ct is similar to
6c00: 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74   trying to use t
6c10: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
6c20: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 72 6f 6d   connection from
6c30: 0a 2a 2a 20 74 77 6f 20 74 68 72 65 61 64 73 20  .** two threads 
6c40: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
6c50: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67  ..**.** The orig
6c60: 69 6e 61 6c 20 6d 6f 74 69 76 61 74 69 6f 6e 20  inal motivation 
6c70: 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  for this routine
6c80: 20 77 61 73 20 74 6f 20 62 65 20 61 62 6c 65 20   was to be able 
6c90: 74 6f 20 63 61 6c 6c 20 74 68 65 0a 2a 2a 20 73  to call the.** s
6ca0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
6cb0: 6e 63 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  nction function 
6cc0: 77 68 69 6c 65 20 61 20 71 75 65 72 79 20 69 73  while a query is
6cd0: 20 69 6e 20 70 72 6f 67 72 65 73 73 20 69 6e 20   in progress in 
6ce0: 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 74 65 73 74  order.** to test
6cf0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 49 53 55   the SQLITE_MISU
6d00: 53 45 20 64 65 74 65 63 74 69 6f 6e 20 6c 6f 67  SE detection log
6d10: 69 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ic..*/.static in
6d20: 74 20 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75  t test_create_fu
6d30: 6e 63 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a  nction(.  void *
6d40: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
6d50: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
6d60: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
6d70: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
6d80: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
6d90: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
6da0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
6db0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
6dc0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
6dd0: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
6de0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
6df0: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
6e00: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
6e10: 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28  ite3 *db;..  if(
6e20: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
6e30: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
6e40: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
6e50: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
6e60: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
6e70: 20 20 20 20 20 20 20 22 20 44 42 5c 22 22 2c 20         " DB\"", 
6e80: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
6e90: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
6ea0: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
6eb0: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
6ec0: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
6ed0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
6ee0: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
6ef0: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 78  _function(db, "x
6f00: 5f 63 6f 61 6c 65 73 63 65 22 2c 20 2d 31 2c 20  _coalesce", -1, 
6f10: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
6f20: 0a 20 20 20 20 20 20 20 20 74 31 5f 69 66 6e 75  .        t1_ifnu
6f30: 6c 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  llFunc, 0, 0);. 
6f40: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6f50: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
6f60: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
6f70: 6e 63 74 69 6f 6e 28 64 62 2c 20 22 68 65 78 38  nction(db, "hex8
6f80: 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
6f90: 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
6fa0: 4d 49 4e 49 53 54 49 43 2c 0a 20 20 20 20 20 20  MINISTIC,.      
6fb0: 20 20 20 20 30 2c 20 68 65 78 38 46 75 6e 63 2c      0, hex8Func,
6fc0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 69 66 6e   0, 0);.  }.#ifn
6fd0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6fe0: 55 54 46 31 36 0a 20 20 69 66 28 20 72 63 3d 3d  UTF16.  if( rc==
6ff0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7000: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
7010: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
7020: 2c 20 22 68 65 78 31 36 22 2c 20 31 2c 20 53 51  , "hex16", 1, SQ
7030: 4c 49 54 45 5f 55 54 46 31 36 20 7c 20 53 51 4c  LITE_UTF16 | SQL
7040: 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
7050: 43 2c 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20  C,.          0, 
7060: 68 65 78 31 36 46 75 6e 63 2c 20 30 2c 20 30 29  hex16Func, 0, 0)
7070: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
7080: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7090: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
70a0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
70b0: 74 69 6f 6e 28 64 62 2c 20 22 74 6b 74 32 32 31  tion(db, "tkt221
70c0: 33 66 75 6e 63 22 2c 20 31 2c 20 53 51 4c 49 54  3func", 1, SQLIT
70d0: 45 5f 41 4e 59 2c 20 30 2c 20 0a 20 20 20 20 20  E_ANY, 0, .     
70e0: 20 20 20 20 20 74 6b 74 32 32 31 33 46 75 6e 63       tkt2213Func
70f0: 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  tion, 0, 0);.  }
7100: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
7110: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
7120: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
7130: 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 70 6f  function(db, "po
7140: 69 6e 74 65 72 5f 63 68 61 6e 67 65 22 2c 20 34  inter_change", 4
7150: 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c  , SQLITE_ANY, 0,
7160: 20 0a 20 20 20 20 20 20 20 20 20 20 70 74 72 43   .          ptrC
7170: 68 6e 67 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20  hngFunction, 0, 
7180: 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 75  0);.  }..  /* Fu
7190: 6e 63 74 69 6f 6e 73 20 63 6f 75 6e 74 65 72 31  nctions counter1
71a0: 28 29 20 61 6e 64 20 63 6f 75 6e 74 65 72 32 28  () and counter2(
71b0: 29 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  ) have the same 
71c0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2d  implementation -
71d0: 20 74 68 65 79 0a 20 20 2a 2a 20 62 6f 74 68 20   they.  ** both 
71e0: 72 65 74 75 72 6e 20 61 6e 20 61 73 63 65 6e 64  return an ascend
71f0: 69 6e 67 20 69 6e 74 65 67 65 72 20 77 69 74 68  ing integer with
7200: 20 65 61 63 68 20 63 61 6c 6c 2e 20 20 42 75 74   each call.  But
7210: 20 63 6f 75 6e 74 65 72 31 28 29 20 69 73 20 6d   counter1() is m
7220: 61 72 6b 65 64 0a 20 20 2a 2a 20 61 73 20 6e 6f  arked.  ** as no
7230: 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20  n-deterministic 
7240: 61 6e 64 20 63 6f 75 6e 74 65 72 32 28 29 20 69  and counter2() i
7250: 73 20 6d 61 72 6b 65 64 20 61 73 20 64 65 74 65  s marked as dete
7260: 72 6d 69 6e 69 73 74 69 63 2e 0a 20 20 2a 2f 0a  rministic..  */.
7270: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
7280: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
7290: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
72a0: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 63 6f 75  unction(db, "cou
72b0: 6e 74 65 72 31 22 2c 20 2d 31 2c 20 53 51 4c 49  nter1", -1, SQLI
72c0: 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20  TE_UTF8,.       
72d0: 20 20 20 30 2c 20 6e 6f 6e 64 65 74 65 72 6d 69     0, nondetermi
72e0: 6e 69 73 74 69 63 46 75 6e 63 74 69 6f 6e 2c 20  nisticFunction, 
72f0: 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  0, 0);.  }.  if(
7300: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
7310: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
7320: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
7330: 6f 6e 28 64 62 2c 20 22 63 6f 75 6e 74 65 72 32  on(db, "counter2
7340: 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  ", -1, SQLITE_UT
7350: 46 38 7c 53 51 4c 49 54 45 5f 44 45 54 45 52 4d  F8|SQLITE_DETERM
7360: 49 4e 49 53 54 49 43 2c 0a 20 20 20 20 20 20 20  INISTIC,.       
7370: 20 20 20 30 2c 20 6e 6f 6e 64 65 74 65 72 6d 69     0, nondetermi
7380: 6e 69 73 74 69 63 46 75 6e 63 74 69 6f 6e 2c 20  nisticFunction, 
7390: 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  0, 0);.  }..#ifn
73a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
73b0: 55 54 46 31 36 0a 20 20 2f 2a 20 55 73 65 20 74  UTF16.  /* Use t
73c0: 68 65 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  he sqlite3_creat
73d0: 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28 29 20 41  e_function16() A
73e0: 50 49 20 68 65 72 65 2e 20 4d 61 69 6e 6c 79 20  PI here. Mainly 
73f0: 66 6f 72 20 66 75 6e 2c 20 62 75 74 20 61 6c 73  for fun, but als
7400: 6f 20 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20  o .  ** because 
7410: 69 74 20 69 73 20 6e 6f 74 20 74 65 73 74 65 64  it is not tested
7420: 20 61 6e 79 77 68 65 72 65 20 65 6c 73 65 2e 20   anywhere else. 
7430: 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
7440: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f  ITE_OK ){.    co
7450: 6e 73 74 20 76 6f 69 64 20 2a 7a 55 74 66 31 36  nst void *zUtf16
7460: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61  ;.    sqlite3_va
7470: 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 20 20 73  lue *pVal;.    s
7480: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
7490: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
74a0: 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65     pVal = sqlite
74b0: 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20  3ValueNew(db);. 
74c0: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
74d0: 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20  etStr(pVal, -1, 
74e0: 22 78 5f 73 71 6c 69 74 65 5f 65 78 65 63 22 2c  "x_sqlite_exec",
74f0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
7500: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
7510: 20 20 7a 55 74 66 31 36 20 3d 20 73 71 6c 69 74    zUtf16 = sqlit
7520: 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c  e3ValueText(pVal
7530: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  , SQLITE_UTF16NA
7540: 54 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64  TIVE);.    if( d
7550: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7560: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
7570: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
7580: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
7590: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
75a0: 5f 66 75 6e 63 74 69 6f 6e 31 36 28 64 62 2c 20  _function16(db, 
75b0: 7a 55 74 66 31 36 2c 20 0a 20 20 20 20 20 20 20  zUtf16, .       
75c0: 20 20 20 20 20 20 20 20 20 31 2c 20 53 51 4c 49           1, SQLI
75d0: 54 45 5f 55 54 46 31 36 2c 20 64 62 2c 20 73 71  TE_UTF16, db, sq
75e0: 6c 69 74 65 33 45 78 65 63 46 75 6e 63 2c 20 30  lite3ExecFunc, 0
75f0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
7600: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
7610: 28 70 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69  (pVal);.    sqli
7620: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
7630: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a  db->mutex);.  }.
7640: 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 73 71  #endif..  if( sq
7650: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
7660: 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
7670: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
7680: 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65  ROR;.  Tcl_SetRe
7690: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
76a0: 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
76b0: 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75  (rc), 0);.  retu
76c0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
76d0: 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20  .** Routines to 
76e0: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 78 5f  implement the x_
76f0: 63 6f 75 6e 74 28 29 20 61 67 67 72 65 67 61 74  count() aggregat
7700: 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  e function..**.*
7710: 2a 20 78 5f 63 6f 75 6e 74 28 29 20 63 6f 75 6e  * x_count() coun
7720: 74 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ts the number of
7730: 20 6e 6f 6e 2d 6e 75 6c 6c 20 61 72 67 75 6d 65   non-null argume
7740: 6e 74 73 2e 20 20 42 75 74 20 74 68 65 72 65 20  nts.  But there 
7750: 61 72 65 0a 2a 2a 20 73 6f 6d 65 20 74 77 69 73  are.** some twis
7760: 74 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70  ts for testing p
7770: 75 72 70 6f 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  urposes..**.** I
7780: 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74  f the argument t
7790: 6f 20 78 5f 63 6f 75 6e 74 28 29 20 69 73 20 34  o x_count() is 4
77a0: 30 20 74 68 65 6e 20 61 20 55 54 46 2d 38 20 65  0 then a UTF-8 e
77b0: 72 72 6f 72 20 69 73 20 72 65 70 6f 72 74 65 64  rror is reported
77c0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 65 70 20  .** on the step 
77d0: 66 75 6e 63 74 69 6f 6e 2e 20 20 49 66 20 78 5f  function.  If x_
77e0: 63 6f 75 6e 74 28 34 31 29 20 69 73 20 73 65 65  count(41) is see
77f0: 6e 2c 20 74 68 65 6e 20 61 20 55 54 46 2d 31 36  n, then a UTF-16
7800: 20 65 72 72 6f 72 0a 2a 2a 20 69 73 20 72 65 70   error.** is rep
7810: 6f 72 74 65 64 20 6f 6e 20 74 68 65 20 73 74 65  orted on the ste
7820: 70 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 66 20  p function.  If 
7830: 74 68 65 20 74 6f 74 61 6c 20 63 6f 75 6e 74 20  the total count 
7840: 69 73 20 34 32 2c 20 74 68 65 6e 0a 2a 2a 20 61  is 42, then.** a
7850: 20 55 54 46 2d 38 20 65 72 72 6f 72 20 69 73 20   UTF-8 error is 
7860: 72 65 70 6f 72 74 65 64 20 6f 6e 20 74 68 65 20  reported on the 
7870: 66 69 6e 61 6c 69 7a 65 20 66 75 6e 63 74 69 6f  finalize functio
7880: 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  n..*/.typedef st
7890: 72 75 63 74 20 74 31 43 6f 75 6e 74 43 74 78 20  ruct t1CountCtx 
78a0: 74 31 43 6f 75 6e 74 43 74 78 3b 0a 73 74 72 75  t1CountCtx;.stru
78b0: 63 74 20 74 31 43 6f 75 6e 74 43 74 78 20 7b 0a  ct t1CountCtx {.
78c0: 20 20 69 6e 74 20 6e 3b 0a 7d 3b 0a 73 74 61 74    int n;.};.stat
78d0: 69 63 20 76 6f 69 64 20 74 31 43 6f 75 6e 74 53  ic void t1CountS
78e0: 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  tep(.  sqlite3_c
78f0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
7900: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
7910: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
7920: 72 67 76 0a 29 7b 0a 20 20 74 31 43 6f 75 6e 74  rgv.){.  t1Count
7930: 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71  Ctx *p;.  p = sq
7940: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
7950: 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
7960: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
7970: 69 66 28 20 28 61 72 67 63 3d 3d 30 20 7c 7c 20  if( (argc==0 || 
7980: 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c  SQLITE_NULL!=sql
7990: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
79a0: 61 72 67 76 5b 30 5d 29 20 29 20 26 26 20 70 20  argv[0]) ) && p 
79b0: 29 7b 0a 20 20 20 20 70 2d 3e 6e 2b 2b 3b 0a 20  ){.    p->n++;. 
79c0: 20 7d 0a 20 20 69 66 28 20 61 72 67 63 3e 30 20   }.  if( argc>0 
79d0: 29 7b 0a 20 20 20 20 69 6e 74 20 76 20 3d 20 73  ){.    int v = s
79e0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
79f0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69  (argv[0]);.    i
7a00: 66 28 20 76 3d 3d 34 30 20 29 7b 0a 20 20 20 20  f( v==40 ){.    
7a10: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
7a20: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
7a30: 22 76 61 6c 75 65 20 6f 66 20 34 30 20 68 61 6e  "value of 40 han
7a40: 64 65 64 20 74 6f 20 78 5f 63 6f 75 6e 74 22 2c  ded to x_count",
7a50: 20 2d 31 29 3b 0a 23 69 66 6e 64 65 66 20 53 51   -1);.#ifndef SQ
7a60: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
7a70: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 76 3d      }else if( v=
7a80: 3d 34 31 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  =41 ){.      con
7a90: 73 74 20 63 68 61 72 20 7a 55 74 66 31 36 45 72  st char zUtf16Er
7aa0: 72 4d 73 67 5b 5d 20 3d 20 7b 20 30 2c 20 30 78  rMsg[] = { 0, 0x
7ab0: 36 31 2c 20 30 2c 20 30 78 36 32 2c 20 30 2c 20  61, 0, 0x62, 0, 
7ac0: 30 78 36 33 2c 20 30 2c 20 30 2c 20 30 7d 3b 0a  0x63, 0, 0, 0};.
7ad0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
7ae0: 73 75 6c 74 5f 65 72 72 6f 72 31 36 28 63 6f 6e  sult_error16(con
7af0: 74 65 78 74 2c 20 26 7a 55 74 66 31 36 45 72 72  text, &zUtf16Err
7b00: 4d 73 67 5b 31 2d 53 51 4c 49 54 45 5f 42 49 47  Msg[1-SQLITE_BIG
7b10: 45 4e 44 49 41 4e 5d 2c 20 2d 31 29 3b 0a 23 65  ENDIAN], -1);.#e
7b20: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ndif.    }.  }.}
7b30: 20 20 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20     .static void 
7b40: 74 31 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 28  t1CountFinalize(
7b50: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
7b60: 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 74 31 43  *context){.  t1C
7b70: 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70 20  ountCtx *p;.  p 
7b80: 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  = sqlite3_aggreg
7b90: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
7ba0: 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  ext, sizeof(*p))
7bb0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
7bc0: 20 69 66 28 20 70 2d 3e 6e 3d 3d 34 32 20 29 7b   if( p->n==42 ){
7bd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
7be0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
7bf0: 65 78 74 2c 20 22 78 5f 63 6f 75 6e 74 20 74 6f  ext, "x_count to
7c00: 74 61 6c 73 20 74 6f 20 34 32 22 2c 20 2d 31 29  tals to 42", -1)
7c10: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7c20: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
7c30: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 70  t_int(context, p
7c40: 20 3f 20 70 2d 3e 6e 20 3a 20 30 29 3b 0a 20 20   ? p->n : 0);.  
7c50: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64    }.  }.}..#ifnd
7c60: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
7c70: 45 50 52 45 43 41 54 45 44 0a 73 74 61 74 69 63  EPRECATED.static
7c80: 20 76 6f 69 64 20 6c 65 67 61 63 79 43 6f 75 6e   void legacyCoun
7c90: 74 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33  tStep(.  sqlite3
7ca0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
7cb0: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
7cc0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
7cd0: 2a 61 72 67 76 0a 29 7b 0a 20 20 2f 2a 20 6e 6f  *argv.){.  /* no
7ce0: 2d 6f 70 20 2a 2f 0a 7d 0a 0a 73 74 61 74 69 63  -op */.}..static
7cf0: 20 76 6f 69 64 20 6c 65 67 61 63 79 43 6f 75 6e   void legacyCoun
7d00: 74 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65  tFinalize(sqlite
7d10: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
7d20: 78 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 72  xt){.  sqlite3_r
7d30: 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78  esult_int(contex
7d40: 74 2c 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65  t, sqlite3_aggre
7d50: 67 61 74 65 5f 63 6f 75 6e 74 28 63 6f 6e 74 65  gate_count(conte
7d60: 78 74 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  xt));.}.#endif..
7d70: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
7d80: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 61 67 67  lite3_create_agg
7d90: 72 65 67 61 74 65 20 44 42 0a 2a 2a 0a 2a 2a 20  regate DB.**.** 
7da0: 43 61 6c 6c 20 74 68 65 20 73 71 6c 69 74 65 33  Call the sqlite3
7db0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
7dc0: 20 41 50 49 20 6f 6e 20 74 68 65 20 67 69 76 65   API on the give
7dd0: 6e 20 64 61 74 61 62 61 73 65 20 69 6e 20 6f 72  n database in or
7de0: 64 65 72 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65  der.** to create
7df0: 20 61 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65   a function name
7e00: 64 20 22 78 5f 63 6f 75 6e 74 22 2e 20 20 54 68  d "x_count".  Th
7e10: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73  is function is s
7e20: 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20 74 68 65  imilar.** to the
7e30: 20 62 75 69 6c 74 2d 69 6e 20 63 6f 75 6e 74 28   built-in count(
7e40: 29 20 66 75 6e 63 74 69 6f 6e 2c 20 77 69 74 68  ) function, with
7e50: 20 61 20 66 65 77 20 73 70 65 63 69 61 6c 20 71   a few special q
7e60: 75 69 72 6b 73 0a 2a 2a 20 66 6f 72 20 74 65 73  uirks.** for tes
7e70: 74 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  ting the sqlite3
7e80: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 29 20  _result_error() 
7e90: 41 50 49 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  APIs..**.** The 
7ea0: 6f 72 69 67 69 6e 61 6c 20 6d 6f 74 69 76 61 74  original motivat
7eb0: 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 72 6f 75  ion for this rou
7ec0: 74 69 6e 65 20 77 61 73 20 74 6f 20 62 65 20 61  tine was to be a
7ed0: 62 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 65 0a  ble to call the.
7ee0: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  ** sqlite3_creat
7ef0: 65 5f 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e_aggregate func
7f00: 74 69 6f 6e 20 77 68 69 6c 65 20 61 20 71 75 65  tion while a que
7f10: 72 79 20 69 73 20 69 6e 20 70 72 6f 67 72 65 73  ry is in progres
7f20: 73 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f  s in order.** to
7f30: 20 74 65 73 74 20 74 68 65 20 53 51 4c 49 54 45   test the SQLITE
7f40: 5f 4d 49 53 55 53 45 20 64 65 74 65 63 74 69 6f  _MISUSE detectio
7f50: 6e 20 6c 6f 67 69 63 2e 20 20 53 65 65 20 6d 69  n logic.  See mi
7f60: 73 75 73 65 2e 74 65 73 74 2e 0a 2a 2a 0a 2a 2a  suse.test..**.**
7f70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   This routine wa
7f80: 73 20 6c 61 74 65 72 20 65 78 74 65 6e 64 65 64  s later extended
7f90: 20 74 6f 20 74 65 73 74 20 74 68 65 20 75 73 65   to test the use
7fa0: 20 6f 66 20 73 71 6c 69 74 65 33 5f 72 65 73 75   of sqlite3_resu
7fb0: 6c 74 5f 65 72 72 6f 72 28 29 0a 2a 2a 20 77 69  lt_error().** wi
7fc0: 74 68 69 6e 20 61 67 67 72 65 67 61 74 65 20 66  thin aggregate f
7fd0: 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  unctions..**.** 
7fe0: 4c 61 74 65 72 3a 20 49 74 20 69 73 20 6e 6f 77  Later: It is now
7ff0: 20 61 6c 73 6f 20 65 78 74 65 6e 64 65 64 20 74   also extended t
8000: 6f 20 72 65 67 69 73 74 65 72 20 74 68 65 20 61  o register the a
8010: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
8020: 6e 0a 2a 2a 20 22 6c 65 67 61 63 79 5f 63 6f 75  n.** "legacy_cou
8030: 6e 74 28 29 22 20 77 69 74 68 20 74 68 65 20 73  nt()" with the s
8040: 75 70 70 6c 69 65 64 20 64 61 74 61 62 61 73 65  upplied database
8050: 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73   handle. This is
8060: 20 75 73 65 64 0a 2a 2a 20 74 6f 20 74 65 73 74   used.** to test
8070: 20 74 68 65 20 64 65 70 72 65 63 61 74 65 64 20   the deprecated 
8080: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
8090: 65 5f 63 6f 75 6e 74 28 29 20 41 50 49 2e 0a 2a  e_count() API..*
80a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
80b0: 74 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67 61  t_create_aggrega
80c0: 74 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  te(.  void *NotU
80d0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
80e0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
80f0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
8100: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
8110: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
8120: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
8130: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8140: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
8150: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
8160: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
8170: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
8180: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73  gument */.){.  s
8190: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
81a0: 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63  t rc;.  if( argc
81b0: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
81c0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
81d0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
81e0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
81f0: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
8200: 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c    " FILENAME\"",
8210: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
8220: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
8230: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
8240: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
8250: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
8260: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
8270: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
8280: 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
8290: 78 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 53 51 4c  x_count", 0, SQL
82a0: 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 0a  ITE_UTF8, 0, 0,.
82b0: 20 20 20 20 20 20 74 31 43 6f 75 6e 74 53 74 65        t1CountSte
82c0: 70 2c 74 31 43 6f 75 6e 74 46 69 6e 61 6c 69 7a  p,t1CountFinaliz
82d0: 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
82e0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
82f0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
8300: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
8310: 22 78 5f 63 6f 75 6e 74 22 2c 20 31 2c 20 53 51  "x_count", 1, SQ
8320: 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c  LITE_UTF8, 0, 0,
8330: 0a 20 20 20 20 20 20 20 20 74 31 43 6f 75 6e 74  .        t1Count
8340: 53 74 65 70 2c 74 31 43 6f 75 6e 74 46 69 6e 61  Step,t1CountFina
8350: 6c 69 7a 65 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  lize);.  }.#ifnd
8360: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
8370: 45 50 52 45 43 41 54 45 44 0a 20 20 69 66 28 20  EPRECATED.  if( 
8380: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
8390: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
83a0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
83b0: 6e 28 64 62 2c 20 22 6c 65 67 61 63 79 5f 63 6f  n(db, "legacy_co
83c0: 75 6e 74 22 2c 20 30 2c 20 53 51 4c 49 54 45 5f  unt", 0, SQLITE_
83d0: 41 4e 59 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  ANY, 0, 0,.     
83e0: 20 20 20 6c 65 67 61 63 79 43 6f 75 6e 74 53 74     legacyCountSt
83f0: 65 70 2c 20 6c 65 67 61 63 79 43 6f 75 6e 74 46  ep, legacyCountF
8400: 69 6e 61 6c 69 7a 65 0a 20 20 20 20 29 3b 0a 20  inalize.    );. 
8410: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
8420: 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
8430: 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
8440: 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
8450: 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74  ERROR;.  Tcl_Set
8460: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
8470: 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
8480: 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65  me(rc), 0);.  re
8490: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
84a0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 70  ./*.** Usage:  p
84b0: 72 69 6e 74 66 20 54 45 58 54 0a 2a 2a 0a 2a 2a  rintf TEXT.**.**
84c0: 20 53 65 6e 64 20 6f 75 74 70 75 74 20 74 6f 20   Send output to 
84d0: 70 72 69 6e 74 66 2e 20 20 55 73 65 20 74 68 69  printf.  Use thi
84e0: 73 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 75  s rather than pu
84f0: 74 73 20 74 6f 20 6d 65 72 67 65 20 74 68 65 20  ts to merge the 
8500: 6f 75 74 70 75 74 0a 2a 2a 20 69 6e 20 74 68 65  output.** in the
8510: 20 63 6f 72 72 65 63 74 20 73 65 71 75 65 6e 63   correct sequenc
8520: 65 20 77 69 74 68 20 64 65 62 75 67 67 69 6e 67  e with debugging
8530: 20 70 72 69 6e 74 66 73 20 69 6e 73 65 72 74 65   printfs inserte
8540: 64 20 69 6e 74 6f 20 43 20 63 6f 64 65 2e 0a 2a  d into C code..*
8550: 2a 20 50 75 74 73 20 75 73 65 73 20 61 20 73 65  * Puts uses a se
8560: 70 61 72 61 74 65 20 62 75 66 66 65 72 20 61 6e  parate buffer an
8570: 64 20 64 65 62 75 67 67 69 6e 67 20 73 74 61 74  d debugging stat
8580: 65 6d 65 6e 74 73 20 77 69 6c 6c 20 62 65 20 6f  ements will be o
8590: 75 74 20 6f 66 0a 2a 2a 20 73 65 71 75 65 6e 63  ut of.** sequenc
85a0: 65 20 69 66 20 69 74 20 69 73 20 75 73 65 64 2e  e if it is used.
85b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
85c0: 65 73 74 5f 70 72 69 6e 74 66 28 0a 20 20 76 6f  est_printf(.  vo
85d0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
85e0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
85f0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
8600: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
8610: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
8620: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
8630: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
8640: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8650: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
8660: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
8670: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
8680: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
8690: 2f 0a 29 7b 0a 20 20 69 66 28 20 61 72 67 63 21  /.){.  if( argc!
86a0: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
86b0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
86c0: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
86d0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
86e0: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
86f0: 20 22 20 54 45 58 54 5c 22 22 2c 20 30 29 3b 0a   " TEXT\"", 0);.
8700: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
8710: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 72 69 6e  RROR;.  }.  prin
8720: 74 66 28 22 25 73 5c 6e 22 2c 20 61 72 67 76 5b  tf("%s\n", argv[
8730: 31 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  1]);.  return TC
8740: 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  L_OK;.}..../*.**
8750: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
8760: 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 20 46 4f 52  _mprintf_int FOR
8770: 4d 41 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45  MAT INTEGER INTE
8780: 47 45 52 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a  GER INTEGER.**.*
8790: 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77  * Call mprintf w
87a0: 69 74 68 20 74 68 72 65 65 20 69 6e 74 65 67 65  ith three intege
87b0: 72 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73  r arguments.*/.s
87c0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
87d0: 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 28 0a 20  3_mprintf_int(. 
87e0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
87f0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
8800: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
8810: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
8820: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
8830: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
8840: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
8850: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8860: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
8870: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
8880: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
8890: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
88a0: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 5b  t */.){.  int a[
88b0: 33 5d 2c 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  3], i;.  char *z
88c0: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35 20  ;.  if( argc!=5 
88d0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
88e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
88f0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
8900: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
8910: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
8920: 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 49  FORMAT INT INT I
8930: 4e 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  NT\"", 0);.    r
8940: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8950: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20  .  }.  for(i=2; 
8960: 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<5; i++){.    i
8970: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
8980: 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26  terp, argv[i], &
8990: 61 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e  a[i-2]) ) return
89a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
89b0: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
89c0: 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61  rintf(argv[1], a
89d0: 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 29  [0], a[1], a[2])
89e0: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
89f0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20  sult(interp, z, 
8a00: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
8a10: 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(z);.  return 
8a20: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
8a30: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
8a40: 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 20 46  _mprintf_int64 F
8a50: 4f 52 4d 41 54 20 49 4e 54 45 47 45 52 20 49 4e  ORMAT INTEGER IN
8a60: 54 45 47 45 52 20 49 4e 54 45 47 45 52 0a 2a 2a  TEGER INTEGER.**
8a70: 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66  .** Call mprintf
8a80: 20 77 69 74 68 20 74 68 72 65 65 20 36 34 2d 62   with three 64-b
8a90: 69 74 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d  it integer argum
8aa0: 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ents.*/.static i
8ab0: 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  nt sqlite3_mprin
8ac0: 74 66 5f 69 6e 74 36 34 28 0a 20 20 76 6f 69 64  tf_int64(.  void
8ad0: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
8ae0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
8af0: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
8b00: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
8b10: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
8b20: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
8b30: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
8b40: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
8b50: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
8b60: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
8b70: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
8b80: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
8b90: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
8ba0: 6c 69 74 65 5f 69 6e 74 36 34 20 61 5b 33 5d 3b  lite_int64 a[3];
8bb0: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66  .  char *z;.  if
8bc0: 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20  ( argc!=5 ){.   
8bd0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8be0: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
8bf0: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
8c00: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
8c10: 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54  .       " FORMAT
8c20: 20 49 4e 54 20 49 4e 54 20 49 4e 54 5c 22 22 2c   INT INT INT\"",
8c30: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
8c40: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
8c50: 20 66 6f 72 28 69 3d 32 3b 20 69 3c 35 3b 20 69   for(i=2; i<5; i
8c60: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
8c70: 69 74 65 33 41 74 6f 69 36 34 28 61 72 67 76 5b  ite3Atoi64(argv[
8c80: 69 5d 2c 20 26 61 5b 69 2d 32 5d 2c 20 31 30 30  i], &a[i-2], 100
8c90: 30 30 30 30 2c 20 53 51 4c 49 54 45 5f 55 54 46  0000, SQLITE_UTF
8ca0: 38 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  8) ){.      Tcl_
8cb0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8cc0: 65 72 70 2c 20 22 61 72 67 75 6d 65 6e 74 20 69  erp, "argument i
8cd0: 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 36 34  s not a valid 64
8ce0: 2d 62 69 74 20 69 6e 74 65 67 65 72 22 2c 20 30  -bit integer", 0
8cf0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
8d00: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
8d10: 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74  .  }.  z = sqlit
8d20: 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b  e3_mprintf(argv[
8d30: 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20  1], a[0], a[1], 
8d40: 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70  a[2]);.  Tcl_App
8d50: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8d60: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
8d70: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
8d80: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
8d90: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
8da0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f  lite3_mprintf_lo
8db0: 6e 67 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  ng FORMAT INTEGE
8dc0: 52 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  R INTEGER INTEGE
8dd0: 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  R.**.** Call mpr
8de0: 69 6e 74 66 20 77 69 74 68 20 74 68 72 65 65 20  intf with three 
8df0: 6c 6f 6e 67 20 69 6e 74 65 67 65 72 20 61 72 67  long integer arg
8e00: 75 6d 65 6e 74 73 2e 20 20 20 54 68 69 73 20 6d  uments.   This m
8e10: 69 67 68 74 20 62 65 20 74 68 65 0a 2a 2a 20 73  ight be the.** s
8e20: 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 5f 6d  ame as sqlite3_m
8e30: 70 72 69 6e 74 66 5f 69 6e 74 20 6f 72 20 73 71  printf_int or sq
8e40: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
8e50: 74 36 34 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  t64, depending o
8e60: 6e 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 2e 0a 2a  n.** platform..*
8e70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
8e80: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e  ite3_mprintf_lon
8e90: 67 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  g(.  void *NotUs
8ea0: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
8eb0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
8ec0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
8ed0: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
8ee0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
8ef0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
8f00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8f10: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
8f20: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
8f30: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
8f40: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
8f50: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ument */.){.  in
8f60: 74 20 69 3b 0a 20 20 6c 6f 6e 67 20 69 6e 74 20  t i;.  long int 
8f70: 61 5b 33 5d 3b 0a 20 20 69 6e 74 20 62 5b 33 5d  a[3];.  int b[3]
8f80: 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  ;.  char *z;.  i
8f90: 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20  f( argc!=5 ){.  
8fa0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8fb0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
8fc0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
8fd0: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
8fe0: 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41  ,.       " FORMA
8ff0: 54 20 49 4e 54 20 49 4e 54 20 49 4e 54 5c 22 22  T INT INT INT\""
9000: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
9010: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
9020: 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 35 3b 20    for(i=2; i<5; 
9030: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63  i++){.    if( Tc
9040: 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
9050: 20 61 72 67 76 5b 69 5d 2c 20 26 62 5b 69 2d 32   argv[i], &b[i-2
9060: 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  ]) ) return TCL_
9070: 45 52 52 4f 52 3b 0a 20 20 20 20 61 5b 69 2d 32  ERROR;.    a[i-2
9080: 5d 20 3d 20 28 6c 6f 6e 67 20 69 6e 74 29 62 5b  ] = (long int)b[
9090: 69 2d 32 5d 3b 0a 20 20 20 20 61 5b 69 2d 32 5d  i-2];.    a[i-2]
90a0: 20 26 3d 20 28 28 28 75 36 34 29 31 29 3c 3c 28   &= (((u64)1)<<(
90b0: 73 69 7a 65 6f 66 28 69 6e 74 29 2a 38 29 29 2d  sizeof(int)*8))-
90c0: 31 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c  1;.  }.  z = sql
90d0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67  ite3_mprintf(arg
90e0: 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d  v[1], a[0], a[1]
90f0: 2c 20 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41  , a[2]);.  Tcl_A
9100: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9110: 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c  rp, z, 0);.  sql
9120: 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
9130: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
9140: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
9150: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
9160: 73 74 72 20 46 4f 52 4d 41 54 20 49 4e 54 45 47  str FORMAT INTEG
9170: 45 52 20 49 4e 54 45 47 45 52 20 53 54 52 49 4e  ER INTEGER STRIN
9180: 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  G.**.** Call mpr
9190: 69 6e 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e  intf with two in
91a0: 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20  teger arguments 
91b0: 61 6e 64 20 6f 6e 65 20 73 74 72 69 6e 67 20 61  and one string a
91c0: 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69  rgument.*/.stati
91d0: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70  c int sqlite3_mp
91e0: 72 69 6e 74 66 5f 73 74 72 28 0a 20 20 76 6f 69  rintf_str(.  voi
91f0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
9200: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
9210: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
9220: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
9230: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
9240: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
9250: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
9260: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
9270: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
9280: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
9290: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
92a0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
92b0: 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20  .){.  int a[3], 
92c0: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  i;.  char *z;.  
92d0: 69 66 28 20 61 72 67 63 3c 34 20 7c 7c 20 61 72  if( argc<4 || ar
92e0: 67 63 3e 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f  gc>5 ){.    Tcl_
92f0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
9300: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
9310: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
9320: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
9330: 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20     " FORMAT INT 
9340: 49 4e 54 20 3f 53 54 52 49 4e 47 3f 5c 22 22 2c  INT ?STRING?\"",
9350: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
9360: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
9370: 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69   for(i=2; i<4; i
9380: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c  ++){.    if( Tcl
9390: 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20  _GetInt(interp, 
93a0: 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d  argv[i], &a[i-2]
93b0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
93c0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20  RROR;.  }.  z = 
93d0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
93e0: 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61  argv[1], a[0], a
93f0: 5b 31 5d 2c 20 61 72 67 63 3e 34 20 3f 20 61 72  [1], argc>4 ? ar
9400: 67 76 5b 34 5d 20 3a 20 4e 55 4c 4c 29 3b 0a 20  gv[4] : NULL);. 
9410: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
9420: 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b  t(interp, z, 0);
9430: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
9440: 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  z);.  return TCL
9450: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
9460: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 6e  age:  sqlite3_sn
9470: 70 72 69 6e 74 66 5f 73 74 72 20 49 4e 54 45 47  printf_str INTEG
9480: 45 52 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  ER FORMAT INTEGE
9490: 52 20 49 4e 54 45 47 45 52 20 53 54 52 49 4e 47  R INTEGER STRING
94a0: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69  .**.** Call mpri
94b0: 6e 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74  ntf with two int
94c0: 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61  eger arguments a
94d0: 6e 64 20 6f 6e 65 20 73 74 72 69 6e 67 20 61 72  nd one string ar
94e0: 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63  gument.*/.static
94f0: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e 70   int sqlite3_snp
9500: 72 69 6e 74 66 5f 73 74 72 28 0a 20 20 76 6f 69  rintf_str(.  voi
9510: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
9520: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
9530: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
9540: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
9550: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
9560: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
9570: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
9580: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
9590: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
95a0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
95b0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
95c0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
95d0: 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20  .){.  int a[3], 
95e0: 69 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68  i;.  int n;.  ch
95f0: 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67  ar *z;.  if( arg
9600: 63 3c 35 20 7c 7c 20 61 72 67 63 3e 36 20 29 7b  c<5 || argc>6 ){
9610: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
9620: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
9630: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
9640: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
9650: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 4e  [0],.       " IN
9660: 54 20 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54  T FORMAT INT INT
9670: 20 3f 53 54 52 49 4e 47 3f 5c 22 22 2c 20 30 29   ?STRING?\"", 0)
9680: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
9690: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
96a0: 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74  ( Tcl_GetInt(int
96b0: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 6e  erp, argv[1], &n
96c0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
96d0: 52 52 4f 52 3b 0a 20 20 69 66 28 20 6e 3c 30 20  RROR;.  if( n<0 
96e0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
96f0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
9700: 22 4e 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 6e  "N must be non-n
9710: 65 67 61 74 69 76 65 22 2c 20 30 29 3b 0a 20 20  egative", 0);.  
9720: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
9730: 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  OR;.  }.  for(i=
9740: 33 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20  3; i<5; i++){.  
9750: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
9760: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d  (interp, argv[i]
9770: 2c 20 26 61 5b 69 2d 33 5d 29 20 29 20 72 65 74  , &a[i-3]) ) ret
9780: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9790: 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33   }.  z = sqlite3
97a0: 5f 6d 61 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a  _malloc( n+1 );.
97b0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
97c0: 74 66 28 6e 2c 20 7a 2c 20 61 72 67 76 5b 32 5d  tf(n, z, argv[2]
97d0: 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 72  , a[0], a[1], ar
97e0: 67 63 3e 34 20 3f 20 61 72 67 76 5b 35 5d 20 3a  gc>4 ? argv[5] :
97f0: 20 4e 55 4c 4c 29 3b 0a 20 20 54 63 6c 5f 41 70   NULL);.  Tcl_Ap
9800: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
9810: 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69  p, z, 0);.  sqli
9820: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72  te3_free(z);.  r
9830: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
9840: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
9850: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64  qlite3_mprintf_d
9860: 6f 75 62 6c 65 20 46 4f 52 4d 41 54 20 49 4e 54  ouble FORMAT INT
9870: 45 47 45 52 20 49 4e 54 45 47 45 52 20 44 4f 55  EGER INTEGER DOU
9880: 42 4c 45 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d  BLE.**.** Call m
9890: 70 72 69 6e 74 66 20 77 69 74 68 20 74 77 6f 20  printf with two 
98a0: 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74  integer argument
98b0: 73 20 61 6e 64 20 6f 6e 65 20 64 6f 75 62 6c 65  s and one double
98c0: 20 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61   argument.*/.sta
98d0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  tic int sqlite3_
98e0: 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 28 0a  mprintf_double(.
98f0: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
9900: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
9910: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
9920: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
9930: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
9940: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
9950: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
9960: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9970: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
9980: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
9990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
99a0: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
99b0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  nt */.){.  int a
99c0: 5b 33 5d 2c 20 69 3b 0a 20 20 64 6f 75 62 6c 65  [3], i;.  double
99d0: 20 72 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20   r;.  char *z;. 
99e0: 20 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a   if( argc!=5 ){.
99f0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
9a00: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
9a10: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
9a20: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
9a30: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52  0],.       " FOR
9a40: 4d 41 54 20 49 4e 54 20 49 4e 54 20 44 4f 55 42  MAT INT INT DOUB
9a50: 4c 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  LE\"", 0);.    r
9a60: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9a70: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20  .  }.  for(i=2; 
9a80: 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<4; i++){.    i
9a90: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
9aa0: 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26  terp, argv[i], &
9ab0: 61 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e  a[i-2]) ) return
9ac0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
9ad0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 44 6f 75    if( Tcl_GetDou
9ae0: 62 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ble(interp, argv
9af0: 5b 34 5d 2c 20 26 72 29 20 29 20 72 65 74 75 72  [4], &r) ) retur
9b00: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
9b10: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
9b20: 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d  tf(argv[1], a[0]
9b30: 2c 20 61 5b 31 5d 2c 20 72 29 3b 0a 20 20 54 63  , a[1], r);.  Tc
9b40: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
9b50: 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20  nterp, z, 0);.  
9b60: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
9b70: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
9b80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
9b90: 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  :  sqlite3_mprin
9ba0: 74 66 5f 73 63 61 6c 65 64 20 46 4f 52 4d 41 54  tf_scaled FORMAT
9bb0: 20 44 4f 55 42 4c 45 20 44 4f 55 42 4c 45 0a 2a   DOUBLE DOUBLE.*
9bc0: 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74  *.** Call mprint
9bd0: 66 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20  f with a single 
9be0: 64 6f 75 62 6c 65 20 61 72 67 75 6d 65 6e 74 20  double argument 
9bf0: 77 68 69 63 68 20 69 73 20 74 68 65 20 70 72 6f  which is the pro
9c00: 64 75 63 74 20 6f 66 20 74 68 65 0a 2a 2a 20 74  duct of the.** t
9c10: 77 6f 20 61 72 67 75 6d 65 6e 74 73 20 67 69 76  wo arguments giv
9c20: 65 6e 20 61 62 6f 76 65 2e 20 20 54 68 69 73 20  en above.  This 
9c30: 69 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72  is used to gener
9c40: 61 74 65 20 6f 76 65 72 66 6c 6f 77 20 61 6e 64  ate overflow and
9c50: 20 75 6e 64 65 72 66 6c 6f 77 0a 2a 2a 20 64 6f   underflow.** do
9c60: 75 62 6c 65 73 20 74 6f 20 74 65 73 74 20 74 68  ubles to test th
9c70: 61 74 20 74 68 65 79 20 61 72 65 20 63 6f 6e 76  at they are conv
9c80: 65 72 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 0a  erted properly..
9c90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
9ca0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63  lite3_mprintf_sc
9cb0: 61 6c 65 64 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  aled(.  void *No
9cc0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
9cd0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
9ce0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
9cf0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
9d00: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
9d10: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
9d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9d30: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
9d40: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
9d50: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
9d60: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
9d70: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
9d80: 20 69 6e 74 20 69 3b 0a 20 20 64 6f 75 62 6c 65   int i;.  double
9d90: 20 72 5b 32 5d 3b 0a 20 20 63 68 61 72 20 2a 7a   r[2];.  char *z
9da0: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34 20  ;.  if( argc!=4 
9db0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
9dc0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
9dd0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
9de0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
9df0: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
9e00: 46 4f 52 4d 41 54 20 44 4f 55 42 4c 45 20 44 4f  FORMAT DOUBLE DO
9e10: 55 42 4c 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20  UBLE\"", 0);.   
9e20: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9e30: 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32  R;.  }.  for(i=2
9e40: 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<4; i++){.   
9e50: 20 69 66 28 20 54 63 6c 5f 47 65 74 44 6f 75 62   if( Tcl_GetDoub
9e60: 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  le(interp, argv[
9e70: 69 5d 2c 20 26 72 5b 69 2d 32 5d 29 20 29 20 72  i], &r[i-2]) ) r
9e80: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9e90: 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74  .  }.  z = sqlit
9ea0: 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b  e3_mprintf(argv[
9eb0: 31 5d 2c 20 72 5b 30 5d 2a 72 5b 31 5d 29 3b 0a  1], r[0]*r[1]);.
9ec0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
9ed0: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29  lt(interp, z, 0)
9ee0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
9ef0: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  (z);.  return TC
9f00: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
9f10: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
9f20: 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 20 46  printf_stronly F
9f30: 4f 52 4d 41 54 20 53 54 52 49 4e 47 0a 2a 2a 0a  ORMAT STRING.**.
9f40: 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20  ** Call mprintf 
9f50: 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 64 6f  with a single do
9f60: 75 62 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68  uble argument wh
9f70: 69 63 68 20 69 73 20 74 68 65 20 70 72 6f 64 75  ich is the produ
9f80: 63 74 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f  ct of the.** two
9f90: 20 61 72 67 75 6d 65 6e 74 73 20 67 69 76 65 6e   arguments given
9fa0: 20 61 62 6f 76 65 2e 20 20 54 68 69 73 20 69 73   above.  This is
9fb0: 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74   used to generat
9fc0: 65 20 6f 76 65 72 66 6c 6f 77 20 61 6e 64 20 75  e overflow and u
9fd0: 6e 64 65 72 66 6c 6f 77 0a 2a 2a 20 64 6f 75 62  nderflow.** doub
9fe0: 6c 65 73 20 74 6f 20 74 65 73 74 20 74 68 61 74  les to test that
9ff0: 20 74 68 65 79 20 61 72 65 20 63 6f 6e 76 65 72   they are conver
a000: 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f  ted properly..*/
a010: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
a020: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f  te3_mprintf_stro
a030: 6e 6c 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  nly(.  void *Not
a040: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
a050: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
a060: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
a070: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
a080: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
a090: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
a0a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
a0b0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
a0c0: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
a0d0: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
a0e0: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
a0f0: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
a100: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61  char *z;.  if( a
a110: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
a120: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
a130: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
a140: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
a150: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
a160: 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 53 54       " FORMAT ST
a170: 52 49 4e 47 5c 22 22 2c 20 30 29 3b 0a 20 20 20  RING\"", 0);.   
a180: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a190: 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c  R;.  }.  z = sql
a1a0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67  ite3_mprintf(arg
a1b0: 76 5b 31 5d 2c 20 61 72 67 76 5b 32 5d 29 3b 0a  v[1], argv[2]);.
a1c0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
a1d0: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29  lt(interp, z, 0)
a1e0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
a1f0: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  (z);.  return TC
a200: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
a210: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
a220: 70 72 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65  printf_hexdouble
a230: 20 46 4f 52 4d 41 54 20 48 45 58 0a 2a 2a 0a 2a   FORMAT HEX.**.*
a240: 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77  * Call mprintf w
a250: 69 74 68 20 61 20 73 69 6e 67 6c 65 20 64 6f 75  ith a single dou
a260: 62 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69  ble argument whi
a270: 63 68 20 69 73 20 64 65 72 69 76 65 64 20 66 72  ch is derived fr
a280: 6f 6d 20 74 68 65 0a 2a 2a 20 68 65 78 61 64 65  om the.** hexade
a290: 63 69 6d 61 6c 20 65 6e 63 6f 64 69 6e 67 20 6f  cimal encoding o
a2a0: 66 20 61 6e 20 49 45 45 45 20 64 6f 75 62 6c 65  f an IEEE double
a2b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a2c0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
a2d0: 68 65 78 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69  hexdouble(.  voi
a2e0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
a2f0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
a300: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
a310: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
a320: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
a330: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
a340: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
a350: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
a360: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
a370: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
a380: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
a390: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
a3a0: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  .){.  char *z;. 
a3b0: 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 75 6e 73   double r;.  uns
a3c0: 69 67 6e 65 64 20 69 6e 74 20 78 31 2c 20 78 32  igned int x1, x2
a3d0: 3b 0a 20 20 73 71 6c 69 74 65 5f 75 69 6e 74 36  ;.  sqlite_uint6
a3e0: 34 20 64 3b 0a 20 20 69 66 28 20 61 72 67 63 21  4 d;.  if( argc!
a3f0: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
a400: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
a410: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
a420: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
a430: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
a440: 20 22 20 46 4f 52 4d 41 54 20 53 54 52 49 4e 47   " FORMAT STRING
a450: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
a460: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
a470: 20 7d 0a 20 20 69 66 28 20 73 73 63 61 6e 66 28   }.  if( sscanf(
a480: 61 72 67 76 5b 32 5d 2c 20 22 25 30 38 78 25 30  argv[2], "%08x%0
a490: 38 78 22 2c 20 26 78 32 2c 20 26 78 31 29 21 3d  8x", &x2, &x1)!=
a4a0: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
a4b0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
a4c0: 2c 20 22 32 6e 64 20 61 72 67 75 6d 65 6e 74 20  , "2nd argument 
a4d0: 73 68 6f 75 6c 64 20 62 65 20 31 36 2d 63 68 61  should be 16-cha
a4e0: 72 61 63 74 65 72 73 20 6f 66 20 68 65 78 22 2c  racters of hex",
a4f0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
a500: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
a510: 20 64 20 3d 20 78 32 3b 0a 20 20 64 20 3d 20 28   d = x2;.  d = (
a520: 64 3c 3c 33 32 29 20 2b 20 78 31 3b 0a 20 20 6d  d<<32) + x1;.  m
a530: 65 6d 63 70 79 28 26 72 2c 20 26 64 2c 20 73 69  emcpy(&r, &d, si
a540: 7a 65 6f 66 28 72 29 29 3b 0a 20 20 7a 20 3d 20  zeof(r));.  z = 
a550: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
a560: 61 72 67 76 5b 31 5d 2c 20 72 29 3b 0a 20 20 54  argv[1], r);.  T
a570: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
a580: 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20  interp, z, 0);. 
a590: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
a5a0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
a5b0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
a5c0: 65 3a 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  e: sqlite3_enabl
a5d0: 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 20 3f  e_shared_cache ?
a5e0: 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 0a 2a 2f 0a 23  BOOLEAN?.**.*/.#
a5f0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
a600: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
a610: 41 43 48 45 29 0a 73 74 61 74 69 63 20 69 6e 74  ACHE).static int
a620: 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f 73 68 61   test_enable_sha
a630: 72 65 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  red(.  ClientDat
a640: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
a650: 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
a660: 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
a670: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
a680: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
a690: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
a6a0: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
a6b0: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
a6c0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
a6d0: 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
a6e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
a6f0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
a700: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
a710: 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
a720: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
a730: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 65   int rc;.  int e
a740: 6e 61 62 6c 65 3b 0a 20 20 69 6e 74 20 72 65 74  nable;.  int ret
a750: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a   = 0;..  if( obj
a760: 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 31 20  c!=2 && objc!=1 
a770: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
a780: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
a790: 31 2c 20 6f 62 6a 76 2c 20 22 3f 42 4f 4f 4c 45  1, objv, "?BOOLE
a7a0: 41 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72  AN?");.    retur
a7b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
a7c0: 0a 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33  .  ret = sqlite3
a7d0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61  GlobalConfig.sha
a7e0: 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 3b  redCacheEnabled;
a7f0: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20  ..  if( objc==2 
a800: 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  ){.    if( Tcl_G
a810: 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
a820: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
a830: 2c 20 26 65 6e 61 62 6c 65 29 20 29 7b 0a 20 20  , &enable) ){.  
a840: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
a850: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
a860: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 6e 61  rc = sqlite3_ena
a870: 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65  ble_shared_cache
a880: 28 65 6e 61 62 6c 65 29 3b 0a 20 20 20 20 69 66  (enable);.    if
a890: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
a8a0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
a8b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
a8c0: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72  char *)sqlite3Er
a8d0: 72 53 74 72 28 72 63 29 2c 20 54 43 4c 5f 53 54  rStr(rc), TCL_ST
a8e0: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 72 65 74  ATIC);.      ret
a8f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
a900: 20 20 20 7d 0a 20 20 7d 0a 20 20 54 63 6c 5f 53     }.  }.  Tcl_S
a910: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
a920: 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65  rp, Tcl_NewBoole
a930: 61 6e 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20 72  anObj(ret));.  r
a940: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
a950: 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  #endif..../*.** 
a960: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65  Usage: sqlite3_e
a970: 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63  xtended_result_c
a980: 6f 64 65 73 20 20 20 44 42 20 20 20 20 42 4f 4f  odes   DB    BOO
a990: 4c 45 41 4e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  LEAN.**.*/.stati
a9a0: 63 20 69 6e 74 20 74 65 73 74 5f 65 78 74 65 6e  c int test_exten
a9b0: 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73  ded_result_codes
a9c0: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
a9d0: 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
a9e0: 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
a9f0: 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
aa00: 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
aa10: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
aa20: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
aa30: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
aa40: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
aa50: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
aa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aa70: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
aa80: 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
aa90: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
aaa0: 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
aab0: 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ments */.){.  in
aac0: 74 20 65 6e 61 62 6c 65 3b 0a 20 20 73 71 6c 69  t enable;.  sqli
aad0: 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  te3 *db;..  if( 
aae0: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
aaf0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
ab00: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
ab10: 20 22 44 42 20 42 4f 4f 4c 45 41 4e 22 29 3b 0a   "DB BOOLEAN");.
ab20: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
ab30: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
ab40: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
ab50: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
ab60: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
ab70: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
ab80: 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
ab90: 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
aba0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
abb0: 5d 2c 20 26 65 6e 61 62 6c 65 29 20 29 20 72 65  ], &enable) ) re
abc0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
abd0: 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64    sqlite3_extend
abe0: 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28  ed_result_codes(
abf0: 64 62 2c 20 65 6e 61 62 6c 65 29 3b 0a 20 20 72  db, enable);.  r
ac00: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
ac10: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
ac20: 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e  lite3_libversion
ac30: 5f 6e 75 6d 62 65 72 0a 2a 2a 0a 2a 2f 0a 73 74  _number.**.*/.st
ac40: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 69  atic int test_li
ac50: 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28  bversion_number(
ac60: 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
ac70: 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
ac80: 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
ac90: 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
aca0: 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
acb0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
acc0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
acd0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
ace0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
acf0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
ad00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ad10: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
ad20: 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
ad30: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
ad40: 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
ad50: 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c  ents */.){.  Tcl
ad60: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
ad70: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
ad80: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 6c 69 62 76  Obj(sqlite3_libv
ad90: 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 29 29  ersion_number())
ada0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
adb0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
adc0: 67 65 3a 20 73 71 6c 69 74 65 33 5f 74 61 62 6c  ge: sqlite3_tabl
add0: 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
ade0: 61 20 44 42 20 64 62 6e 61 6d 65 20 74 62 6c 6e  a DB dbname tbln
adf0: 61 6d 65 20 63 6f 6c 6e 61 6d 65 0a 2a 2a 0a 2a  ame colname.**.*
ae00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
ae10: 74 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  t_table_column_m
ae20: 65 74 61 64 61 74 61 28 0a 20 20 43 6c 69 65 6e  etadata(.  Clien
ae30: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
ae40: 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
ae50: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
ae60: 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
ae70: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
ae80: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
ae90: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
aea0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
aeb0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
aec0: 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
aed0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
aee0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
aef0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
af00: 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
af10: 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
af20: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
af30: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
af40: 7a 44 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  zDb;.  const cha
af50: 72 20 2a 7a 54 62 6c 3b 0a 20 20 63 6f 6e 73 74  r *zTbl;.  const
af60: 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 69   char *zCol;.  i
af70: 6e 74 20 72 63 3b 0a 20 20 54 63 6c 5f 4f 62 6a  nt rc;.  Tcl_Obj
af80: 20 2a 70 52 65 74 3b 0a 0a 20 20 63 6f 6e 73 74   *pRet;..  const
af90: 20 63 68 61 72 20 2a 7a 44 61 74 61 74 79 70 65   char *zDatatype
afa0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
afb0: 7a 43 6f 6c 6c 73 65 71 3b 0a 20 20 69 6e 74 20  zCollseq;.  int 
afc0: 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 6e 74 20 70  notnull;.  int p
afd0: 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20 69 6e 74  rimarykey;.  int
afe0: 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a   autoincrement;.
aff0: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26  .  if( objc!=5 &
b000: 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  & objc!=4 ){.   
b010: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
b020: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
b030: 76 2c 20 22 44 42 20 64 62 6e 61 6d 65 20 74 62  v, "DB dbname tb
b040: 6c 6e 61 6d 65 20 63 6f 6c 6e 61 6d 65 22 29 3b  lname colname");
b050: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
b060: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
b070: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
b080: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
b090: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
b0a0: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
b0b0: 45 52 52 4f 52 3b 0a 20 20 7a 44 62 20 3d 20 54  ERROR;.  zDb = T
b0c0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
b0d0: 76 5b 32 5d 29 3b 0a 20 20 7a 54 62 6c 20 3d 20  v[2]);.  zTbl = 
b0e0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
b0f0: 6a 76 5b 33 5d 29 3b 0a 20 20 7a 43 6f 6c 20 3d  jv[3]);.  zCol =
b100: 20 6f 62 6a 63 3d 3d 35 20 3f 20 54 63 6c 5f 47   objc==5 ? Tcl_G
b110: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d  etString(objv[4]
b120: 29 20 3a 20 30 3b 0a 0a 20 20 69 66 28 20 73 74  ) : 0;..  if( st
b130: 72 6c 65 6e 28 7a 44 62 29 3d 3d 30 20 29 20 7a  rlen(zDb)==0 ) z
b140: 44 62 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20  Db = 0;..  rc = 
b150: 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f  sqlite3_table_co
b160: 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 64 62  lumn_metadata(db
b170: 2c 20 7a 44 62 2c 20 7a 54 62 6c 2c 20 7a 43 6f  , zDb, zTbl, zCo
b180: 6c 2c 20 0a 20 20 20 20 20 20 26 7a 44 61 74 61  l, .      &zData
b190: 74 79 70 65 2c 20 26 7a 43 6f 6c 6c 73 65 71 2c  type, &zCollseq,
b1a0: 20 26 6e 6f 74 6e 75 6c 6c 2c 20 26 70 72 69 6d   &notnull, &prim
b1b0: 61 72 79 6b 65 79 2c 20 26 61 75 74 6f 69 6e 63  arykey, &autoinc
b1c0: 72 65 6d 65 6e 74 29 3b 0a 0a 20 20 69 66 28 20  rement);..  if( 
b1d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
b1e0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
b1f0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71  esult(interp, sq
b200: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
b210: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
b220: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
b230: 0a 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65  .  pRet = Tcl_Ne
b240: 77 4f 62 6a 28 29 3b 0a 20 20 54 63 6c 5f 4c 69  wObj();.  Tcl_Li
b250: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
b260: 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f  nt(0, pRet, Tcl_
b270: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 44 61  NewStringObj(zDa
b280: 74 61 74 79 70 65 2c 20 2d 31 29 29 3b 0a 20 20  tatype, -1));.  
b290: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
b2a0: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74  dElement(0, pRet
b2b0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
b2c0: 62 6a 28 7a 43 6f 6c 6c 73 65 71 2c 20 2d 31 29  bj(zCollseq, -1)
b2d0: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
b2e0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
b2f0: 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e   pRet, Tcl_NewIn
b300: 74 4f 62 6a 28 6e 6f 74 6e 75 6c 6c 29 29 3b 0a  tObj(notnull));.
b310: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
b320: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
b330: 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  et, Tcl_NewIntOb
b340: 6a 28 70 72 69 6d 61 72 79 6b 65 79 29 29 3b 0a  j(primarykey));.
b350: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
b360: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
b370: 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  et, Tcl_NewIntOb
b380: 6a 28 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29  j(autoincrement)
b390: 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
b3a0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52  esult(interp, pR
b3b0: 65 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54  et);..  return T
b3c0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  CL_OK;.}..#ifnde
b3d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
b3e0: 43 52 42 4c 4f 42 0a 0a 73 74 61 74 69 63 20 69  CRBLOB..static i
b3f0: 6e 74 20 62 6c 6f 62 48 61 6e 64 6c 65 46 72 6f  nt blobHandleFro
b400: 6d 4f 62 6a 28 0a 20 20 54 63 6c 5f 49 6e 74 65  mObj(.  Tcl_Inte
b410: 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20 54  rp *interp, .  T
b420: 63 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 2c 0a 20 20  cl_Obj *pObj,.  
b430: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 2a 70  sqlite3_blob **p
b440: 70 42 6c 6f 62 0a 29 7b 0a 20 20 63 68 61 72 20  pBlob.){.  char 
b450: 2a 7a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20  *z;.  int n;..  
b460: 7a 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  z = Tcl_GetStrin
b470: 67 46 72 6f 6d 4f 62 6a 28 70 4f 62 6a 2c 20 26  gFromObj(pObj, &
b480: 6e 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29  n);.  if( n==0 )
b490: 7b 0a 20 20 20 20 2a 70 70 42 6c 6f 62 20 3d 20  {.    *ppBlob = 
b4a0: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
b4b0: 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20  int notUsed;.   
b4c0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61   Tcl_Channel cha
b4d0: 6e 6e 65 6c 3b 0a 20 20 20 20 43 6c 69 65 6e 74  nnel;.    Client
b4e0: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74  Data instanceDat
b4f0: 61 3b 0a 20 20 20 20 0a 20 20 20 20 63 68 61 6e  a;.    .    chan
b500: 6e 65 6c 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  nel = Tcl_GetCha
b510: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 7a 2c 20  nnel(interp, z, 
b520: 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69  &notUsed);.    i
b530: 66 28 20 21 63 68 61 6e 6e 65 6c 20 29 20 72 65  f( !channel ) re
b540: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b550: 0a 20 20 20 20 54 63 6c 5f 46 6c 75 73 68 28 63  .    Tcl_Flush(c
b560: 68 61 6e 6e 65 6c 29 3b 0a 20 20 20 20 54 63 6c  hannel);.    Tcl
b570: 5f 53 65 65 6b 28 63 68 61 6e 6e 65 6c 2c 20 30  _Seek(channel, 0
b580: 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 0a 20 20  , SEEK_SET);..  
b590: 20 20 69 6e 73 74 61 6e 63 65 44 61 74 61 20 3d    instanceData =
b5a0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49   Tcl_GetChannelI
b5b0: 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e  nstanceData(chan
b5c0: 6e 65 6c 29 3b 0a 20 20 20 20 2a 70 70 42 6c 6f  nel);.    *ppBlo
b5d0: 62 20 3d 20 2a 28 28 73 71 6c 69 74 65 33 5f 62  b = *((sqlite3_b
b5e0: 6c 6f 62 20 2a 2a 29 69 6e 73 74 61 6e 63 65 44  lob **)instanceD
b5f0: 61 74 61 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ata);.  }..  ret
b600: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73  urn TCL_OK;.}..s
b610: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
b620: 6c 6f 62 5f 72 65 6f 70 65 6e 28 0a 20 20 43 6c  lob_reopen(.  Cl
b630: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
b640: 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64  ata, /* Not used
b650: 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
b660: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
b670: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
b680: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
b690: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
b6a0: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
b6b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
b6c0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
b6d0: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
b6e0: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
b6f0: 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
b700: 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 57 69  s */.){.  Tcl_Wi
b710: 64 65 49 6e 74 20 69 52 6f 77 69 64 3b 0a 20 20  deInt iRowid;.  
b720: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42  sqlite3_blob *pB
b730: 6c 6f 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  lob;.  int rc;..
b740: 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
b750: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
b760: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
b770: 20 6f 62 6a 76 2c 20 22 43 48 41 4e 4e 45 4c 20   objv, "CHANNEL 
b780: 52 4f 57 49 44 22 29 3b 0a 20 20 20 20 72 65 74  ROWID");.    ret
b790: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b7a0: 20 7d 0a 0a 20 20 69 66 28 20 62 6c 6f 62 48 61   }..  if( blobHa
b7b0: 6e 64 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ndleFromObj(inte
b7c0: 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 70 42  rp, objv[1], &pB
b7d0: 6c 6f 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  lob) ) return TC
b7e0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
b7f0: 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f  cl_GetWideIntFro
b800: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
b810: 76 5b 32 5d 2c 20 26 69 52 6f 77 69 64 29 20 29  v[2], &iRowid) )
b820: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b830: 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
b840: 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 70  e3_blob_reopen(p
b850: 42 6c 6f 62 2c 20 69 52 6f 77 69 64 29 3b 0a 20  Blob, iRowid);. 
b860: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
b870: 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  OK ){.    Tcl_Se
b880: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
b890: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45  (char *)sqlite3E
b8a0: 72 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  rrName(rc), TCL_
b8b0: 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 7d 0a 0a  VOLATILE);.  }..
b8c0: 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
b8d0: 4c 49 54 45 5f 4f 4b 20 3f 20 54 43 4c 5f 4f 4b  LITE_OK ? TCL_OK
b8e0: 20 3a 20 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 7d   : TCL_ERROR);.}
b8f0: 0a 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ..#endif../*.** 
b900: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
b910: 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  reate_collation_
b920: 76 32 20 44 42 2d 48 41 4e 44 4c 45 20 4e 41 4d  v2 DB-HANDLE NAM
b930: 45 20 43 4d 50 2d 50 52 4f 43 20 44 45 4c 2d 50  E CMP-PROC DEL-P
b940: 52 4f 43 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73  ROC.**.**   This
b950: 20 54 63 6c 20 70 72 6f 63 20 69 73 20 75 73 65   Tcl proc is use
b960: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 74 68  d for testing th
b970: 65 20 65 78 70 65 72 69 6d 65 6e 74 61 6c 0a 2a  e experimental.*
b980: 2a 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61  *   sqlite3_crea
b990: 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28  te_collation_v2(
b9a0: 29 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  ) interface..*/.
b9b0: 73 74 72 75 63 74 20 54 65 73 74 43 6f 6c 6c 61  struct TestColla
b9c0: 74 69 6f 6e 58 20 7b 0a 20 20 54 63 6c 5f 49 6e  tionX {.  Tcl_In
b9d0: 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20  terp *interp;.  
b9e0: 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 70 3b 0a 20  Tcl_Obj *pCmp;. 
b9f0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 44 65 6c 3b 0a   Tcl_Obj *pDel;.
ba00: 7d 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  };.typedef struc
ba10: 74 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58  t TestCollationX
ba20: 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 3b   TestCollationX;
ba30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73  .static void tes
ba40: 74 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e  tCreateCollation
ba50: 44 65 6c 28 76 6f 69 64 20 2a 70 43 74 78 29 7b  Del(void *pCtx){
ba60: 0a 20 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e  .  TestCollation
ba70: 58 20 2a 70 20 3d 20 28 54 65 73 74 43 6f 6c 6c  X *p = (TestColl
ba80: 61 74 69 6f 6e 58 20 2a 29 70 43 74 78 3b 0a 0a  ationX *)pCtx;..
ba90: 20 20 69 6e 74 20 72 63 20 3d 20 54 63 6c 5f 45    int rc = Tcl_E
baa0: 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65  valObjEx(p->inte
bab0: 72 70 2c 20 70 2d 3e 70 44 65 6c 2c 20 54 43 4c  rp, p->pDel, TCL
bac0: 5f 45 56 41 4c 5f 44 49 52 45 43 54 7c 54 43 4c  _EVAL_DIRECT|TCL
bad0: 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20  _EVAL_GLOBAL);. 
bae0: 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20   if( rc!=TCL_OK 
baf0: 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b 67  ){.    Tcl_Backg
bb00: 72 6f 75 6e 64 45 72 72 6f 72 28 70 2d 3e 69 6e  roundError(p->in
bb10: 74 65 72 70 29 3b 0a 20 20 7d 0a 0a 20 20 54 63  terp);.  }..  Tc
bb20: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
bb30: 2d 3e 70 43 6d 70 29 3b 0a 20 20 54 63 6c 5f 44  ->pCmp);.  Tcl_D
bb40: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70  ecrRefCount(p->p
bb50: 44 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Del);.  sqlite3_
bb60: 66 72 65 65 28 28 76 6f 69 64 20 2a 29 70 29 3b  free((void *)p);
bb70: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  .}.static int te
bb80: 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f  stCreateCollatio
bb90: 6e 43 6d 70 28 0a 20 20 76 6f 69 64 20 2a 70 43  nCmp(.  void *pC
bba0: 74 78 2c 0a 20 20 69 6e 74 20 6e 4c 65 66 74 2c  tx,.  int nLeft,
bbb0: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
bbc0: 4c 65 66 74 2c 0a 20 20 69 6e 74 20 6e 52 69 67  Left,.  int nRig
bbd0: 68 74 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  ht,.  const void
bbe0: 20 2a 7a 52 69 67 68 74 0a 29 7b 0a 20 20 54 65   *zRight.){.  Te
bbf0: 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 70 20  stCollationX *p 
bc00: 3d 20 28 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e  = (TestCollation
bc10: 58 20 2a 29 70 43 74 78 3b 0a 20 20 54 63 6c 5f  X *)pCtx;.  Tcl_
bc20: 4f 62 6a 20 2a 70 53 63 72 69 70 74 20 3d 20 54  Obj *pScript = T
bc30: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
bc40: 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 69 6e 74 20  p->pCmp);.  int 
bc50: 69 52 65 73 20 3d 20 30 3b 0a 0a 20 20 54 63 6c  iRes = 0;..  Tcl
bc60: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53  _IncrRefCount(pS
bc70: 63 72 69 70 74 29 3b 0a 20 20 54 63 6c 5f 4c 69  cript);.  Tcl_Li
bc80: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
bc90: 6e 74 28 30 2c 20 70 53 63 72 69 70 74 2c 20 54  nt(0, pScript, T
bca0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
bcb0: 28 63 68 61 72 20 2a 29 7a 4c 65 66 74 2c 20 6e  (char *)zLeft, n
bcc0: 4c 65 66 74 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  Left));.  Tcl_Li
bcd0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
bce0: 6e 74 28 30 2c 20 70 53 63 72 69 70 74 2c 20 54  nt(0, pScript, T
bcf0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
bd00: 28 63 68 61 72 20 2a 29 7a 52 69 67 68 74 2c 6e  (char *)zRight,n
bd10: 52 69 67 68 74 29 29 3b 0a 0a 20 20 69 66 28 20  Right));..  if( 
bd20: 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 45 76 61 6c  TCL_OK!=Tcl_Eval
bd30: 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c  ObjEx(p->interp,
bd40: 20 70 53 63 72 69 70 74 2c 20 54 43 4c 5f 45 56   pScript, TCL_EV
bd50: 41 4c 5f 44 49 52 45 43 54 7c 54 43 4c 5f 45 56  AL_DIRECT|TCL_EV
bd60: 41 4c 5f 47 4c 4f 42 41 4c 29 0a 20 20 20 7c 7c  AL_GLOBAL).   ||
bd70: 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74   TCL_OK!=Tcl_Get
bd80: 49 6e 74 46 72 6f 6d 4f 62 6a 28 70 2d 3e 69 6e  IntFromObj(p->in
bd90: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 4f 62 6a  terp, Tcl_GetObj
bda0: 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70  Result(p->interp
bdb0: 29 2c 20 26 69 52 65 73 29 0a 20 20 29 7b 0a 20  ), &iRes).  ){. 
bdc0: 20 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e     Tcl_Backgroun
bdd0: 64 45 72 72 6f 72 28 70 2d 3e 69 6e 74 65 72 70  dError(p->interp
bde0: 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 65 63  );.  }.  Tcl_Dec
bdf0: 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70  rRefCount(pScrip
be00: 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 69 52  t);..  return iR
be10: 65 73 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  es;.}.static int
be20: 20 74 65 73 74 5f 63 72 65 61 74 65 5f 63 6f 6c   test_create_col
be30: 6c 61 74 69 6f 6e 5f 76 32 28 0a 20 20 43 6c 69  lation_v2(.  Cli
be40: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
be50: 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20  ta, /* Not used 
be60: 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
be70: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
be80: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
be90: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
bea0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
beb0: 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
bec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
bed0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
bee0: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
bef0: 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
bf00: 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
bf10: 20 2a 2f 0a 29 7b 0a 20 20 54 65 73 74 43 6f 6c   */.){.  TestCol
bf20: 6c 61 74 69 6f 6e 58 20 2a 70 3b 0a 20 20 73 71  lationX *p;.  sq
bf30: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
bf40: 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
bf50: 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=5 ){.    Tcl_W
bf60: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
bf70: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
bf80: 2d 48 41 4e 44 4c 45 20 4e 41 4d 45 20 43 4d 50  -HANDLE NAME CMP
bf90: 2d 50 52 4f 43 20 44 45 4c 2d 50 52 4f 43 22 29  -PROC DEL-PROC")
bfa0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
bfb0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
bfc0: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
bfd0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
bfe0: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
bff0: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
c000: 5f 45 52 52 4f 52 3b 0a 0a 20 20 70 20 3d 20 28  _ERROR;..  p = (
c010: 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a  TestCollationX *
c020: 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
c030: 73 69 7a 65 6f 66 28 54 65 73 74 43 6f 6c 6c 61  sizeof(TestColla
c040: 74 69 6f 6e 58 29 29 3b 0a 20 20 70 2d 3e 70 43  tionX));.  p->pC
c050: 6d 70 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20  mp = objv[3];.  
c060: 70 2d 3e 70 44 65 6c 20 3d 20 6f 62 6a 76 5b 34  p->pDel = objv[4
c070: 5d 3b 0a 20 20 70 2d 3e 69 6e 74 65 72 70 20 3d  ];.  p->interp =
c080: 20 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 49   interp;.  Tcl_I
c090: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70  ncrRefCount(p->p
c0a0: 43 6d 70 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72  Cmp);.  Tcl_Incr
c0b0: 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 44 65 6c  RefCount(p->pDel
c0c0: 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
c0d0: 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
c0e0: 69 6f 6e 5f 76 32 28 64 62 2c 20 54 63 6c 5f 47  ion_v2(db, Tcl_G
c0f0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
c100: 29 2c 20 31 36 2c 20 0a 20 20 20 20 20 20 28 76  ), 16, .      (v
c110: 6f 69 64 20 2a 29 70 2c 20 74 65 73 74 43 72 65  oid *)p, testCre
c120: 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 43 6d 70 2c  ateCollationCmp,
c130: 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61   testCreateColla
c140: 74 69 6f 6e 44 65 6c 0a 20 20 29 3b 0a 20 20 69  tionDel.  );.  i
c150: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4d 49  f( rc!=SQLITE_MI
c160: 53 55 53 45 20 29 7b 0a 20 20 20 20 54 63 6c 5f  SUSE ){.    Tcl_
c170: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
c180: 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 63 72  erp, "sqlite3_cr
c190: 65 61 74 65 5f 63 6f 6c 6c 61 74 65 5f 76 32 28  eate_collate_v2(
c1a0: 29 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65  ) failed to dete
c1b0: 63 74 20 22 0a 20 20 20 20 20 20 22 61 6e 20 69  ct ".      "an i
c1c0: 6e 76 61 6c 69 64 20 65 6e 63 6f 64 69 6e 67 22  nvalid encoding"
c1d0: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
c1e0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
c1f0: 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  R;.  }.  rc = sq
c200: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
c210: 6c 61 74 69 6f 6e 5f 76 32 28 64 62 2c 20 54 63  lation_v2(db, Tc
c220: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
c230: 5b 32 5d 29 2c 20 53 51 4c 49 54 45 5f 55 54 46  [2]), SQLITE_UTF
c240: 38 2c 20 0a 20 20 20 20 20 20 28 76 6f 69 64 20  8, .      (void 
c250: 2a 29 70 2c 20 74 65 73 74 43 72 65 61 74 65 43  *)p, testCreateC
c260: 6f 6c 6c 61 74 69 6f 6e 43 6d 70 2c 20 74 65 73  ollationCmp, tes
c270: 74 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e  tCreateCollation
c280: 44 65 6c 0a 20 20 29 3b 0a 20 20 72 65 74 75 72  Del.  );.  retur
c290: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
c2a0: 2a 2a 20 55 53 41 47 45 3a 20 73 71 6c 69 74 65  ** USAGE: sqlite
c2b0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
c2c0: 6e 5f 76 32 20 44 42 20 4e 41 4d 45 20 4e 41 52  n_v2 DB NAME NAR
c2d0: 47 20 45 4e 43 20 3f 53 57 49 54 43 48 45 53 3f  G ENC ?SWITCHES?
c2e0: 0a 2a 2a 0a 2a 2a 20 41 76 61 69 6c 61 62 6c 65  .**.** Available
c2f0: 20 73 77 69 74 63 68 65 73 20 61 72 65 3a 0a 2a   switches are:.*
c300: 2a 0a 2a 2a 20 20 20 2d 66 75 6e 63 20 20 20 20  *.**   -func    
c310: 53 43 52 49 50 54 0a 2a 2a 20 20 20 2d 73 74 65  SCRIPT.**   -ste
c320: 70 20 20 20 20 53 43 52 49 50 54 0a 2a 2a 20 20  p    SCRIPT.**  
c330: 20 2d 66 69 6e 61 6c 20 20 20 53 43 52 49 50 54   -final   SCRIPT
c340: 0a 2a 2a 20 20 20 2d 64 65 73 74 72 6f 79 20 53  .**   -destroy S
c350: 43 52 49 50 54 0a 2a 2f 0a 74 79 70 65 64 65 66  CRIPT.*/.typedef
c360: 20 73 74 72 75 63 74 20 43 72 65 61 74 65 46 75   struct CreateFu
c370: 6e 63 74 69 6f 6e 56 32 20 43 72 65 61 74 65 46  nctionV2 CreateF
c380: 75 6e 63 74 69 6f 6e 56 32 3b 0a 73 74 72 75 63  unctionV2;.struc
c390: 74 20 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e  t CreateFunction
c3a0: 56 32 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  V2 {.  Tcl_Inter
c3b0: 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c  p *interp;.  Tcl
c3c0: 5f 4f 62 6a 20 2a 70 46 75 6e 63 3b 20 20 20 20  _Obj *pFunc;    
c3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c3e0: 53 63 72 69 70 74 20 66 6f 72 20 66 75 6e 63 74  Script for funct
c3f0: 69 6f 6e 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a  ion invocation *
c400: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 74  /.  Tcl_Obj *pSt
c410: 65 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ep;             
c420: 20 20 20 20 2f 2a 20 53 63 72 69 70 74 20 66 6f      /* Script fo
c430: 72 20 61 67 67 2e 20 73 74 65 70 20 69 6e 76 6f  r agg. step invo
c440: 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  cation */.  Tcl_
c450: 4f 62 6a 20 2a 70 46 69 6e 61 6c 3b 20 20 20 20  Obj *pFinal;    
c460: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
c470: 63 72 69 70 74 20 66 6f 72 20 61 67 67 2e 20 66  cript for agg. f
c480: 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 69 6e 76 6f  inalization invo
c490: 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  cation */.  Tcl_
c4a0: 4f 62 6a 20 2a 70 44 65 73 74 72 6f 79 3b 20 20  Obj *pDestroy;  
c4b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
c4c0: 65 73 74 72 75 63 74 6f 72 20 73 63 72 69 70 74  estructor script
c4d0: 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 76 6f   */.};.static vo
c4e0: 69 64 20 63 66 32 46 75 6e 63 28 73 71 6c 69 74  id cf2Func(sqlit
c4f0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c  e3_context *ctx,
c500: 20 69 6e 74 20 6e 41 72 67 2c 20 73 71 6c 69 74   int nArg, sqlit
c510: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 41 72 67 29  e3_value **aArg)
c520: 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  {.}.static void 
c530: 63 66 32 53 74 65 70 28 73 71 6c 69 74 65 33 5f  cf2Step(sqlite3_
c540: 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 69 6e  context *ctx, in
c550: 74 20 6e 41 72 67 2c 20 73 71 6c 69 74 65 33 5f  t nArg, sqlite3_
c560: 76 61 6c 75 65 20 2a 2a 61 41 72 67 29 7b 0a 7d  value **aArg){.}
c570: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 66 32  .static void cf2
c580: 46 69 6e 61 6c 28 73 71 6c 69 74 65 33 5f 63 6f  Final(sqlite3_co
c590: 6e 74 65 78 74 20 2a 63 74 78 29 7b 0a 7d 0a 73  ntext *ctx){.}.s
c5a0: 74 61 74 69 63 20 76 6f 69 64 20 63 66 32 44 65  tatic void cf2De
c5b0: 73 74 72 6f 79 28 76 6f 69 64 20 2a 70 55 73 65  stroy(void *pUse
c5c0: 72 29 7b 0a 20 20 43 72 65 61 74 65 46 75 6e 63  r){.  CreateFunc
c5d0: 74 69 6f 6e 56 32 20 2a 70 20 3d 20 28 43 72 65  tionV2 *p = (Cre
c5e0: 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 20 2a 29  ateFunctionV2 *)
c5f0: 70 55 73 65 72 3b 0a 0a 20 20 69 66 28 20 70 2d  pUser;..  if( p-
c600: 3e 69 6e 74 65 72 70 20 26 26 20 70 2d 3e 70 44  >interp && p->pD
c610: 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 69 6e  estroy ){.    in
c620: 74 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f  t rc = Tcl_EvalO
c630: 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20  bjEx(p->interp, 
c640: 70 2d 3e 70 44 65 73 74 72 6f 79 2c 20 30 29 3b  p->pDestroy, 0);
c650: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 54 43 4c  .    if( rc!=TCL
c660: 5f 4f 4b 20 29 20 54 63 6c 5f 42 61 63 6b 67 72  _OK ) Tcl_Backgr
c670: 6f 75 6e 64 45 72 72 6f 72 28 70 2d 3e 69 6e 74  oundError(p->int
c680: 65 72 70 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  erp);.  }..  if(
c690: 20 70 2d 3e 70 46 75 6e 63 20 29 20 54 63 6c 5f   p->pFunc ) Tcl_
c6a0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e  DecrRefCount(p->
c6b0: 70 46 75 6e 63 29 3b 20 0a 20 20 69 66 28 20 70  pFunc); .  if( p
c6c0: 2d 3e 70 53 74 65 70 20 29 20 54 63 6c 5f 44 65  ->pStep ) Tcl_De
c6d0: 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 53  crRefCount(p->pS
c6e0: 74 65 70 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e  tep); .  if( p->
c6f0: 70 46 69 6e 61 6c 20 29 20 54 63 6c 5f 44 65 63  pFinal ) Tcl_Dec
c700: 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 46 69  rRefCount(p->pFi
c710: 6e 61 6c 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e  nal); .  if( p->
c720: 70 44 65 73 74 72 6f 79 20 29 20 54 63 6c 5f 44  pDestroy ) Tcl_D
c730: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70  ecrRefCount(p->p
c740: 44 65 73 74 72 6f 79 29 3b 20 0a 20 20 73 71 6c  Destroy); .  sql
c750: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a  ite3_free(p);.}.
c760: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
c770: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
c780: 76 32 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  v2(.  ClientData
c790: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20   clientData,    
c7a0: 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65        /* Not use
c7b0: 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  d */.  Tcl_Inter
c7c0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 20 20  p *interp,      
c7d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
c7e0: 76 6f 6b 69 6e 67 20 54 43 4c 20 69 6e 74 65 72  voking TCL inter
c7f0: 70 72 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  preter */.  int 
c800: 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
c810: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
c820: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
c830: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
c840: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 20  *CONST objv[]   
c850: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 61          /* Comma
c860: 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
c870: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
c880: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
c890: 7a 46 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 41 72  zFunc;.  int nAr
c8a0: 67 3b 0a 20 20 69 6e 74 20 65 6e 63 3b 0a 20 20  g;.  int enc;.  
c8b0: 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32  CreateFunctionV2
c8c0: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
c8d0: 69 6e 74 20 72 63 3b 0a 0a 20 20 73 74 72 75 63  int rc;..  struc
c8e0: 74 20 45 6e 63 54 61 62 6c 65 20 7b 0a 20 20 20  t EncTable {.   
c8f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e   const char *zEn
c900: 63 3b 0a 20 20 20 20 69 6e 74 20 65 6e 63 3b 0a  c;.    int enc;.
c910: 20 20 7d 20 61 45 6e 63 5b 5d 20 3d 20 7b 0a 20    } aEnc[] = {. 
c920: 20 20 20 7b 22 75 74 66 38 22 2c 20 20 20 20 53     {"utf8",    S
c930: 51 4c 49 54 45 5f 55 54 46 38 20 7d 2c 0a 20 20  QLITE_UTF8 },.  
c940: 20 20 7b 22 75 74 66 31 36 22 2c 20 20 20 53 51    {"utf16",   SQ
c950: 4c 49 54 45 5f 55 54 46 31 36 20 7d 2c 0a 20 20  LITE_UTF16 },.  
c960: 20 20 7b 22 75 74 66 31 36 6c 65 22 2c 20 53 51    {"utf16le", SQ
c970: 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 7d 2c 0a  LITE_UTF16LE },.
c980: 20 20 20 20 7b 22 75 74 66 31 36 62 65 22 2c 20      {"utf16be", 
c990: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 7d  SQLITE_UTF16BE }
c9a0: 2c 0a 20 20 20 20 7b 22 61 6e 79 22 2c 20 20 20  ,.    {"any",   
c9b0: 20 20 53 51 4c 49 54 45 5f 41 4e 59 20 7d 2c 0a    SQLITE_ANY },.
c9c0: 20 20 20 20 7b 22 30 22 2c 20 30 20 7d 0a 20 20      {"0", 0 }.  
c9d0: 7d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3c 35  };..  if( objc<5
c9e0: 20 7c 7c 20 28 6f 62 6a 63 25 32 29 3d 3d 30 20   || (objc%2)==0 
c9f0: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
ca00: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
ca10: 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 4e 41 4d  1, objv, "DB NAM
ca20: 45 20 4e 41 52 47 20 45 4e 43 20 53 57 49 54 43  E NARG ENC SWITC
ca30: 48 45 53 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65  HES...");.    re
ca40: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
ca50: 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 44 62    }..  if( getDb
ca60: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
ca70: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
ca80: 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
ca90: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
caa0: 0a 20 20 7a 46 75 6e 63 20 3d 20 54 63 6c 5f 47  .  zFunc = Tcl_G
cab0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
cac0: 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  );.  if( Tcl_Get
cad0: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
cae0: 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 41 72  p, objv[3], &nAr
caf0: 67 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  g) ) return TCL_
cb00: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
cb10: 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a  _GetIndexFromObj
cb20: 53 74 72 75 63 74 28 69 6e 74 65 72 70 2c 20 6f  Struct(interp, o
cb30: 62 6a 76 5b 34 5d 2c 20 61 45 6e 63 2c 20 73 69  bjv[4], aEnc, si
cb40: 7a 65 6f 66 28 61 45 6e 63 5b 30 5d 29 2c 20 0a  zeof(aEnc[0]), .
cb50: 20 20 20 20 20 20 20 20 20 20 22 65 6e 63 6f 64            "encod
cb60: 69 6e 67 22 2c 20 30 2c 20 26 65 6e 63 29 0a 20  ing", 0, &enc). 
cb70: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
cb80: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
cb90: 65 6e 63 20 3d 20 61 45 6e 63 5b 65 6e 63 5d 2e  enc = aEnc[enc].
cba0: 65 6e 63 3b 0a 0a 20 20 70 20 3d 20 73 71 6c 69  enc;..  p = sqli
cbb0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
cbc0: 66 28 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e  f(CreateFunction
cbd0: 56 32 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  V2));.  assert( 
cbe0: 70 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  p );.  memset(p,
cbf0: 20 30 2c 20 73 69 7a 65 6f 66 28 43 72 65 61 74   0, sizeof(Creat
cc00: 65 46 75 6e 63 74 69 6f 6e 56 32 29 29 3b 0a 20  eFunctionV2));. 
cc10: 20 70 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74   p->interp = int
cc20: 65 72 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 35 3b  erp;..  for(i=5;
cc30: 20 69 3c 6f 62 6a 63 3b 20 69 2b 3d 32 29 7b 0a   i<objc; i+=2){.
cc40: 20 20 20 20 69 6e 74 20 69 53 77 69 74 63 68 3b      int iSwitch;
cc50: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
cc60: 2a 61 7a 53 77 69 74 63 68 5b 5d 20 3d 20 7b 22  *azSwitch[] = {"
cc70: 2d 66 75 6e 63 22 2c 20 22 2d 73 74 65 70 22 2c  -func", "-step",
cc80: 20 22 2d 66 69 6e 61 6c 22 2c 20 22 2d 64 65 73   "-final", "-des
cc90: 74 72 6f 79 22 2c 20 30 7d 3b 0a 20 20 20 20 69  troy", 0};.    i
cca0: 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46  f( Tcl_GetIndexF
ccb0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
ccc0: 62 6a 76 5b 69 5d 2c 20 61 7a 53 77 69 74 63 68  bjv[i], azSwitch
ccd0: 2c 20 22 73 77 69 74 63 68 22 2c 20 30 2c 20 26  , "switch", 0, &
cce0: 69 53 77 69 74 63 68 29 20 29 7b 0a 20 20 20 20  iSwitch) ){.    
ccf0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
cd00: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
cd10: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
cd20: 0a 0a 20 20 20 20 73 77 69 74 63 68 28 20 69 53  ..    switch( iS
cd30: 77 69 74 63 68 20 29 7b 0a 20 20 20 20 20 20 63  witch ){.      c
cd40: 61 73 65 20 30 3a 20 70 2d 3e 70 46 75 6e 63 20  ase 0: p->pFunc 
cd50: 3d 20 6f 62 6a 76 5b 69 2b 31 5d 3b 20 20 20 20  = objv[i+1];    
cd60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
cd70: 61 73 65 20 31 3a 20 70 2d 3e 70 53 74 65 70 20  ase 1: p->pStep 
cd80: 3d 20 6f 62 6a 76 5b 69 2b 31 5d 3b 20 20 20 20  = objv[i+1];    
cd90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
cda0: 61 73 65 20 32 3a 20 70 2d 3e 70 46 69 6e 61 6c  ase 2: p->pFinal
cdb0: 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d 3b 20 20 20   = objv[i+1];   
cdc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
cdd0: 61 73 65 20 33 3a 20 70 2d 3e 70 44 65 73 74 72  ase 3: p->pDestr
cde0: 6f 79 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d 3b 20  oy = objv[i+1]; 
cdf0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
ce00: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 46 75 6e   }.  if( p->pFun
ce10: 63 20 29 20 70 2d 3e 70 46 75 6e 63 20 3d 20 54  c ) p->pFunc = T
ce20: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
ce30: 70 2d 3e 70 46 75 6e 63 29 3b 20 0a 20 20 69 66  p->pFunc); .  if
ce40: 28 20 70 2d 3e 70 53 74 65 70 20 29 20 70 2d 3e  ( p->pStep ) p->
ce50: 70 53 74 65 70 20 3d 20 54 63 6c 5f 44 75 70 6c  pStep = Tcl_Dupl
ce60: 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70 53 74 65  icateObj(p->pSte
ce70: 70 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 46  p); .  if( p->pF
ce80: 69 6e 61 6c 20 29 20 70 2d 3e 70 46 69 6e 61 6c  inal ) p->pFinal
ce90: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
cea0: 4f 62 6a 28 70 2d 3e 70 46 69 6e 61 6c 29 3b 20  Obj(p->pFinal); 
ceb0: 0a 20 20 69 66 28 20 70 2d 3e 70 44 65 73 74 72  .  if( p->pDestr
cec0: 6f 79 20 29 20 70 2d 3e 70 44 65 73 74 72 6f 79  oy ) p->pDestroy
ced0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
cee0: 4f 62 6a 28 70 2d 3e 70 44 65 73 74 72 6f 79 29  Obj(p->pDestroy)
cef0: 3b 20 0a 0a 20 20 69 66 28 20 70 2d 3e 70 46 75  ; ..  if( p->pFu
cf00: 6e 63 20 29 20 54 63 6c 5f 49 6e 63 72 52 65 66  nc ) Tcl_IncrRef
cf10: 43 6f 75 6e 74 28 70 2d 3e 70 46 75 6e 63 29 3b  Count(p->pFunc);
cf20: 20 0a 20 20 69 66 28 20 70 2d 3e 70 53 74 65 70   .  if( p->pStep
cf30: 20 29 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f   ) Tcl_IncrRefCo
cf40: 75 6e 74 28 70 2d 3e 70 53 74 65 70 29 3b 20 0a  unt(p->pStep); .
cf50: 20 20 69 66 28 20 70 2d 3e 70 46 69 6e 61 6c 20    if( p->pFinal 
cf60: 29 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75  ) Tcl_IncrRefCou
cf70: 6e 74 28 70 2d 3e 70 46 69 6e 61 6c 29 3b 20 0a  nt(p->pFinal); .
cf80: 20 20 69 66 28 20 70 2d 3e 70 44 65 73 74 72 6f    if( p->pDestro
cf90: 79 20 29 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  y ) Tcl_IncrRefC
cfa0: 6f 75 6e 74 28 70 2d 3e 70 44 65 73 74 72 6f 79  ount(p->pDestroy
cfb0: 29 3b 20 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  ); ..  rc = sqli
cfc0: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
cfd0: 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 46 75 6e 63  ion_v2(db, zFunc
cfe0: 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 28 76 6f  , nArg, enc, (vo
cff0: 69 64 20 2a 29 70 2c 20 0a 20 20 20 20 20 20 28  id *)p, .      (
d000: 70 2d 3e 70 46 75 6e 63 20 3f 20 63 66 32 46 75  p->pFunc ? cf2Fu
d010: 6e 63 20 3a 20 30 29 2c 0a 20 20 20 20 20 20 28  nc : 0),.      (
d020: 70 2d 3e 70 53 74 65 70 20 3f 20 63 66 32 53 74  p->pStep ? cf2St
d030: 65 70 20 3a 20 30 29 2c 0a 20 20 20 20 20 20 28  ep : 0),.      (
d040: 70 2d 3e 70 46 69 6e 61 6c 20 3f 20 63 66 32 46  p->pFinal ? cf2F
d050: 69 6e 61 6c 20 3a 20 30 29 2c 0a 20 20 20 20 20  inal : 0),.     
d060: 20 63 66 32 44 65 73 74 72 6f 79 0a 20 20 29 3b   cf2Destroy.  );
d070: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
d080: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
d090: 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65  ResetResult(inte
d0a0: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70  rp);.    Tcl_App
d0b0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
d0c0: 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
d0d0: 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (rc), 0);.    re
d0e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d0f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
d100: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
d110: 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6c 6f 61  age: sqlite3_loa
d120: 64 5f 65 78 74 65 6e 73 69 6f 6e 20 44 42 2d 48  d_extension DB-H
d130: 41 4e 44 4c 45 20 46 49 4c 45 20 3f 50 52 4f 43  ANDLE FILE ?PROC
d140: 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ?.*/.static int 
d150: 74 65 73 74 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  test_load_extens
d160: 69 6f 6e 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  ion(.  ClientDat
d170: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
d180: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54   Not used */.  T
d190: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
d1a0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
d1b0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
d1c0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
d1d0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
d1e0: 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
d1f0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
d200: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
d210: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
d220: 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
d230: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
d240: 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63  .  Tcl_CmdInfo c
d250: 6d 64 49 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65  mdInfo;.  sqlite
d260: 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
d270: 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20  .  char *zDb;.  
d280: 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63  char *zFile;.  c
d290: 68 61 72 20 2a 7a 50 72 6f 63 20 3d 20 30 3b 0a  har *zProc = 0;.
d2a0: 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30    char *zErr = 0
d2b0: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  ;..  if( objc!=4
d2c0: 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20   && objc!=3 ){. 
d2d0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
d2e0: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
d2f0: 62 6a 76 2c 20 22 44 42 2d 48 41 4e 44 4c 45 20  bjv, "DB-HANDLE 
d300: 46 49 4c 45 20 3f 50 52 4f 43 3f 22 29 3b 0a 20  FILE ?PROC?");. 
d310: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
d320: 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62 20 3d  ROR;.  }.  zDb =
d330: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
d340: 62 6a 76 5b 31 5d 29 3b 0a 20 20 7a 46 69 6c 65  bjv[1]);.  zFile
d350: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
d360: 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28  (objv[2]);.  if(
d370: 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20   objc==4 ){.    
d380: 7a 50 72 6f 63 20 3d 20 54 63 6c 5f 47 65 74 53  zProc = Tcl_GetS
d390: 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a  tring(objv[3]);.
d3a0: 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63    }..  /* Extrac
d3b0: 74 20 74 68 65 20 43 20 64 61 74 61 62 61 73 65  t the C database
d3c0: 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 74 68 65   handle from the
d3d0: 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d   Tcl command nam
d3e0: 65 20 2a 2f 0a 20 20 69 66 28 20 21 54 63 6c 5f  e */.  if( !Tcl_
d3f0: 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69  GetCommandInfo(i
d400: 6e 74 65 72 70 2c 20 7a 44 62 2c 20 26 63 6d 64  nterp, zDb, &cmd
d410: 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c  Info) ){.    Tcl
d420: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
d430: 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20 6e  terp, "command n
d440: 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 20 7a 44 62  ot found: ", zDb
d450: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
d460: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
d470: 52 3b 0a 20 20 7d 0a 20 20 64 62 20 3d 20 28 28  R;.  }.  db = ((
d480: 73 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 2a  struct SqliteDb*
d490: 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65  )cmdInfo.objClie
d4a0: 6e 74 44 61 74 61 29 2d 3e 64 62 3b 0a 20 20 61  ntData)->db;.  a
d4b0: 73 73 65 72 74 28 64 62 29 3b 0a 0a 20 20 2f 2a  ssert(db);..  /*
d4c0: 20 43 61 6c 6c 20 74 68 65 20 75 6e 64 65 72 6c   Call the underl
d4d0: 79 69 6e 67 20 43 20 66 75 6e 63 74 69 6f 6e 2e  ying C function.
d4e0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
d4f0: 75 72 73 2c 20 73 65 74 20 72 63 20 74 6f 20 0a  urs, set rc to .
d500: 20 20 2a 2a 20 54 43 4c 5f 45 52 52 4f 52 20 61    ** TCL_ERROR a
d510: 6e 64 20 6c 6f 61 64 20 61 6e 79 20 65 72 72 6f  nd load any erro
d520: 72 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 74 68  r string into th
d530: 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20 49  e interpreter. I
d540: 66 20 6e 6f 20 0a 20 20 2a 2a 20 65 72 72 6f 72  f no .  ** error
d550: 20 6f 63 63 75 72 73 2c 20 73 65 74 20 72 63 20   occurs, set rc 
d560: 74 6f 20 54 43 4c 5f 4f 4b 2e 0a 20 20 2a 2f 0a  to TCL_OK..  */.
d570: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
d580: 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
d590: 4e 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  N.  rc = SQLITE_
d5a0: 45 52 52 4f 52 3b 0a 20 20 7a 45 72 72 20 3d 20  ERROR;.  zErr = 
d5b0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
d5c0: 22 74 68 69 73 20 62 75 69 6c 64 20 6f 6d 69 74  "this build omit
d5d0: 73 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65  s sqlite3_load_e
d5e0: 78 74 65 6e 73 69 6f 6e 28 29 22 29 3b 0a 23 65  xtension()");.#e
d5f0: 6c 73 65 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  lse.  rc = sqlit
d600: 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  e3_load_extensio
d610: 6e 28 64 62 2c 20 7a 46 69 6c 65 2c 20 7a 50 72  n(db, zFile, zPr
d620: 6f 63 2c 20 26 7a 45 72 72 29 3b 0a 23 65 6e 64  oc, &zErr);.#end
d630: 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  if.  if( rc!=SQL
d640: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
d650: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
d660: 72 70 2c 20 7a 45 72 72 20 3f 20 7a 45 72 72 20  rp, zErr ? zErr 
d670: 3a 20 22 22 2c 20 54 43 4c 5f 56 4f 4c 41 54 49  : "", TCL_VOLATI
d680: 4c 45 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 43  LE);.    rc = TC
d690: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65  L_ERROR;.  }else
d6a0: 7b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f  {.    rc = TCL_O
d6b0: 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  K;.  }.  sqlite3
d6c0: 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 0a 20 20  _free(zErr);..  
d6d0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
d6e0: 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
d6f0: 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65  e3_enable_load_e
d700: 78 74 65 6e 73 69 6f 6e 20 44 42 2d 48 41 4e 44  xtension DB-HAND
d710: 4c 45 20 4f 4e 4f 46 46 0a 2a 2f 0a 73 74 61 74  LE ONOFF.*/.stat
d720: 69 63 20 69 6e 74 20 74 65 73 74 5f 65 6e 61 62  ic int test_enab
d730: 6c 65 5f 6c 6f 61 64 28 0a 20 20 43 6c 69 65 6e  le_load(.  Clien
d740: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
d750: 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f  , /* Not used */
d760: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
d770: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
d780: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
d790: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
d7a0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
d7b0: 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
d7c0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
d7d0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
d7e0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
d7f0: 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
d800: 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
d810: 2f 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e  /.){.  Tcl_CmdIn
d820: 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 73 71  fo cmdInfo;.  sq
d830: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61  lite3 *db;.  cha
d840: 72 20 2a 7a 44 62 3b 0a 20 20 69 6e 74 20 6f 6e  r *zDb;.  int on
d850: 6f 66 66 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  off;..  if( objc
d860: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=3 ){.    Tcl_W
d870: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
d880: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
d890: 2d 48 41 4e 44 4c 45 20 4f 4e 4f 46 46 22 29 3b  -HANDLE ONOFF");
d8a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
d8b0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62  ERROR;.  }.  zDb
d8c0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
d8d0: 28 6f 62 6a 76 5b 31 5d 29 3b 0a 0a 20 20 2f 2a  (objv[1]);..  /*
d8e0: 20 45 78 74 72 61 63 74 20 74 68 65 20 43 20 64   Extract the C d
d8f0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 66  atabase handle f
d900: 72 6f 6d 20 74 68 65 20 54 63 6c 20 63 6f 6d 6d  rom the Tcl comm
d910: 61 6e 64 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 66  and name */.  if
d920: 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e  ( !Tcl_GetComman
d930: 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 7a 44  dInfo(interp, zD
d940: 62 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a  b, &cmdInfo) ){.
d950: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
d960: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f  sult(interp, "co
d970: 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e 64 3a  mmand not found:
d980: 20 22 2c 20 7a 44 62 2c 20 28 63 68 61 72 2a 29   ", zDb, (char*)
d990: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
d9a0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
d9b0: 64 62 20 3d 20 28 28 73 74 72 75 63 74 20 53 71  db = ((struct Sq
d9c0: 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e  liteDb*)cmdInfo.
d9d0: 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61 29 2d 3e  objClientData)->
d9e0: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 64 62 29  db;.  assert(db)
d9f0: 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20  ;..  /* Get the 
da00: 6f 6e 6f 66 66 20 70 61 72 61 6d 65 74 65 72 20  onoff parameter 
da10: 2a 2f 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  */.  if( Tcl_Get
da20: 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
da30: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
da40: 26 6f 6e 6f 66 66 29 20 29 7b 0a 20 20 20 20 72  &onoff) ){.    r
da50: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
da60: 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
da70: 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
da80: 54 45 4e 53 49 4f 4e 0a 20 20 54 63 6c 5f 41 70  TENSION.  Tcl_Ap
da90: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
daa0: 70 2c 20 22 74 68 69 73 20 62 75 69 6c 64 20 6f  p, "this build o
dab0: 6d 69 74 73 20 73 71 6c 69 74 65 33 5f 6c 6f 61  mits sqlite3_loa
dac0: 64 5f 65 78 74 65 6e 73 69 6f 6e 28 29 22 29 3b  d_extension()");
dad0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  .  return TCL_ER
dae0: 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c  ROR;.#else.  sql
daf0: 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64  ite3_enable_load
db00: 5f 65 78 74 65 6e 73 69 6f 6e 28 64 62 2c 20 6f  _extension(db, o
db10: 6e 6f 66 66 29 3b 0a 20 20 72 65 74 75 72 6e 20  noff);.  return 
db20: 54 43 4c 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d  TCL_OK;.#endif.}
db30: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
db40: 73 71 6c 69 74 65 5f 61 62 6f 72 74 0a 2a 2a 0a  sqlite_abort.**.
db50: 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20  ** Shutdown the 
db60: 70 72 6f 63 65 73 73 20 69 6d 6d 65 64 69 61 74  process immediat
db70: 65 6c 79 2e 20 20 54 68 69 73 20 69 73 20 6e 6f  ely.  This is no
db80: 74 20 61 20 63 6c 65 61 6e 20 73 68 75 74 64 6f  t a clean shutdo
db90: 77 6e 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d  wn..** This comm
dba0: 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 74  and is used to t
dbb0: 65 73 74 20 74 68 65 20 72 65 63 6f 76 65 72 61  est the recovera
dbc0: 62 69 6c 69 74 79 20 6f 66 20 61 20 64 61 74 61  bility of a data
dbd0: 62 61 73 65 20 69 6e 0a 2a 2a 20 74 68 65 20 65  base in.** the e
dbe0: 76 65 6e 74 20 6f 66 20 61 20 70 72 6f 67 72 61  vent of a progra
dbf0: 6d 20 63 72 61 73 68 2e 0a 2a 2f 0a 73 74 61 74  m crash..*/.stat
dc00: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f 61 62  ic int sqlite_ab
dc10: 6f 72 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  ort(.  void *Not
dc20: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
dc30: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
dc40: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
dc50: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
dc60: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
dc70: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
dc80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
dc90: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
dca0: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
dcb0: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
dcc0: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
dcd0: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69  rgument */.){.#i
dce0: 66 20 64 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56  f defined(_MSC_V
dcf0: 45 52 29 0a 20 20 2f 2a 20 57 65 20 64 6f 20 74  ER).  /* We do t
dd00: 68 69 73 2c 20 6f 74 68 65 72 77 69 73 65 20 74  his, otherwise t
dd10: 68 65 20 74 65 73 74 20 77 69 6c 6c 20 68 61 6c  he test will hal
dd20: 74 20 77 69 74 68 20 61 20 70 6f 70 75 70 20 6d  t with a popup m
dd30: 65 73 73 61 67 65 0a 20 20 20 2a 20 74 68 61 74  essage.   * that
dd40: 20 77 65 20 68 61 76 65 20 74 6f 20 63 6c 69 63   we have to clic
dd50: 6b 20 61 77 61 79 20 62 65 66 6f 72 65 20 74 68  k away before th
dd60: 65 20 74 65 73 74 20 77 69 6c 6c 20 63 6f 6e 74  e test will cont
dd70: 69 6e 75 65 2e 0a 20 20 20 2a 2f 0a 20 20 5f 73  inue..   */.  _s
dd80: 65 74 5f 61 62 6f 72 74 5f 62 65 68 61 76 69 6f  et_abort_behavio
dd90: 72 28 20 30 2c 20 5f 43 41 4c 4c 5f 52 45 50 4f  r( 0, _CALL_REPO
dda0: 52 54 46 41 55 4c 54 20 29 3b 0a 23 65 6e 64 69  RTFAULT );.#endi
ddb0: 66 0a 20 20 65 78 69 74 28 32 35 35 29 3b 0a 20  f.  exit(255);. 
ddc0: 20 61 73 73 65 72 74 28 20 69 6e 74 65 72 70 3d   assert( interp=
ddd0: 3d 30 20 29 3b 20 20 20 2f 2a 20 54 68 69 73 20  =0 );   /* This 
dde0: 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c  will always fail
ddf0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   */.  return TCL
de00: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
de10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
de20: 69 6e 65 20 69 73 20 61 20 75 73 65 72 2d 64 65  ine is a user-de
de30: 66 69 6e 65 64 20 53 51 4c 20 66 75 6e 63 74 69  fined SQL functi
de40: 6f 6e 20 77 68 6f 73 65 20 70 75 72 70 6f 73 65  on whose purpose
de50: 0a 2a 2a 20 69 73 20 74 6f 20 74 65 73 74 20 74  .** is to test t
de60: 68 65 20 73 71 6c 69 74 65 5f 73 65 74 5f 72 65  he sqlite_set_re
de70: 73 75 6c 74 28 29 20 41 50 49 2e 0a 2a 2f 0a 73  sult() API..*/.s
de80: 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 46  tatic void testF
de90: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
dea0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e  ext *context, in
deb0: 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
dec0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20  value **argv){. 
ded0: 20 77 68 69 6c 65 28 20 61 72 67 63 3e 3d 32 20   while( argc>=2 
dee0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
def0: 72 20 2a 7a 41 72 67 30 20 3d 20 28 63 68 61 72  r *zArg0 = (char
df00: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
df10: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
df20: 20 20 20 69 66 28 20 7a 41 72 67 30 20 29 7b 0a     if( zArg0 ){.
df30: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
df40: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67  ite3StrICmp(zArg
df50: 30 2c 20 22 69 6e 74 22 29 20 29 7b 0a 20 20 20  0, "int") ){.   
df60: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
df70: 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c  ult_int(context,
df80: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
df90: 6e 74 28 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20  nt(argv[1]));.  
dfa0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
dfb0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72  lite3StrICmp(zAr
dfc0: 67 30 2c 22 69 6e 74 36 34 22 29 3d 3d 30 20 29  g0,"int64")==0 )
dfd0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
dfe0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63  3_result_int64(c
dff0: 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f  ontext, sqlite3_
e000: 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76  value_int64(argv
e010: 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  [1]));.      }el
e020: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  se if( sqlite3St
e030: 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 73 74 72  rICmp(zArg0,"str
e040: 69 6e 67 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ing")==0 ){.    
e050: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
e060: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
e070: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
e080: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
e090: 31 5d 29 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20  1]), -1,.       
e0a0: 20 20 20 20 20 53 51 4c 49 54 45 5f 54 52 41 4e       SQLITE_TRAN
e0b0: 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 65  SIENT);.      }e
e0c0: 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53  lse if( sqlite3S
e0d0: 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 64 6f  trICmp(zArg0,"do
e0e0: 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  uble")==0 ){.   
e0f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
e100: 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65  ult_double(conte
e110: 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  xt, sqlite3_valu
e120: 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 31 5d  e_double(argv[1]
e130: 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ));.      }else 
e140: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
e150: 6d 70 28 7a 41 72 67 30 2c 22 6e 75 6c 6c 22 29  mp(zArg0,"null")
e160: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
e170: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
e180: 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  ll(context);.   
e190: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
e1a0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67  ite3StrICmp(zArg
e1b0: 30 2c 22 76 61 6c 75 65 22 29 3d 3d 30 20 29 7b  0,"value")==0 ){
e1c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e1d0: 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f  _result_value(co
e1e0: 6e 74 65 78 74 2c 20 61 72 67 76 5b 73 71 6c 69  ntext, argv[sqli
e1f0: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72  te3_value_int(ar
e200: 67 76 5b 31 5d 29 5d 29 3b 0a 20 20 20 20 20 20  gv[1])]);.      
e210: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 67  }else{.        g
e220: 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20  oto error_out;. 
e230: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
e240: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72  {.      goto err
e250: 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  or_out;.    }.  
e260: 20 20 61 72 67 63 20 2d 3d 20 32 3b 0a 20 20 20    argc -= 2;.   
e270: 20 61 72 67 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a   argv += 2;.  }.
e280: 20 20 72 65 74 75 72 6e 3b 0a 0a 65 72 72 6f 72    return;..error
e290: 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f  _out:.  sqlite3_
e2a0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
e2b0: 74 65 78 74 2c 22 66 69 72 73 74 20 61 72 67 75  text,"first argu
e2c0: 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 6f  ment should be o
e2d0: 6e 65 20 6f 66 3a 20 22 0a 20 20 20 20 20 20 22  ne of: ".      "
e2e0: 69 6e 74 20 69 6e 74 36 34 20 73 74 72 69 6e 67  int int64 string
e2f0: 20 64 6f 75 62 6c 65 20 6e 75 6c 6c 20 76 61 6c   double null val
e300: 75 65 22 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a  ue", -1);.}../*.
e310: 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
e320: 74 65 5f 72 65 67 69 73 74 65 72 5f 74 65 73 74  te_register_test
e330: 5f 66 75 6e 63 74 69 6f 6e 20 20 44 42 20 20 4e  _function  DB  N
e340: 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74  AME.**.** Regist
e350: 65 72 20 74 68 65 20 74 65 73 74 20 53 51 4c 20  er the test SQL 
e360: 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  function on the 
e370: 64 61 74 61 62 61 73 65 20 44 42 20 75 6e 64 65  database DB unde
e380: 72 20 74 68 65 20 6e 61 6d 65 20 4e 41 4d 45 2e  r the name NAME.
e390: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
e3a0: 65 73 74 5f 72 65 67 69 73 74 65 72 5f 66 75 6e  est_register_fun
e3b0: 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  c(.  void *NotUs
e3c0: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
e3d0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
e3e0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
e3f0: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
e400: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
e410: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
e420: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
e430: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
e440: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
e450: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
e460: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
e470: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71  ument */.){.  sq
e480: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
e490: 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21   rc;.  if( argc!
e4a0: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
e4b0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
e4c0: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
e4d0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
e4e0: 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
e4f0: 20 20 22 20 44 42 20 46 55 4e 43 54 49 4f 4e 2d    " DB FUNCTION-
e500: 4e 41 4d 45 22 2c 20 30 29 3b 0a 20 20 20 20 72  NAME", 0);.    r
e510: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
e520: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
e530: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
e540: 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
e550: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
e560: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
e570: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
e580: 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 2d 31  (db, argv[2], -1
e590: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
e5a0: 2c 20 0a 20 20 20 20 20 20 74 65 73 74 46 75 6e  , .      testFun
e5b0: 63 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  c, 0, 0);.  if( 
e5c0: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c  rc!=0 ){.    Tcl
e5d0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
e5e0: 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72  terp, sqlite3Err
e5f0: 53 74 72 28 72 63 29 2c 20 30 29 3b 0a 20 20 20  Str(rc), 0);.   
e600: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
e610: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  R;.  }.  if( sql
e620: 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
e630: 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20  interp, db, rc) 
e640: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
e650: 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  OR;.  return TCL
e660: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
e670: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 66 69  age:  sqlite3_fi
e680: 6e 61 6c 69 7a 65 20 20 53 54 4d 54 20 0a 2a 2a  nalize  STMT .**
e690: 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 61 20 73  .** Finalize a s
e6a0: 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 2e  tatement handle.
e6b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
e6c0: 65 73 74 5f 66 69 6e 61 6c 69 7a 65 28 0a 20 20  est_finalize(.  
e6d0: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
e6e0: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
e6f0: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
e700: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
e710: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
e720: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
e730: 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b  pStmt;.  int rc;
e740: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
e750: 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   0;..  if( objc!
e760: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
e770: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
e780: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
e790: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
e7a0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
e7b0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
e7c0: 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53 54  jv[0], 0), " <ST
e7d0: 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  MT>", 0);.    re
e7e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
e7f0: 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
e800: 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
e810: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
e820: 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
e830: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
e840: 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20 70 53 74  RROR;..  if( pSt
e850: 6d 74 20 29 7b 0a 20 20 20 20 64 62 20 3d 20 53  mt ){.    db = S
e860: 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 3b 0a  tmtToDb(pStmt);.
e870: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
e880: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
e890: 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73  t);.  Tcl_SetRes
e8a0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
e8b0: 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28  r *)t1ErrorName(
e8c0: 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  rc), TCL_STATIC)
e8d0: 3b 0a 20 20 69 66 28 20 64 62 20 26 26 20 73 71  ;.  if( db && sq
e8e0: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
e8f0: 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
e900: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
e910: 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ROR;.  return TC
e920: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
e930: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73  sage:  sqlite3_s
e940: 74 6d 74 5f 73 74 61 74 75 73 20 20 53 54 4d 54  tmt_status  STMT
e950: 20 20 43 4f 44 45 20 20 52 45 53 45 54 46 4c 41    CODE  RESETFLA
e960: 47 0a 2a 2a 0a 2a 2a 20 47 65 74 20 74 68 65 20  G.**.** Get the 
e970: 76 61 6c 75 65 20 6f 66 20 61 20 73 74 61 74 75  value of a statu
e980: 73 20 63 6f 75 6e 74 65 72 20 66 72 6f 6d 20 61  s counter from a
e990: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73   statement..*/.s
e9a0: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
e9b0: 74 6d 74 5f 73 74 61 74 75 73 28 0a 20 20 76 6f  tmt_status(.  vo
e9c0: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
e9d0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
e9e0: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
e9f0: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
ea00: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
ea10: 69 6e 74 20 69 56 61 6c 75 65 3b 0a 20 20 69 6e  int iValue;.  in
ea20: 74 20 69 2c 20 6f 70 2c 20 72 65 73 65 74 46 6c  t i, op, resetFl
ea30: 61 67 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ag;.  const char
ea40: 20 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20 73 71 6c   *zOpName;.  sql
ea50: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
ea60: 3b 0a 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ;..  static cons
ea70: 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63  t struct {.    c
ea80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
ea90: 3b 0a 20 20 20 20 69 6e 74 20 6f 70 3b 0a 20 20  ;.    int op;.  
eaa0: 7d 20 61 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20  } aOp[] = {.    
eab0: 7b 20 22 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  { "SQLITE_STMTST
eac0: 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54  ATUS_FULLSCAN_ST
ead0: 45 50 22 2c 20 20 20 53 51 4c 49 54 45 5f 53 54  EP",   SQLITE_ST
eae0: 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41  MTSTATUS_FULLSCA
eaf0: 4e 5f 53 54 45 50 20 20 20 7d 2c 0a 20 20 20 20  N_STEP   },.    
eb00: 7b 20 22 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  { "SQLITE_STMTST
eb10: 41 54 55 53 5f 53 4f 52 54 22 2c 20 20 20 20 20  ATUS_SORT",     
eb20: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 54         SQLITE_ST
eb30: 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 20 20 20  MTSTATUS_SORT   
eb40: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
eb50: 7b 20 22 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  { "SQLITE_STMTST
eb60: 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 22 2c  ATUS_AUTOINDEX",
eb70: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 54         SQLITE_ST
eb80: 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44  MTSTATUS_AUTOIND
eb90: 45 58 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  EX       },.    
eba0: 7b 20 22 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  { "SQLITE_STMTST
ebb0: 41 54 55 53 5f 56 4d 5f 53 54 45 50 22 2c 20 20  ATUS_VM_STEP",  
ebc0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 54         SQLITE_ST
ebd0: 4d 54 53 54 41 54 55 53 5f 56 4d 5f 53 54 45 50  MTSTATUS_VM_STEP
ebe0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b           },.  };
ebf0: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29  .  if( objc!=4 )
ec00: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
ec10: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
ec20: 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20 50 41  , objv, "STMT PA
ec30: 52 41 4d 45 54 45 52 20 52 45 53 45 54 46 4c 41  RAMETER RESETFLA
ec40: 47 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  G");.    return 
ec50: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
ec60: 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
ec70: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
ec80: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
ec90: 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
eca0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
ecb0: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 54 63 6c 5f    zOpName = Tcl_
ecc0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
ecd0: 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ]);.  for(i=0; i
ece0: 3c 41 72 72 61 79 53 69 7a 65 28 61 4f 70 29 3b  <ArraySize(aOp);
ecf0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
ed00: 74 72 63 6d 70 28 61 4f 70 5b 69 5d 2e 7a 4e 61  trcmp(aOp[i].zNa
ed10: 6d 65 2c 20 7a 4f 70 4e 61 6d 65 29 3d 3d 30 20  me, zOpName)==0 
ed20: 29 7b 0a 20 20 20 20 20 20 6f 70 20 3d 20 61 4f  ){.      op = aO
ed30: 70 5b 69 5d 2e 6f 70 3b 0a 20 20 20 20 20 20 62  p[i].op;.      b
ed40: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
ed50: 20 20 69 66 28 20 69 3e 3d 41 72 72 61 79 53 69    if( i>=ArraySi
ed60: 7a 65 28 61 4f 70 29 20 29 7b 0a 20 20 20 20 69  ze(aOp) ){.    i
ed70: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
ed80: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
ed90: 76 5b 32 5d 2c 20 26 6f 70 29 20 29 20 72 65 74  v[2], &op) ) ret
eda0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
edb0: 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
edc0: 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
edd0: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
ede0: 26 72 65 73 65 74 46 6c 61 67 29 20 29 20 72 65  &resetFlag) ) re
edf0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
ee00: 20 20 69 56 61 6c 75 65 20 3d 20 73 71 6c 69 74    iValue = sqlit
ee10: 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70  e3_stmt_status(p
ee20: 53 74 6d 74 2c 20 6f 70 2c 20 72 65 73 65 74 46  Stmt, op, resetF
ee30: 6c 61 67 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  lag);.  Tcl_SetO
ee40: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
ee50: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 69   Tcl_NewIntObj(i
ee60: 56 61 6c 75 65 29 29 3b 0a 20 20 72 65 74 75 72  Value));.  retur
ee70: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  n TCL_OK;.}..#if
ee80: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
ee90: 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55  E_STMT_SCANSTATU
eea0: 53 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  S./*.** Usage:  
eeb0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
eec0: 6e 73 74 61 74 75 73 20 53 54 4d 54 20 49 44 58  nstatus STMT IDX
eed0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
eee0: 65 73 74 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  est_stmt_scansta
eef0: 74 75 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  tus(.  void * cl
ef00: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
ef10: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
ef20: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
ef30: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
ef40: 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
ef50: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20  _stmt *pStmt;   
ef60: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
ef70: 74 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 20 20  t argument */.  
ef80: 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20 20  int idx;        
ef90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efa0: 2f 2a 20 53 65 63 6f 6e 64 20 61 72 67 75 6d 65  /* Second argume
efb0: 6e 74 20 2a 2f 0a 0a 20 20 63 6f 6e 73 74 20 63  nt */..  const c
efc0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 63 6f  har *zName;.  co
efd0: 6e 73 74 20 63 68 61 72 20 2a 7a 45 78 70 6c 61  nst char *zExpla
efe0: 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  in;.  sqlite3_in
eff0: 74 36 34 20 6e 4c 6f 6f 70 3b 0a 20 20 73 71 6c  t64 nLoop;.  sql
f000: 69 74 65 33 5f 69 6e 74 36 34 20 6e 56 69 73 69  ite3_int64 nVisi
f010: 74 3b 0a 20 20 64 6f 75 62 6c 65 20 72 45 73 74  t;.  double rEst
f020: 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20  ;.  int res;..  
f030: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
f040: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
f050: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
f060: 62 6a 76 2c 20 22 53 54 4d 54 20 49 44 58 22 29  bjv, "STMT IDX")
f070: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
f080: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
f090: 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
f0a0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
f0b0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
f0c0: 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
f0d0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
f0e0: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
f0f0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
f100: 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65  v[2], &idx) ) re
f110: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
f120: 0a 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33  .  res = sqlite3
f130: 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73  _stmt_scanstatus
f140: 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 53 51 4c  (pStmt, idx, SQL
f150: 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e 4c 4f  ITE_SCANSTAT_NLO
f160: 4f 50 2c 20 28 76 6f 69 64 2a 29 26 6e 4c 6f 6f  OP, (void*)&nLoo
f170: 70 29 3b 0a 20 20 69 66 28 20 72 65 73 3d 3d 30  p);.  if( res==0
f180: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   ){.    Tcl_Obj 
f190: 2a 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f  *pRet = Tcl_NewO
f1a0: 62 6a 28 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  bj();.    Tcl_Li
f1b0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
f1c0: 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f  nt(0, pRet, Tcl_
f1d0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6e 4c  NewStringObj("nL
f1e0: 6f 6f 70 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20  oop", -1));.    
f1f0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
f200: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74  dElement(0, pRet
f210: 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
f220: 4f 62 6a 28 6e 4c 6f 6f 70 29 29 3b 0a 20 20 20  Obj(nLoop));.   
f230: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63   sqlite3_stmt_sc
f240: 61 6e 73 74 61 74 75 73 28 70 53 74 6d 74 2c 20  anstatus(pStmt, 
f250: 69 64 78 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e  idx, SQLITE_SCAN
f260: 53 54 41 54 5f 4e 56 49 53 49 54 2c 20 28 76 6f  STAT_NVISIT, (vo
f270: 69 64 2a 29 26 6e 56 69 73 69 74 29 3b 0a 20 20  id*)&nVisit);.  
f280: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
f290: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
f2a0: 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  et, Tcl_NewStrin
f2b0: 67 4f 62 6a 28 22 6e 56 69 73 69 74 22 2c 20 2d  gObj("nVisit", -
f2c0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
f2d0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
f2e0: 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  t(0, pRet, Tcl_N
f2f0: 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 6e 56 69  ewWideIntObj(nVi
f300: 73 69 74 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  sit));.    sqlit
f310: 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74  e3_stmt_scanstat
f320: 75 73 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 53  us(pStmt, idx, S
f330: 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 45  QLITE_SCANSTAT_E
f340: 53 54 2c 20 28 76 6f 69 64 2a 29 26 72 45 73 74  ST, (void*)&rEst
f350: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
f360: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
f370: 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  0, pRet, Tcl_New
f380: 53 74 72 69 6e 67 4f 62 6a 28 22 6e 45 73 74 22  StringObj("nEst"
f390: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
f3a0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
f3b0: 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63  ment(0, pRet, Tc
f3c0: 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72  l_NewDoubleObj(r
f3d0: 45 73 74 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  Est));.    sqlit
f3e0: 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74  e3_stmt_scanstat
f3f0: 75 73 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 53  us(pStmt, idx, S
f400: 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e  QLITE_SCANSTAT_N
f410: 41 4d 45 2c 20 28 76 6f 69 64 2a 29 26 7a 4e 61  AME, (void*)&zNa
f420: 6d 65 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  me);.    Tcl_Lis
f430: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
f440: 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  t(0, pRet, Tcl_N
f450: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 7a 4e 61  ewStringObj("zNa
f460: 6d 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  me", -1));.    T
f470: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
f480: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c  Element(0, pRet,
f490: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
f4a0: 6a 28 7a 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20  j(zName, -1));. 
f4b0: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f     sqlite3_stmt_
f4c0: 73 63 61 6e 73 74 61 74 75 73 28 70 53 74 6d 74  scanstatus(pStmt
f4d0: 2c 20 69 64 78 2c 20 53 51 4c 49 54 45 5f 53 43  , idx, SQLITE_SC
f4e0: 41 4e 53 54 41 54 5f 45 58 50 4c 41 49 4e 2c 20  ANSTAT_EXPLAIN, 
f4f0: 28 76 6f 69 64 2a 29 26 7a 45 78 70 6c 61 69 6e  (void*)&zExplain
f500: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
f510: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
f520: 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  0, pRet, Tcl_New
f530: 53 74 72 69 6e 67 4f 62 6a 28 22 7a 45 78 70 6c  StringObj("zExpl
f540: 61 69 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20  ain", -1));.    
f550: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
f560: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74  dElement(0, pRet
f570: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
f580: 62 6a 28 7a 45 78 70 6c 61 69 6e 2c 20 2d 31 29  bj(zExplain, -1)
f590: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  );.    Tcl_SetOb
f5a0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
f5b0: 70 52 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pRet);.  }else{.
f5c0: 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73      Tcl_ResetRes
f5d0: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 7d  ult(interp);.  }
f5e0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
f5f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
f600: 3a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f  :  sqlite3_stmt_
f610: 73 63 61 6e 73 74 61 74 75 73 5f 72 65 73 65 74  scanstatus_reset
f620: 20 20 53 54 4d 54 0a 2a 2f 0a 73 74 61 74 69 63    STMT.*/.static
f630: 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 73   int test_stmt_s
f640: 63 61 6e 73 74 61 74 75 73 5f 72 65 73 65 74 28  canstatus_reset(
f650: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
f660: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
f670: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
f680: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
f690: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
f6a0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
f6b0: 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20  t *pStmt;       
f6c0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
f6d0: 67 75 6d 65 6e 74 20 2a 2f 0a 20 20 69 66 28 20  gument */.  if( 
f6e0: 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
f6f0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
f700: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
f710: 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65   "STMT");.    re
f720: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
f730: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d    }.  if( getStm
f740: 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
f750: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
f760: 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
f770: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
f780: 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ROR;.  sqlite3_s
f790: 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 5f 72  tmt_scanstatus_r
f7a0: 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 72  eset(pStmt);.  r
f7b0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
f7c0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73  #endif../*.** Us
f7d0: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6e 65  age:  sqlite3_ne
f7e0: 78 74 5f 73 74 6d 74 20 20 44 42 20 20 53 54 4d  xt_stmt  DB  STM
f7f0: 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  T.**.** Return t
f800: 68 65 20 6e 65 78 74 20 73 74 61 74 6d 65 6e 74  he next statment
f810: 20 69 6e 20 73 65 71 75 65 6e 63 65 20 61 66 74   in sequence aft
f820: 65 72 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74  er STMT..*/.stat
f830: 69 63 20 69 6e 74 20 74 65 73 74 5f 6e 65 78 74  ic int test_next
f840: 5f 73 74 6d 74 28 0a 20 20 76 6f 69 64 20 2a 20  _stmt(.  void * 
f850: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
f860: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
f870: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
f880: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
f890: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
f8a0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
f8b0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
f8c0: 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35  0;.  char zBuf[5
f8d0: 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  0];..  if( objc!
f8e0: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
f8f0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
f900: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
f910: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
f920: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
f930: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
f940: 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20  jv[0], 0), " DB 
f950: 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72  STMT", 0);.    r
f960: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f970: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 44  .  }..  if( getD
f980: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
f990: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
f9a0: 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
f9b0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
f9c0: 3b 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ;.  if( getStmtP
f9d0: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
f9e0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
f9f0: 76 5b 32 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[2]), &pStmt) )
fa00: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
fa10: 52 3b 0a 20 20 70 53 74 6d 74 20 3d 20 73 71 6c  R;.  pStmt = sql
fa20: 69 74 65 33 5f 6e 65 78 74 5f 73 74 6d 74 28 64  ite3_next_stmt(d
fa30: 62 2c 20 70 53 74 6d 74 29 3b 0a 20 20 69 66 28  b, pStmt);.  if(
fa40: 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66   pStmt ){.    if
fa50: 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b  ( sqlite3TestMak
fa60: 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65  ePointerStr(inte
fa70: 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29  rp, zBuf, pStmt)
fa80: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
fa90: 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70  ROR;.    Tcl_App
faa0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
fab0: 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a  , zBuf, 0);.  }.
fac0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
fad0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
fae0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 72    sqlite3_stmt_r
faf0: 65 61 64 6f 6e 6c 79 20 20 53 54 4d 54 0a 2a 2a  eadonly  STMT.**
fb00: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
fb10: 69 66 20 53 54 4d 54 20 69 73 20 61 20 4e 55 4c  if STMT is a NUL
fb20: 4c 20 70 6f 69 6e 74 65 72 20 6f 72 20 61 20 70  L pointer or a p
fb30: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 61 74  ointer to a stat
fb40: 65 6d 65 6e 74 0a 2a 2a 20 74 68 61 74 20 69 73  ement.** that is
fb50: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6c   guaranteed to l
fb60: 65 61 76 65 20 74 68 65 20 64 61 74 61 62 61 73  eave the databas
fb70: 65 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f  e unmodified..*/
fb80: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
fb90: 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 28 0a  _stmt_readonly(.
fba0: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
fbb0: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
fbc0: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
fbd0: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
fbe0: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
fbf0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
fc00: 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72   *pStmt;.  int r
fc10: 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
fc20: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
fc30: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
fc40: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
fc50: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
fc60: 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
fc70: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
fc80: 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54  v[0], 0), " STMT
fc90: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
fca0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
fcb0: 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
fcc0: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
fcd0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
fce0: 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
fcf0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
fd00: 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
fd10: 33 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 28  3_stmt_readonly(
fd20: 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65  pStmt);.  Tcl_Se
fd30: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
fd40: 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61  p, Tcl_NewBoolea
fd50: 6e 4f 62 6a 28 72 63 29 29 3b 0a 20 20 72 65 74  nObj(rc));.  ret
fd60: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
fd70: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
fd80: 69 74 65 33 5f 73 74 6d 74 5f 62 75 73 79 20 20  ite3_stmt_busy  
fd90: 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  STMT.**.** Retur
fda0: 6e 20 74 72 75 65 20 69 66 20 53 54 4d 54 20 69  n true if STMT i
fdb0: 73 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69  s a non-NULL poi
fdc0: 6e 74 65 72 20 74 6f 20 61 20 73 74 61 74 65 6d  nter to a statem
fdd0: 65 6e 74 0a 2a 2a 20 74 68 61 74 20 68 61 73 20  ent.** that has 
fde0: 62 65 65 6e 20 73 74 65 70 70 65 64 20 62 75 74  been stepped but
fdf0: 20 6e 6f 74 20 74 6f 20 63 6f 6d 70 6c 65 74 69   not to completi
fe00: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
fe10: 74 20 74 65 73 74 5f 73 74 6d 74 5f 62 75 73 79  t test_stmt_busy
fe20: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
fe30: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
fe40: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
fe50: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
fe60: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
fe70: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
fe80: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
fe90: 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
fea0: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
feb0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
fec0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
fed0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
fee0: 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
fef0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
ff00: 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54  bjv[0], 0), " ST
ff10: 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  MT", 0);.    ret
ff20: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
ff30: 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
ff40: 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
ff50: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
ff60: 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
ff70: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
ff80: 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
ff90: 74 65 33 5f 73 74 6d 74 5f 62 75 73 79 28 70 53  te3_stmt_busy(pS
ffa0: 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  tmt);.  Tcl_SetO
ffb0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
ffc0: 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f   Tcl_NewBooleanO
ffd0: 62 6a 28 72 63 29 29 3b 0a 20 20 72 65 74 75 72  bj(rc));.  retur
ffe0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
fff0: 2a 2a 20 55 73 61 67 65 3a 20 20 75 73 65 73 5f  ** Usage:  uses_
10000 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 20 20 53 54  stmt_journal  ST
10010 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  MT.**.** Return 
10020 74 72 75 65 20 69 66 20 53 54 4d 54 20 75 73 65  true if STMT use
10030 73 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  s a statement jo
10040 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  urnal..*/.static
10050 20 69 6e 74 20 75 73 65 73 5f 73 74 6d 74 5f 6a   int uses_stmt_j
10060 6f 75 72 6e 61 6c 28 0a 20 20 76 6f 69 64 20 2a  ournal(.  void *
10070 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
10080 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
10090 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
100a0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
100b0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
100c0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
100d0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
100e0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
100f0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
10100 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
10110 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
10120 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
10130 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
10140 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 22 2c  0], 0), " STMT",
10150 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
10160 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
10170 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
10180 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
10190 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
101a0 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
101b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
101c0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f  .  sqlite3_stmt_
101d0 72 65 61 64 6f 6e 6c 79 28 70 53 74 6d 74 29 3b  readonly(pStmt);
101e0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
101f0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
10200 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 28 28  NewBooleanObj(((
10210 56 64 62 65 20 2a 29 70 53 74 6d 74 29 2d 3e 75  Vdbe *)pStmt)->u
10220 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 29 29  sesStmtJournal))
10230 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
10240 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  K;.}.../*.** Usa
10250 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  ge:  sqlite3_res
10260 65 74 20 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20  et  STMT .**.** 
10270 52 65 73 65 74 20 61 20 73 74 61 74 65 6d 65 6e  Reset a statemen
10280 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61  t handle..*/.sta
10290 74 69 63 20 69 6e 74 20 74 65 73 74 5f 72 65 73  tic int test_res
102a0 65 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  et(.  void * cli
102b0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
102c0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
102d0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
102e0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
102f0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
10300 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
10310 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
10320 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
10330 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
10340 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
10350 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
10360 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
10370 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
10380 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
10390 3c 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20  <STMT>", 0);.   
103a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
103b0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
103c0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
103d0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
103e0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
103f0 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
10400 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
10410 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
10420 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 70 53 74  Stmt);.  if( pSt
10430 6d 74 20 26 26 20 73 71 6c 69 74 65 33 54 65 73  mt && sqlite3Tes
10440 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
10450 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29   StmtToDb(pStmt)
10460 2c 20 72 63 29 20 29 7b 0a 20 20 20 20 72 65 74  , rc) ){.    ret
10470 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10480 20 7d 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75   }.  Tcl_SetResu
10490 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
104a0 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
104b0 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  c), TCL_STATIC);
104c0 0a 2f 2a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  ./*.  if( rc ){.
104d0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
104e0 52 52 4f 52 3b 0a 20 20 7d 0a 2a 2f 0a 20 20 72  RROR;.  }.*/.  r
104f0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
10500 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
10510 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64 20 53  qlite3_expired S
10520 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  TMT .**.** Retur
10530 6e 20 54 52 55 45 20 69 66 20 61 20 72 65 63 6f  n TRUE if a reco
10540 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65  mpilation of the
10550 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65   statement is re
10560 63 6f 6d 6d 65 6e 64 65 64 2e 0a 2a 2f 0a 73 74  commended..*/.st
10570 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 78  atic int test_ex
10580 70 69 72 65 64 28 0a 20 20 76 6f 69 64 20 2a 20  pired(.  void * 
10590 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
105a0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
105b0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
105c0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
105d0 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66  bjv[].){.#ifndef
105e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
105f0 52 45 43 41 54 45 44 0a 20 20 73 71 6c 69 74 65  RECATED.  sqlite
10600 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
10610 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
10620 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
10630 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
10640 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
10650 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
10660 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
10670 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
10680 20 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20   0), " <STMT>", 
10690 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
106a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
106b0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
106c0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
106d0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
106e0 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
106f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10700 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
10710 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
10720 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 73 71 6c 69  wBooleanObj(sqli
10730 74 65 33 5f 65 78 70 69 72 65 64 28 70 53 74 6d  te3_expired(pStm
10740 74 29 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  t)));.#endif.  r
10750 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
10760 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
10770 71 6c 69 74 65 33 5f 74 72 61 6e 73 66 65 72 5f  qlite3_transfer_
10780 62 69 6e 64 69 6e 67 73 20 46 52 4f 4d 53 54 4d  bindings FROMSTM
10790 54 20 54 4f 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 54  T TOSTMT.**.** T
107a0 72 61 6e 73 66 65 72 20 61 6c 6c 20 62 69 6e 64  ransfer all bind
107b0 69 6e 67 73 20 66 72 6f 6d 20 46 52 4f 4d 53 54  ings from FROMST
107c0 4d 54 20 6f 76 65 72 20 74 6f 20 54 4f 53 54 4d  MT over to TOSTM
107d0 54 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  T.*/.static int 
107e0 74 65 73 74 5f 74 72 61 6e 73 66 65 72 5f 62 69  test_transfer_bi
107f0 6e 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  nd(.  void * cli
10800 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
10810 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
10820 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
10830 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
10840 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  [].){.#ifndef SQ
10850 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
10860 41 54 45 44 0a 20 20 73 71 6c 69 74 65 33 5f 73  ATED.  sqlite3_s
10870 74 6d 74 20 2a 70 53 74 6d 74 31 2c 20 2a 70 53  tmt *pStmt1, *pS
10880 74 6d 74 32 3b 0a 20 20 69 66 28 20 6f 62 6a 63  tmt2;.  if( objc
10890 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
108a0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
108b0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
108c0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
108d0 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
108e0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
108f0 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 46 52  bjv[0], 0), " FR
10900 4f 4d 2d 53 54 4d 54 20 54 4f 2d 53 54 4d 54 22  OM-STMT TO-STMT"
10910 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
10920 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
10930 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
10940 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
10950 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
10960 31 5d 29 2c 20 26 70 53 74 6d 74 31 29 29 20 72  1]), &pStmt1)) r
10970 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10980 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
10990 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
109a0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
109b0 5b 32 5d 29 2c 20 26 70 53 74 6d 74 32 29 29 20  [2]), &pStmt2)) 
109c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
109d0 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
109e0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20  sult(interp, .  
109f0 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a     Tcl_NewIntObj
10a00 28 73 71 6c 69 74 65 33 5f 74 72 61 6e 73 66 65  (sqlite3_transfe
10a10 72 5f 62 69 6e 64 69 6e 67 73 28 70 53 74 6d 74  r_bindings(pStmt
10a20 31 2c 70 53 74 6d 74 32 29 29 29 3b 0a 23 65 6e  1,pStmt2)));.#en
10a30 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  dif.  return TCL
10a40 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
10a50 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 63 68  age:  sqlite3_ch
10a60 61 6e 67 65 73 20 44 42 0a 2a 2a 0a 2a 2a 20 52  anges DB.**.** R
10a70 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
10a80 20 6f 66 20 63 68 61 6e 67 65 73 20 6d 61 64 65   of changes made
10a90 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
10aa0 20 62 79 20 74 68 65 20 6c 61 73 74 20 53 51 4c   by the last SQL
10ab0 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a  .** execution..*
10ac0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
10ad0 74 5f 63 68 61 6e 67 65 73 28 0a 20 20 76 6f 69  t_changes(.  voi
10ae0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
10af0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
10b00 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
10b10 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
10b20 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
10b30 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66  qlite3 *db;.  if
10b40 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
10b50 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
10b60 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
10b70 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
10b80 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 54  be \"",.       T
10b90 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
10ba0 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29  v[0]), " DB", 0)
10bb0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
10bc0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
10bd0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
10be0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
10bf0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
10c00 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
10c10 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65  _ERROR;.  Tcl_Se
10c20 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
10c30 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
10c40 28 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73  (sqlite3_changes
10c50 28 64 62 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  (db)));.  return
10c60 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
10c70 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 22 73  * This is the "s
10c80 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65  tatic_bind_value
10c90 22 20 74 68 61 74 20 76 61 72 69 61 62 6c 65 73  " that variables
10ca0 20 61 72 65 20 62 6f 75 6e 64 20 74 6f 20 77 68   are bound to wh
10cb0 65 6e 0a 2a 2a 20 74 68 65 20 46 4c 41 47 20 6f  en.** the FLAG o
10cc0 70 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33  ption of sqlite3
10cd0 5f 62 69 6e 64 20 69 73 20 22 73 74 61 74 69 63  _bind is "static
10ce0 22 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ".*/.static char
10cf0 20 2a 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f   *sqlite_static_
10d00 62 69 6e 64 5f 76 61 6c 75 65 20 3d 20 30 3b 0a  bind_value = 0;.
10d10 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
10d20 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62  e_static_bind_nb
10d30 79 74 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  yte = 0;../*.** 
10d40 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
10d50 62 69 6e 64 20 20 56 4d 20 20 49 44 58 20 20 56  bind  VM  IDX  V
10d60 41 4c 55 45 20 20 46 4c 41 47 53 0a 2a 2a 0a 2a  ALUE  FLAGS.**.*
10d70 2a 20 53 65 74 73 20 74 68 65 20 76 61 6c 75 65  * Sets the value
10d80 20 6f 66 20 74 68 65 20 49 44 58 2d 74 68 20 6f   of the IDX-th o
10d90 63 63 75 72 72 65 6e 63 65 20 6f 66 20 22 3f 22  ccurrence of "?"
10da0 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
10db0 20 53 51 4c 0a 2a 2a 20 73 74 72 69 6e 67 2e 20   SQL.** string. 
10dc0 20 56 41 4c 55 45 20 69 73 20 74 68 65 20 6e 65   VALUE is the ne
10dd0 77 20 76 61 6c 75 65 2e 20 20 49 66 20 46 4c 41  w value.  If FLA
10de0 47 53 3d 3d 22 6e 75 6c 6c 22 20 74 68 65 6e 20  GS=="null" then 
10df0 56 41 4c 55 45 20 69 73 0a 2a 2a 20 69 67 6e 6f  VALUE is.** igno
10e00 72 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75  red and the valu
10e10 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
10e20 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d 22 73 74  .  If FLAGS=="st
10e30 61 74 69 63 22 20 74 68 65 6e 0a 2a 2a 20 74 68  atic" then.** th
10e40 65 20 76 61 6c 75 65 20 69 73 20 73 65 74 20 74  e value is set t
10e50 6f 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61  o the value of a
10e60 20 73 74 61 74 69 63 20 76 61 72 69 61 62 6c 65   static variable
10e70 20 6e 61 6d 65 64 0a 2a 2a 20 22 73 71 6c 69 74   named.** "sqlit
10e80 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61  e_static_bind_va
10e90 6c 75 65 22 2e 20 20 49 66 20 46 4c 41 47 53 3d  lue".  If FLAGS=
10ea0 3d 22 6e 6f 72 6d 61 6c 22 20 74 68 65 6e 20 61  ="normal" then a
10eb0 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 74 68 65 20   copy.** of the 
10ec0 56 41 4c 55 45 20 69 73 20 6d 61 64 65 2e 20 20  VALUE is made.  
10ed0 49 66 20 46 4c 41 47 53 3d 3d 22 62 6c 6f 62 31  If FLAGS=="blob1
10ee0 30 22 20 74 68 65 6e 20 61 20 56 41 4c 55 45 20  0" then a VALUE 
10ef0 69 73 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e  is ignored.** an
10f00 20 61 20 31 30 2d 62 79 74 65 20 62 6c 6f 62 20   a 10-byte blob 
10f10 22 61 62 63 5c 30 30 30 78 79 7a 5c 30 30 30 70  "abc\000xyz\000p
10f20 71 22 20 69 73 20 69 6e 73 65 72 74 65 64 2e 0a  q" is inserted..
10f30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
10f40 73 74 5f 62 69 6e 64 28 0a 20 20 76 6f 69 64 20  st_bind(.  void 
10f50 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
10f60 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
10f70 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
10f80 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
10f90 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
10fa0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
10fb0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
10fc0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
10fd0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
10fe0 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
10ff0 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
11000 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
11010 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
11020 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72   *pStmt;.  int r
11030 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  c;.  int idx;.  
11040 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20  if( argc!=5 ){. 
11050 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
11060 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
11070 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
11080 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
11090 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 56 4d 20  ], .       " VM 
110a0 49 44 58 20 56 41 4c 55 45 20 28 6e 75 6c 6c 7c  IDX VALUE (null|
110b0 73 74 61 74 69 63 7c 6e 6f 72 6d 61 6c 29 5c 22  static|normal)\"
110c0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
110d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
110e0 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
110f0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
11100 67 76 5b 31 5d 2c 20 26 70 53 74 6d 74 29 20 29  gv[1], &pStmt) )
11110 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
11120 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
11130 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76  Int(interp, argv
11140 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74  [2], &idx) ) ret
11150 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
11160 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
11170 5b 34 5d 2c 22 6e 75 6c 6c 22 29 3d 3d 30 20 29  [4],"null")==0 )
11180 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
11190 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74  e3_bind_null(pSt
111a0 6d 74 2c 20 69 64 78 29 3b 0a 20 20 7d 65 6c 73  mt, idx);.  }els
111b0 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67  e if( strcmp(arg
111c0 76 5b 34 5d 2c 22 73 74 61 74 69 63 22 29 3d 3d  v[4],"static")==
111d0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 ){.    rc = sq
111e0 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
111f0 70 53 74 6d 74 2c 20 69 64 78 2c 20 73 71 6c 69  pStmt, idx, sqli
11200 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76  te_static_bind_v
11210 61 6c 75 65 2c 20 2d 31 2c 20 30 29 3b 0a 20 20  alue, -1, 0);.  
11220 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
11230 28 61 72 67 76 5b 34 5d 2c 22 73 74 61 74 69 63  (argv[4],"static
11240 2d 6e 62 79 74 65 73 22 29 3d 3d 30 20 29 7b 0a  -nbytes")==0 ){.
11250 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11260 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74  _bind_text(pStmt
11270 2c 20 69 64 78 2c 20 73 71 6c 69 74 65 5f 73 74  , idx, sqlite_st
11280 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 2c  atic_bind_value,
11290 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
112a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 5f 73          sqlite_s
112c0 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65  tatic_bind_nbyte
112d0 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  , 0);.  }else if
112e0 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d  ( strcmp(argv[4]
112f0 2c 22 6e 6f 72 6d 61 6c 22 29 3d 3d 30 20 29 7b  ,"normal")==0 ){
11300 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
11310 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d  3_bind_text(pStm
11320 74 2c 20 69 64 78 2c 20 61 72 67 76 5b 33 5d 2c  t, idx, argv[3],
11330 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
11340 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 20  SIENT);.  }else 
11350 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
11360 34 5d 2c 22 62 6c 6f 62 31 30 22 29 3d 3d 30 20  4],"blob10")==0 
11370 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
11380 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
11390 74 6d 74 2c 20 69 64 78 2c 20 22 61 62 63 5c 30  tmt, idx, "abc\0
113a0 30 30 78 79 7a 5c 30 30 30 70 71 22 2c 20 31 30  00xyz\000pq", 10
113b0 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
113c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54  ;.  }else{.    T
113d0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
113e0 69 6e 74 65 72 70 2c 20 22 34 74 68 20 61 72 67  interp, "4th arg
113f0 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20  ument should be 
11400 22 0a 20 20 20 20 20 20 20 20 22 5c 22 6e 75 6c  ".        "\"nul
11410 6c 5c 22 20 6f 72 20 5c 22 73 74 61 74 69 63 5c  l\" or \"static\
11420 22 20 6f 72 20 5c 22 6e 6f 72 6d 61 6c 5c 22 22  " or \"normal\""
11430 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
11440 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
11450 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
11460 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
11470 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29   StmtToDb(pStmt)
11480 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
11490 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
114a0 72 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a  rc ){.    char z
114b0 42 75 66 5b 35 30 5d 3b 0a 20 20 20 20 73 70 72  Buf[50];.    spr
114c0 69 6e 74 66 28 7a 42 75 66 2c 20 22 28 25 64 29  intf(zBuf, "(%d)
114d0 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54 63 6c   ", rc);.    Tcl
114e0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
114f0 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69  terp, zBuf, sqli
11500 74 65 33 45 72 72 53 74 72 28 72 63 29 2c 20 30  te3ErrStr(rc), 0
11510 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
11520 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
11530 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
11540 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11550 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a  OMIT_UTF16./*.**
11560 20 55 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74   Usage: add_test
11570 5f 63 6f 6c 6c 61 74 65 20 3c 64 62 20 70 74 72  _collate <db ptr
11580 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c  > <utf8> <utf16l
11590 65 3e 20 3c 75 74 66 31 36 62 65 3e 0a 2a 2a 0a  e> <utf16be>.**.
115a0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
115b0 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
115c0 20 74 68 61 74 20 53 51 4c 69 74 65 20 73 65 6c   that SQLite sel
115d0 65 63 74 73 20 74 68 65 20 63 6f 72 72 65 63 74  ects the correct
115e0 20 63 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 73 65   collation.** se
115f0 71 75 65 6e 63 65 20 63 61 6c 6c 62 61 63 6b 20  quence callback 
11600 77 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 76 65  when multiple ve
11610 72 73 69 6f 6e 73 20 28 66 6f 72 20 64 69 66 66  rsions (for diff
11620 65 72 65 6e 74 20 74 65 78 74 20 65 6e 63 6f 64  erent text encod
11630 69 6e 67 73 29 0a 2a 2a 20 61 72 65 20 61 76 61  ings).** are ava
11640 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43 61  ilable..**.** Ca
11650 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
11660 6e 65 20 72 65 67 69 73 74 65 72 73 20 74 68 65  ne registers the
11670 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
11680 6e 63 65 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74  nce "test_collat
11690 65 22 0a 2a 2a 20 77 69 74 68 20 64 61 74 61 62  e".** with datab
116a0 61 73 65 20 68 61 6e 64 6c 65 20 3c 64 62 3e 2e  ase handle <db>.
116b0 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
116c0 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 61 20 6c  ment must be a l
116d0 69 73 74 20 6f 66 20 74 68 72 65 65 0a 2a 2a 20  ist of three.** 
116e0 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73 2e 20  boolean values. 
116f0 49 66 20 74 68 65 20 66 69 72 73 74 20 69 73 20  If the first is 
11700 74 72 75 65 2c 20 74 68 65 6e 20 61 20 76 65 72  true, then a ver
11710 73 69 6f 6e 20 6f 66 20 74 65 73 74 5f 63 6f 6c  sion of test_col
11720 6c 61 74 65 20 69 73 0a 2a 2a 20 72 65 67 69 73  late is.** regis
11730 74 65 72 65 64 20 66 6f 72 20 55 54 46 2d 38 2c  tered for UTF-8,
11740 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 69   if the second i
11750 73 20 74 72 75 65 2c 20 61 20 76 65 72 73 69 6f  s true, a versio
11760 6e 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20  n is registered 
11770 66 6f 72 0a 2a 2a 20 55 54 46 2d 31 36 6c 65 2c  for.** UTF-16le,
11780 20 69 66 20 74 68 65 20 74 68 69 72 64 20 69 73   if the third is
11790 20 74 72 75 65 2c 20 61 20 55 54 46 2d 31 36 62   true, a UTF-16b
117a0 65 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61  e version is ava
117b0 69 6c 61 62 6c 65 2e 0a 2a 2a 20 50 72 65 76 69  ilable..** Previ
117c0 6f 75 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ous versions of 
117d0 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 61 72 65  test_collate are
117e0 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   deleted..**.** 
117f0 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  The collation se
11800 71 75 65 6e 63 65 20 74 65 73 74 5f 63 6f 6c 6c  quence test_coll
11810 61 74 65 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ate is implement
11820 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68  ed by calling th
11830 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 54  e.** following T
11840 43 4c 20 73 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a  CL script:.**.**
11850 20 20 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65     "test_collate
11860 20 3c 65 6e 63 3e 20 3c 6c 68 73 3e 20 3c 72 68   <enc> <lhs> <rh
11870 73 3e 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20 3c 6c  s>".**.** The <l
11880 68 73 3e 20 61 6e 64 20 3c 72 68 73 3e 20 61 72  hs> and <rhs> ar
11890 65 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73  e the two values
118a0 20 62 65 69 6e 67 20 63 6f 6d 70 61 72 65 64 2c   being compared,
118b0 20 65 6e 63 6f 64 65 64 20 69 6e 20 55 54 46 2d   encoded in UTF-
118c0 38 2e 0a 2a 2a 20 54 68 65 20 3c 65 6e 63 3e 20  8..** The <enc> 
118d0 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
118e0 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65   encoding of the
118f0 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74   collation funct
11900 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 53 51 4c 69  ion that.** SQLi
11910 74 65 20 73 65 6c 65 63 74 65 64 20 74 6f 20 63  te selected to c
11920 61 6c 6c 2e 20 54 68 65 20 54 43 4c 20 74 65 73  all. The TCL tes
11930 74 20 73 63 72 69 70 74 20 69 6d 70 6c 65 6d 65  t script impleme
11940 6e 74 73 20 74 68 65 0a 2a 2a 20 22 74 65 73 74  nts the.** "test
11950 5f 63 6f 6c 6c 61 74 65 22 20 70 72 6f 63 2e 0a  _collate" proc..
11960 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
11970 74 68 69 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 77  this will only w
11980 6f 72 6b 20 77 69 74 68 20 6f 6e 65 20 69 6e 74  ork with one int
11990 65 72 70 72 65 74 65 72 20 61 74 20 61 20 74 69  erpreter at a ti
119a0 6d 65 2c 20 61 73 20 74 68 65 0a 2a 2a 20 69 6e  me, as the.** in
119b0 74 65 72 70 20 70 6f 69 6e 74 65 72 20 74 6f 20  terp pointer to 
119c0 75 73 65 20 77 68 65 6e 20 65 76 61 6c 75 61 74  use when evaluat
119d0 69 6e 67 20 74 68 65 20 54 43 4c 20 73 63 72 69  ing the TCL scri
119e0 70 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 0a  pt is stored in.
119f0 2a 2a 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49  ** pTestCollateI
11a00 6e 74 65 72 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  nterp..*/.static
11a10 20 54 63 6c 5f 49 6e 74 65 72 70 2a 20 70 54 65   Tcl_Interp* pTe
11a20 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 3b  stCollateInterp;
11a30 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
11a40 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 28 0a 20  _collate_func(. 
11a50 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20 20   void *pCtx, .  
11a60 69 6e 74 20 6e 41 2c 20 63 6f 6e 73 74 20 76 6f  int nA, const vo
11a70 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42  id *zA,.  int nB
11a80 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42  , const void *zB
11a90 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  .){.  Tcl_Interp
11aa0 20 2a 69 20 3d 20 70 54 65 73 74 43 6f 6c 6c 61   *i = pTestColla
11ab0 74 65 49 6e 74 65 72 70 3b 0a 20 20 69 6e 74 20  teInterp;.  int 
11ac0 65 6e 63 69 6e 20 3d 20 53 51 4c 49 54 45 5f 50  encin = SQLITE_P
11ad0 54 52 5f 54 4f 5f 49 4e 54 28 70 43 74 78 29 3b  TR_TO_INT(pCtx);
11ae0 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 69 6e  .  int res;.  in
11af0 74 20 6e 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  t n;..  sqlite3_
11b00 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 54  value *pVal;.  T
11b10 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 0a 20 20 70  cl_Obj *pX;..  p
11b20 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  X = Tcl_NewStrin
11b30 67 4f 62 6a 28 22 74 65 73 74 5f 63 6f 6c 6c 61  gObj("test_colla
11b40 74 65 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f  te", -1);.  Tcl_
11b50 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29  IncrRefCount(pX)
11b60 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 65 6e 63  ;..  switch( enc
11b70 69 6e 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  in ){.    case S
11b80 51 4c 49 54 45 5f 55 54 46 38 3a 0a 20 20 20 20  QLITE_UTF8:.    
11b90 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
11ba0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c  endElement(i,pX,
11bb0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
11bc0 28 22 55 54 46 2d 38 22 2c 2d 31 29 29 3b 0a 20  ("UTF-8",-1));. 
11bd0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11be0 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46 31  case SQLITE_UTF1
11bf0 36 4c 45 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c  6LE:.      Tcl_L
11c00 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
11c10 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77  ent(i,pX,Tcl_New
11c20 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31  StringObj("UTF-1
11c30 36 4c 45 22 2c 2d 31 29 29 3b 0a 20 20 20 20 20  6LE",-1));.     
11c40 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
11c50 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3a   SQLITE_UTF16BE:
11c60 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  .      Tcl_ListO
11c70 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
11c80 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69  i,pX,Tcl_NewStri
11c90 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 42 45 22  ngObj("UTF-16BE"
11ca0 2c 2d 31 29 29 3b 0a 20 20 20 20 20 20 62 72 65  ,-1));.      bre
11cb0 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
11cc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29  .      assert(0)
11cd0 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
11ce0 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
11cf0 63 28 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71  c();.  pVal = sq
11d00 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29  lite3ValueNew(0)
11d10 3b 0a 20 20 69 66 28 20 70 56 61 6c 20 29 7b 0a  ;.  if( pVal ){.
11d20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
11d30 53 65 74 53 74 72 28 70 56 61 6c 2c 20 6e 41 2c  SetStr(pVal, nA,
11d40 20 7a 41 2c 20 65 6e 63 69 6e 2c 20 53 51 4c 49   zA, encin, SQLI
11d50 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
11d60 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
11d70 65 5f 62 79 74 65 73 28 70 56 61 6c 29 3b 0a 20  e_bytes(pVal);. 
11d80 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
11d90 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58  pendElement(i,pX
11da0 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4e 65  ,.        Tcl_Ne
11db0 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72  wStringObj((char
11dc0 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
11dd0 74 65 78 74 28 70 56 61 6c 29 2c 6e 29 29 3b 0a  text(pVal),n));.
11de0 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
11df0 53 65 74 53 74 72 28 70 56 61 6c 2c 20 6e 42 2c  SetStr(pVal, nB,
11e00 20 7a 42 2c 20 65 6e 63 69 6e 2c 20 53 51 4c 49   zB, encin, SQLI
11e10 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
11e20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
11e30 65 5f 62 79 74 65 73 28 70 56 61 6c 29 3b 0a 20  e_bytes(pVal);. 
11e40 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
11e50 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58  pendElement(i,pX
11e60 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4e 65  ,.        Tcl_Ne
11e70 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72  wStringObj((char
11e80 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
11e90 74 65 78 74 28 70 56 61 6c 29 2c 6e 29 29 3b 0a  text(pVal),n));.
11ea0 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
11eb0 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 7d 0a  Free(pVal);.  }.
11ec0 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
11ed0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 54  gnMalloc();..  T
11ee0 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 2c 20  cl_EvalObjEx(i, 
11ef0 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65  pX, 0);.  Tcl_De
11f00 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a  crRefCount(pX);.
11f10 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d    Tcl_GetIntFrom
11f20 4f 62 6a 28 69 2c 20 54 63 6c 5f 47 65 74 4f 62  Obj(i, Tcl_GetOb
11f30 6a 52 65 73 75 6c 74 28 69 29 2c 20 26 72 65 73  jResult(i), &res
11f40 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  );.  return res;
11f50 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  .}.static int te
11f60 73 74 5f 63 6f 6c 6c 61 74 65 28 0a 20 20 76 6f  st_collate(.  vo
11f70 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
11f80 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
11f90 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
11fa0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
11fb0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
11fc0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
11fd0 6e 74 20 76 61 6c 3b 0a 20 20 73 71 6c 69 74 65  nt val;.  sqlite
11fe0 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20  3_value *pVal;. 
11ff0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
12000 6f 62 6a 63 21 3d 35 20 29 20 67 6f 74 6f 20 62  objc!=5 ) goto b
12010 61 64 5f 61 72 67 73 3b 0a 20 20 70 54 65 73 74  ad_args;.  pTest
12020 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 20 3d 20  CollateInterp = 
12030 69 6e 74 65 72 70 3b 0a 20 20 69 66 28 20 67 65  interp;.  if( ge
12040 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
12050 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
12060 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
12070 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
12080 4f 52 3b 0a 0a 20 20 69 66 28 20 54 43 4c 5f 4f  OR;..  if( TCL_O
12090 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  K!=Tcl_GetBoolea
120a0 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
120b0 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61 6c 29 20   objv[2], &val) 
120c0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
120d0 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
120e0 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
120f0 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 63 6f  ion(db, "test_co
12100 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 55  llate", SQLITE_U
12110 54 46 38 2c 20 0a 20 20 20 20 20 20 20 20 20 20  TF8, .          
12120 28 76 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f 55  (void *)SQLITE_U
12130 54 46 38 2c 20 76 61 6c 3f 74 65 73 74 5f 63 6f  TF8, val?test_co
12140 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b 0a 20  llate_func:0);. 
12150 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
12160 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  OK ){.    const 
12170 76 6f 69 64 20 2a 7a 55 74 66 31 36 3b 0a 20 20  void *zUtf16;.  
12180 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
12190 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
121a0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
121b0 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74  [3], &val) ) ret
121c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
121d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
121e0 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
121f0 28 64 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61  (db, "test_colla
12200 74 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  te", SQLITE_UTF1
12210 36 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  6LE, .          
12220 20 20 28 76 6f 69 64 20 2a 29 53 51 4c 49 54 45    (void *)SQLITE
12230 5f 55 54 46 31 36 4c 45 2c 20 76 61 6c 3f 74 65  _UTF16LE, val?te
12240 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a  st_collate_func:
12250 30 29 3b 0a 20 20 20 20 69 66 28 20 54 43 4c 5f  0);.    if( TCL_
12260 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  OK!=Tcl_GetBoole
12270 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
12280 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 76 61 6c 29  , objv[4], &val)
12290 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
122a0 52 4f 52 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20  ROR;..#if 0.    
122b0 69 66 28 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c  if( sqlite3_iMal
122c0 6c 6f 63 46 61 69 6c 3e 30 20 29 7b 0a 20 20 20  locFail>0 ){.   
122d0 20 20 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c     sqlite3_iMall
122e0 6f 63 46 61 69 6c 2b 2b 3b 0a 20 20 20 20 7d 0a  ocFail++;.    }.
122f0 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
12300 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
12310 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 70  b->mutex);.    p
12320 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Val = sqlite3Val
12330 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20 20 73  ueNew(db);.    s
12340 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
12350 72 28 70 56 61 6c 2c 20 2d 31 2c 20 22 74 65 73  r(pVal, -1, "tes
12360 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49  t_collate", SQLI
12370 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
12380 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7a 55 74  STATIC);.    zUt
12390 66 31 36 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  f16 = sqlite3Val
123a0 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c  ueText(pVal, SQL
123b0 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29  ITE_UTF16NATIVE)
123c0 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
123d0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
123e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
123f0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
12400 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
12410 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
12420 61 74 69 6f 6e 31 36 28 64 62 2c 20 7a 55 74 66  ation16(db, zUtf
12430 31 36 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  16, SQLITE_UTF16
12440 42 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28  BE, .          (
12450 76 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f 55 54  void *)SQLITE_UT
12460 46 31 36 42 45 2c 20 76 61 6c 3f 74 65 73 74 5f  F16BE, val?test_
12470 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b  collate_func:0);
12480 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
12490 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c  e3ValueFree(pVal
124a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
124b0 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
124c0 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28  utex);.  }.  if(
124d0 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
124e0 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20  ode(interp, db, 
124f0 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
12500 5f 45 52 52 4f 52 3b 0a 20 20 0a 20 20 69 66 28  _ERROR;.  .  if(
12510 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12520 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
12530 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73  Result(interp, s
12540 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
12550 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ), 0);.    retur
12560 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
12570 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
12580 3b 0a 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20 54  ;..bad_args:.  T
12590 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
125a0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
125b0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
125c0 20 5c 22 22 2c 0a 20 20 20 20 20 20 54 63 6c 5f   \"",.      Tcl_
125d0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
125e0 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
125f0 3c 44 42 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66  <DB> <utf8> <utf
12600 31 36 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 22  16le> <utf16be>"
12610 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
12620 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a  CL_ERROR;.}../*.
12630 2a 2a 20 55 73 61 67 65 3a 20 61 64 64 5f 74 65  ** Usage: add_te
12640 73 74 5f 75 74 66 31 36 62 69 6e 5f 63 6f 6c 6c  st_utf16bin_coll
12650 61 74 65 20 3c 64 62 20 70 74 72 3e 0a 2a 2a 0a  ate <db ptr>.**.
12660 2a 2a 20 41 64 64 20 61 20 75 74 66 2d 31 36 20  ** Add a utf-16 
12670 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
12680 63 65 20 6e 61 6d 65 64 20 22 75 74 66 31 36 62  ce named "utf16b
12690 69 6e 22 20 74 6f 20 74 68 65 20 64 61 74 61 62  in" to the datab
126a0 61 73 65 0a 2a 2a 20 68 61 6e 64 6c 65 2e 20 54  ase.** handle. T
126b0 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  his collation se
126c0 71 75 65 6e 63 65 20 63 6f 6d 70 61 72 65 73 20  quence compares 
126d0 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 74 68 65  arguments in the
126e0 20 73 61 6d 65 20 77 61 79 20 61 73 20 74 68 65   same way as the
126f0 0a 2a 2a 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c  .** built-in col
12700 6c 61 74 69 6f 6e 20 22 62 69 6e 61 72 79 22 2e  lation "binary".
12710 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
12720 65 73 74 5f 75 74 66 31 36 62 69 6e 5f 63 6f 6c  est_utf16bin_col
12730 6c 61 74 65 5f 66 75 6e 63 28 0a 20 20 76 6f 69  late_func(.  voi
12740 64 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20  d *pCtx, .  int 
12750 6e 41 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  nA, const void *
12760 7a 41 2c 0a 20 20 69 6e 74 20 6e 42 2c 20 63 6f  zA,.  int nB, co
12770 6e 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a  nst void *zB.){.
12780 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 28 6e 41    int nCmp = (nA
12790 3e 6e 42 20 3f 20 6e 42 20 3a 20 6e 41 29 3b 0a  >nB ? nB : nA);.
127a0 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63    int res = memc
127b0 6d 70 28 7a 41 2c 20 7a 42 2c 20 6e 43 6d 70 29  mp(zA, zB, nCmp)
127c0 3b 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29  ;.  if( res==0 )
127d0 20 72 65 73 20 3d 20 6e 41 20 2d 20 6e 42 3b 0a   res = nA - nB;.
127e0 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
127f0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
12800 75 74 66 31 36 62 69 6e 5f 63 6f 6c 6c 61 74 65  utf16bin_collate
12810 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
12820 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
12830 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
12840 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
12850 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
12860 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
12870 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  b;.  int rc;..  
12880 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 20 67 6f  if( objc!=2 ) go
12890 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 69  to bad_args;.  i
128a0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
128b0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
128c0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
128d0 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
128e0 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
128f0 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
12900 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 75  collation(db, "u
12910 74 66 31 36 62 69 6e 22 2c 20 53 51 4c 49 54 45  tf16bin", SQLITE
12920 5f 55 54 46 31 36 2c 20 30 2c 20 0a 20 20 20 20  _UTF16, 0, .    
12930 20 20 74 65 73 74 5f 75 74 66 31 36 62 69 6e 5f    test_utf16bin_
12940 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 0a 20 20 29  collate_func.  )
12950 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
12960 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
12970 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
12980 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
12990 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
129a0 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c  .bad_args:.  Tcl
129b0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
129c0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
129d0 44 42 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  DB");.  return T
129e0 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a  CL_ERROR;.}../*.
129f0 2a 2a 20 57 68 65 6e 20 74 68 65 20 63 6f 6c 6c  ** When the coll
12a00 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 63 61 6c  ation needed cal
12a10 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64  lback is invoked
12a20 2c 20 72 65 63 6f 72 64 20 74 68 65 20 6e 61 6d  , record the nam
12a30 65 20 6f 66 20 0a 2a 2a 20 74 68 65 20 72 65 71  e of .** the req
12a40 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6e 67  uested collating
12a50 20 66 75 6e 63 74 69 6f 6e 20 68 65 72 65 2e 20   function here. 
12a60 20 54 68 65 20 72 65 63 6f 72 64 65 64 20 6e 61   The recorded na
12a70 6d 65 20 69 73 20 6c 69 6e 6b 65 64 0a 2a 2a 20  me is linked.** 
12a80 74 6f 20 61 20 54 43 4c 20 76 61 72 69 61 62 6c  to a TCL variabl
12a90 65 20 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61  e and used to ma
12aa0 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
12ab0 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61   requested colla
12ac0 74 69 6f 6e 0a 2a 2a 20 6e 61 6d 65 20 69 73 20  tion.** name is 
12ad0 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74  correct..*/.stat
12ae0 69 63 20 63 68 61 72 20 7a 4e 65 65 64 65 64 43  ic char zNeededC
12af0 6f 6c 6c 61 74 69 6f 6e 5b 32 30 30 5d 3b 0a 73  ollation[200];.s
12b00 74 61 74 69 63 20 63 68 61 72 20 2a 70 7a 4e 65  tatic char *pzNe
12b10 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 20 3d 20  ededCollation = 
12b20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e  zNeededCollation
12b30 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64  ;.../*.** Called
12b40 20 77 68 65 6e 20 61 20 63 6f 6c 6c 61 74 69 6e   when a collatin
12b50 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e 65  g sequence is ne
12b60 65 64 65 64 2e 20 20 52 65 67 69 73 74 65 72 65  eded.  Registere
12b70 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  d using.** sqlit
12b80 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65  e3_collation_nee
12b90 64 65 64 31 36 28 29 2e 0a 2a 2f 0a 73 74 61 74  ded16()..*/.stat
12ba0 69 63 20 76 6f 69 64 20 74 65 73 74 5f 63 6f 6c  ic void test_col
12bb0 6c 61 74 65 5f 6e 65 65 64 65 64 5f 63 62 28 0a  late_needed_cb(.
12bc0 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20    void *pCtx, . 
12bd0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
12be0 69 6e 74 20 65 54 65 78 74 52 65 70 2c 0a 20 20  int eTextRep,.  
12bf0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4e 61 6d  const void *pNam
12c00 65 0a 29 7b 0a 20 20 69 6e 74 20 65 6e 63 20 3d  e.){.  int enc =
12c10 20 45 4e 43 28 64 62 29 3b 0a 20 20 69 6e 74 20   ENC(db);.  int 
12c20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  i;.  char *z;.  
12c30 66 6f 72 28 7a 20 3d 20 28 63 68 61 72 2a 29 70  for(z = (char*)p
12c40 4e 61 6d 65 2c 20 69 3d 30 3b 20 2a 7a 20 7c 7c  Name, i=0; *z ||
12c50 20 7a 5b 31 5d 3b 20 7a 2b 2b 29 7b 0a 20 20 20   z[1]; z++){.   
12c60 20 69 66 28 20 2a 7a 20 29 20 7a 4e 65 65 64 65   if( *z ) zNeede
12c70 64 43 6f 6c 6c 61 74 69 6f 6e 5b 69 2b 2b 5d 20  dCollation[i++] 
12c80 3d 20 2a 7a 3b 0a 20 20 7d 0a 20 20 7a 4e 65 65  = *z;.  }.  zNee
12c90 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 69 5d 20  dedCollation[i] 
12ca0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63  = 0;.  sqlite3_c
12cb0 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  reate_collation(
12cc0 0a 20 20 20 20 20 20 64 62 2c 20 22 74 65 73 74  .      db, "test
12cd0 5f 63 6f 6c 6c 61 74 65 22 2c 20 45 4e 43 28 64  _collate", ENC(d
12ce0 62 29 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54  b), SQLITE_INT_T
12cf0 4f 5f 50 54 52 28 65 6e 63 29 2c 20 74 65 73 74  O_PTR(enc), test
12d00 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 29 3b 0a  _collate_func);.
12d10 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
12d20 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65  add_test_collate
12d30 5f 6e 65 65 64 65 64 20 44 42 0a 2a 2f 0a 73 74  _needed DB.*/.st
12d40 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f  atic int test_co
12d50 6c 6c 61 74 65 5f 6e 65 65 64 65 64 28 0a 20 20  llate_needed(.  
12d60 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
12d70 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
12d80 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
12d90 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
12da0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
12db0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
12dc0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
12dd0 6f 62 6a 63 21 3d 32 20 29 20 67 6f 74 6f 20 62  objc!=2 ) goto b
12de0 61 64 5f 61 72 67 73 3b 0a 20 20 69 66 28 20 67  ad_args;.  if( g
12df0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
12e00 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
12e10 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
12e20 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
12e30 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
12e40 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65  te3_collation_ne
12e50 65 64 65 64 31 36 28 64 62 2c 20 30 2c 20 74 65  eded16(db, 0, te
12e60 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65  st_collate_neede
12e70 64 5f 63 62 29 3b 0a 20 20 7a 4e 65 65 64 65 64  d_cb);.  zNeeded
12e80 43 6f 6c 6c 61 74 69 6f 6e 5b 30 5d 20 3d 20 30  Collation[0] = 0
12e90 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
12ea0 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
12eb0 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
12ec0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
12ed0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
12ee0 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c  .bad_args:.  Tcl
12ef0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
12f00 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
12f10 44 42 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  DB");.  return T
12f20 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a  CL_ERROR;.}../*.
12f30 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 61 64 64  ** tclcmd:   add
12f40 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f  _alignment_test_
12f50 63 6f 6c 6c 61 74 69 6f 6e 73 20 20 44 42 0a 2a  collations  DB.*
12f60 2a 0a 2a 2a 20 41 64 64 20 74 77 6f 20 6e 65 77  *.** Add two new
12f70 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
12f80 6e 63 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nces to the data
12f90 62 61 73 65 20 44 42 0a 2a 2a 0a 2a 2a 20 20 20  base DB.**.**   
12fa0 20 20 75 74 66 31 36 5f 61 6c 69 67 6e 65 64 0a    utf16_aligned.
12fb0 2a 2a 20 20 20 20 20 75 74 66 31 36 5f 75 6e 61  **     utf16_una
12fc0 6c 69 67 6e 65 64 0a 2a 2a 0a 2a 2a 20 42 6f 74  ligned.**.** Bot
12fd0 68 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  h collating sequ
12fe0 65 6e 63 65 73 20 75 73 65 20 74 68 65 20 73 61  ences use the sa
12ff0 6d 65 20 73 6f 72 74 20 6f 72 64 65 72 20 61 73  me sort order as
13000 20 42 49 4e 41 52 59 2e 0a 2a 2a 20 54 68 65 20   BINARY..** The 
13010 6f 6e 6c 79 20 64 69 66 66 65 72 65 6e 63 65 20  only difference 
13020 69 73 20 74 68 61 74 20 74 68 65 20 75 74 66 31  is that the utf1
13030 36 5f 61 6c 69 67 6e 65 64 20 63 6f 6c 6c 61 74  6_aligned collat
13040 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20  ing.** sequence 
13050 69 73 20 64 65 63 6c 61 72 65 64 20 77 69 74 68  is declared with
13060 20 74 68 65 20 53 51 4c 49 54 45 5f 55 54 46 31   the SQLITE_UTF1
13070 36 5f 41 4c 49 47 4e 45 44 20 66 6c 61 67 2e 0a  6_ALIGNED flag..
13080 2a 2a 20 42 6f 74 68 20 63 6f 6c 6c 61 74 69 6e  ** Both collatin
13090 67 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 63 72  g functions incr
130a0 65 6d 65 6e 74 20 74 68 65 20 75 6e 61 6c 69 67  ement the unalig
130b0 6e 65 64 20 75 74 66 31 36 20 63 6f 75 6e 74 65  ned utf16 counte
130c0 72 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20 74 68  r.** whenever th
130d0 65 79 20 73 65 65 20 61 20 73 74 72 69 6e 67 20  ey see a string 
130e0 74 68 61 74 20 62 65 67 69 6e 73 20 6f 6e 20 61  that begins on a
130f0 6e 20 6f 64 64 20 62 79 74 65 20 62 6f 75 6e 64  n odd byte bound
13100 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ary..*/.static i
13110 6e 74 20 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72  nt unaligned_str
13120 69 6e 67 5f 63 6f 75 6e 74 65 72 20 3d 20 30 3b  ing_counter = 0;
13130 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 69 67  .static int alig
13140 6e 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63 28 0a 20  nmentCollFunc(. 
13150 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
13160 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
13170 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a  st void *pKey1,.
13180 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e    int nKey2, con
13190 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29  st void *pKey2.)
131a0 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20  {.  int rc, n;. 
131b0 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32   n = nKey1<nKey2
131c0 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32   ? nKey1 : nKey2
131d0 3b 0a 20 20 69 66 28 20 6e 4b 65 79 31 3e 30 20  ;.  if( nKey1>0 
131e0 26 26 20 31 3d 3d 28 31 26 28 53 51 4c 49 54 45  && 1==(1&(SQLITE
131f0 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 4b 65 79  _PTR_TO_INT(pKey
13200 31 29 29 29 20 29 20 75 6e 61 6c 69 67 6e 65 64  1))) ) unaligned
13210 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 2b  _string_counter+
13220 2b 3b 0a 20 20 69 66 28 20 6e 4b 65 79 32 3e 30  +;.  if( nKey2>0
13230 20 26 26 20 31 3d 3d 28 31 26 28 53 51 4c 49 54   && 1==(1&(SQLIT
13240 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 4b 65  E_PTR_TO_INT(pKe
13250 79 32 29 29 29 20 29 20 75 6e 61 6c 69 67 6e 65  y2))) ) unaligne
13260 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72  d_string_counter
13270 2b 2b 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d  ++;.  rc = memcm
13280 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20  p(pKey1, pKey2, 
13290 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20  n);.  if( rc==0 
132a0 29 7b 0a 20 20 20 20 72 63 20 3d 20 6e 4b 65 79  ){.    rc = nKey
132b0 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20  1 - nKey2;.  }. 
132c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74   return rc;.}.st
132d0 61 74 69 63 20 69 6e 74 20 61 64 64 5f 61 6c 69  atic int add_ali
132e0 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c  gnment_test_coll
132f0 61 74 69 6f 6e 73 28 0a 20 20 76 6f 69 64 20 2a  ations(.  void *
13300 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
13310 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
13320 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
13330 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
13340 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
13350 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 6f  te3 *db;.  if( o
13360 62 6a 63 3e 3d 32 20 29 7b 0a 20 20 20 20 69 66  bjc>=2 ){.    if
13370 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
13380 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
13390 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
133a0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
133b0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69  _ERROR;.    sqli
133c0 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
133d0 74 69 6f 6e 28 64 62 2c 20 22 75 74 66 31 36 5f  tion(db, "utf16_
133e0 75 6e 61 6c 69 67 6e 65 64 22 2c 20 53 51 4c 49  unaligned", SQLI
133f0 54 45 5f 55 54 46 31 36 2c 20 0a 20 20 20 20 20  TE_UTF16, .     
13400 20 20 20 30 2c 20 61 6c 69 67 6e 6d 65 6e 74 43     0, alignmentC
13410 6f 6c 6c 46 75 6e 63 29 3b 0a 20 20 20 20 73 71  ollFunc);.    sq
13420 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
13430 6c 61 74 69 6f 6e 28 64 62 2c 20 22 75 74 66 31  lation(db, "utf1
13440 36 5f 61 6c 69 67 6e 65 64 22 2c 20 53 51 4c 49  6_aligned", SQLI
13450 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44  TE_UTF16_ALIGNED
13460 2c 20 0a 20 20 20 20 20 20 20 20 30 2c 20 61 6c  , .        0, al
13470 69 67 6e 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63 29  ignmentCollFunc)
13480 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
13490 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
134a0 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
134b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
134c0 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  ) */../*.** Usag
134d0 65 3a 20 61 64 64 5f 74 65 73 74 5f 66 75 6e 63  e: add_test_func
134e0 74 69 6f 6e 20 3c 64 62 20 70 74 72 3e 20 3c 75  tion <db ptr> <u
134f0 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c  tf8> <utf16le> <
13500 75 74 66 31 36 62 65 3e 0a 2a 2a 0a 2a 2a 20 54  utf16be>.**.** T
13510 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
13520 75 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 61  used to test tha
13530 74 20 53 51 4c 69 74 65 20 73 65 6c 65 63 74 73  t SQLite selects
13540 20 74 68 65 20 63 6f 72 72 65 63 74 20 75 73 65   the correct use
13550 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 63 61  r.** function ca
13560 6c 6c 62 61 63 6b 20 77 68 65 6e 20 6d 75 6c 74  llback when mult
13570 69 70 6c 65 20 76 65 72 73 69 6f 6e 73 20 28 66  iple versions (f
13580 6f 72 20 64 69 66 66 65 72 65 6e 74 20 74 65 78  or different tex
13590 74 20 65 6e 63 6f 64 69 6e 67 73 29 0a 2a 2a 20  t encodings).** 
135a0 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a  are available..*
135b0 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69  *.** Calling thi
135c0 73 20 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74  s routine regist
135d0 65 72 73 20 75 70 20 74 6f 20 74 68 72 65 65 20  ers up to three 
135e0 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
135f0 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  user function.**
13600 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22   "test_function"
13610 20 77 69 74 68 20 64 61 74 61 62 61 73 65 20 68   with database h
13620 61 6e 64 6c 65 20 3c 64 62 3e 2e 20 20 49 66 20  andle <db>.  If 
13630 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
13640 65 6e 74 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20  ent is.** true, 
13650 74 68 65 6e 20 61 20 76 65 72 73 69 6f 6e 20 6f  then a version o
13660 66 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20  f test_function 
13670 69 73 20 72 65 67 69 73 74 65 72 65 64 20 66 6f  is registered fo
13680 72 20 55 54 46 2d 38 2c 20 69 66 20 74 68 65 0a  r UTF-8, if the.
13690 2a 2a 20 74 68 69 72 64 20 69 73 20 74 72 75 65  ** third is true
136a0 2c 20 61 20 76 65 72 73 69 6f 6e 20 69 73 20 72  , a version is r
136b0 65 67 69 73 74 65 72 65 64 20 66 6f 72 20 55 54  egistered for UT
136c0 46 2d 31 36 6c 65 2c 20 69 66 20 74 68 65 20 66  F-16le, if the f
136d0 6f 75 72 74 68 20 69 73 0a 2a 2a 20 74 72 75 65  ourth is.** true
136e0 2c 20 61 20 55 54 46 2d 31 36 62 65 20 76 65 72  , a UTF-16be ver
136f0 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c  sion is availabl
13700 65 2e 20 20 50 72 65 76 69 6f 75 73 20 76 65 72  e.  Previous ver
13710 73 69 6f 6e 73 20 6f 66 0a 2a 2a 20 74 65 73 74  sions of.** test
13720 5f 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 64 65  _function are de
13730 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  leted..**.** The
13740 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 69   user function i
13750 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  s implemented by
13760 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 66 6f 6c   calling the fol
13770 6c 6f 77 69 6e 67 20 54 43 4c 20 73 63 72 69 70  lowing TCL scrip
13780 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 74 65 73 74  t:.**.**   "test
13790 5f 66 75 6e 63 74 69 6f 6e 20 3c 65 6e 63 3e 20  _function <enc> 
137a0 3c 61 72 67 3e 22 0a 2a 2a 0a 2a 2a 20 57 68 65  <arg>".**.** Whe
137b0 72 65 20 3c 65 6e 63 3e 20 69 73 20 6f 6e 65 20  re <enc> is one 
137c0 6f 66 20 55 54 46 2d 38 2c 20 55 54 46 2d 31 36  of UTF-8, UTF-16
137d0 4c 45 20 6f 72 20 55 54 46 31 36 42 45 2c 20 61  LE or UTF16BE, a
137e0 6e 64 20 3c 61 72 67 3e 20 69 73 20 74 68 65 0a  nd <arg> is the.
137f0 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65  ** single argume
13800 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  nt passed to the
13810 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 54   SQL function. T
13820 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
13830 64 20 62 79 0a 2a 2a 20 74 68 65 20 54 43 4c 20  d by.** the TCL 
13840 73 63 72 69 70 74 20 69 73 20 75 73 65 64 20 61  script is used a
13850 73 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  s the return val
13860 75 65 20 6f 66 20 74 68 65 20 53 51 4c 20 66 75  ue of the SQL fu
13870 6e 63 74 69 6f 6e 2e 20 49 74 0a 2a 2a 20 69 73  nction. It.** is
13880 20 70 61 73 73 65 64 20 74 6f 20 53 51 4c 69 74   passed to SQLit
13890 65 20 75 73 69 6e 67 20 55 54 46 2d 31 36 42 45  e using UTF-16BE
138a0 20 66 6f 72 20 61 20 55 54 46 2d 38 20 74 65 73   for a UTF-8 tes
138b0 74 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 55 54  t_function(), UT
138c0 46 2d 38 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46  F-8.** for a UTF
138d0 2d 31 36 4c 45 20 74 65 73 74 5f 66 75 6e 63 74  -16LE test_funct
138e0 69 6f 6e 28 29 2c 20 61 6e 64 20 55 54 46 2d 31  ion(), and UTF-1
138f0 36 4c 45 20 66 6f 72 20 61 6e 20 69 6d 70 6c 65  6LE for an imple
13900 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 0a 2a  mentation that.*
13910 2a 20 70 72 65 66 65 72 73 20 55 54 46 2d 31 36  * prefers UTF-16
13920 42 45 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  BE..*/.#ifndef S
13930 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
13940 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73  .static void tes
13950 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 38 28  t_function_utf8(
13960 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
13970 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74  xt *pCtx, .  int
13980 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33   nArg,.  sqlite3
13990 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
139a0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
139b0 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a  nterp;.  Tcl_Obj
139c0 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f   *pX;.  sqlite3_
139d0 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69  value *pVal;.  i
139e0 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74  nterp = (Tcl_Int
139f0 65 72 70 20 2a 29 73 71 6c 69 74 65 33 5f 75 73  erp *)sqlite3_us
13a00 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20  er_data(pCtx);. 
13a10 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72   pX = Tcl_NewStr
13a20 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e  ingObj("test_fun
13a30 63 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54  ction", -1);.  T
13a40 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
13a50 70 58 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  pX);.  Tcl_ListO
13a60 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
13a70 69 6e 74 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f  interp, pX, Tcl_
13a80 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54  NewStringObj("UT
13a90 46 2d 38 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63  F-8", -1));.  Tc
13aa0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
13ab0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
13ac0 58 2c 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65  X, .      Tcl_Ne
13ad0 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72  wStringObj((char
13ae0 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
13af0 74 65 78 74 28 61 72 67 76 5b 30 5d 29 2c 20 2d  text(argv[0]), -
13b00 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f  1));.  Tcl_EvalO
13b10 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 58 2c  bjEx(interp, pX,
13b20 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52   0);.  Tcl_DecrR
13b30 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 73  efCount(pX);.  s
13b40 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
13b50 78 74 28 70 43 74 78 2c 20 54 63 6c 5f 47 65 74  xt(pCtx, Tcl_Get
13b60 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74  StringResult(int
13b70 65 72 70 29 2c 20 2d 31 2c 20 53 51 4c 49 54 45  erp), -1, SQLITE
13b80 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 70  _TRANSIENT);.  p
13b90 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Val = sqlite3Val
13ba0 75 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69  ueNew(0);.  sqli
13bb0 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70  te3ValueSetStr(p
13bc0 56 61 6c 2c 20 2d 31 2c 20 54 63 6c 5f 47 65 74  Val, -1, Tcl_Get
13bd0 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74  StringResult(int
13be0 65 72 70 29 2c 20 0a 20 20 20 20 20 20 53 51 4c  erp), .      SQL
13bf0 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
13c00 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69  _STATIC);.  sqli
13c10 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31  te3_result_text1
13c20 36 62 65 28 70 43 74 78 2c 20 73 71 6c 69 74 65  6be(pCtx, sqlite
13c30 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 62 65  3_value_text16be
13c40 28 70 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31  (pVal),.      -1
13c50 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
13c60 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  NT);.  sqlite3Va
13c70 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 7d  lueFree(pVal);.}
13c80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73  .static void tes
13c90 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36  t_function_utf16
13ca0 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  le(.  sqlite3_co
13cb0 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20  ntext *pCtx, .  
13cc0 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69  int nArg,.  sqli
13cd0 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
13ce0 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  .){.  Tcl_Interp
13cf0 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f   *interp;.  Tcl_
13d00 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74  Obj *pX;.  sqlit
13d10 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
13d20 20 20 69 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f    interp = (Tcl_
13d30 49 6e 74 65 72 70 20 2a 29 73 71 6c 69 74 65 33  Interp *)sqlite3
13d40 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29  _user_data(pCtx)
13d50 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77  ;.  pX = Tcl_New
13d60 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f  StringObj("test_
13d70 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a  function", -1);.
13d80 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
13d90 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f 4c 69  nt(pX);.  Tcl_Li
13da0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
13db0 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 54  nt(interp, pX, T
13dc0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
13dd0 22 55 54 46 2d 31 36 4c 45 22 2c 20 2d 31 29 29  "UTF-16LE", -1))
13de0 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
13df0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
13e00 65 72 70 2c 20 70 58 2c 20 0a 20 20 20 20 20 20  erp, pX, .      
13e10 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
13e20 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  ((char*)sqlite3_
13e30 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
13e40 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  0]), -1));.  Tcl
13e50 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72  _EvalObjEx(inter
13e60 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c  p, pX, 0);.  Tcl
13e70 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58  _DecrRefCount(pX
13e80 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69  );.  pVal = sqli
13e90 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a  te3ValueNew(0);.
13ea0 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
13eb0 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54  tStr(pVal, -1, T
13ec0 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
13ed0 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a 20 20 20  lt(interp), .   
13ee0 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20     SQLITE_UTF8, 
13ef0 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
13f00 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
13f10 5f 74 65 78 74 28 70 43 74 78 2c 28 63 68 61 72  _text(pCtx,(char
13f20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
13f30 74 65 78 74 28 70 56 61 6c 29 2c 2d 31 2c 53 51  text(pVal),-1,SQ
13f40 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
13f50 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
13f60 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 73 74 61  ree(pVal);.}.sta
13f70 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 66 75  tic void test_fu
13f80 6e 63 74 69 6f 6e 5f 75 74 66 31 36 62 65 28 0a  nction_utf16be(.
13f90 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
13fa0 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20  t *pCtx, .  int 
13fb0 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nArg,.  sqlite3_
13fc0 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
13fd0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
13fe0 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  terp;.  Tcl_Obj 
13ff0 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  *pX;.  sqlite3_v
14000 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e  alue *pVal;.  in
14010 74 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65  terp = (Tcl_Inte
14020 72 70 20 2a 29 73 71 6c 69 74 65 33 5f 75 73 65  rp *)sqlite3_use
14030 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20  r_data(pCtx);.  
14040 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  pX = Tcl_NewStri
14050 6e 67 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e 63  ngObj("test_func
14060 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63  tion", -1);.  Tc
14070 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
14080 58 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  X);.  Tcl_ListOb
14090 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
140a0 6e 74 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e  nterp, pX, Tcl_N
140b0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46  ewStringObj("UTF
140c0 2d 31 36 42 45 22 2c 20 2d 31 29 29 3b 0a 20 20  -16BE", -1));.  
140d0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
140e0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
140f0 20 70 58 2c 20 0a 20 20 20 20 20 20 54 63 6c 5f   pX, .      Tcl_
14100 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68  NewStringObj((ch
14110 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
14120 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 2c  e_text(argv[0]),
14130 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61   -1));.  Tcl_Eva
14140 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70  lObjEx(interp, p
14150 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63  X, 0);.  Tcl_Dec
14160 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20  rRefCount(pX);. 
14170 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56   pVal = sqlite3V
14180 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73 71  alueNew(0);.  sq
14190 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
141a0 28 70 56 61 6c 2c 20 2d 31 2c 20 54 63 6c 5f 47  (pVal, -1, Tcl_G
141b0 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69  etStringResult(i
141c0 6e 74 65 72 70 29 2c 20 0a 20 20 20 20 20 20 53  nterp), .      S
141d0 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
141e0 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71  TE_STATIC);.  sq
141f0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
14200 74 31 36 28 70 43 74 78 2c 20 73 71 6c 69 74 65  t16(pCtx, sqlite
14210 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 6c 65  3_value_text16le
14220 28 70 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31  (pVal),.      -1
14230 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
14240 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  NT);.  sqlite3_r
14250 65 73 75 6c 74 5f 74 65 78 74 31 36 62 65 28 70  esult_text16be(p
14260 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  Ctx, sqlite3_val
14270 75 65 5f 74 65 78 74 31 36 6c 65 28 70 56 61 6c  ue_text16le(pVal
14280 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53 51 4c  ),.      -1, SQL
14290 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
142a0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
142b0 5f 74 65 78 74 31 36 6c 65 28 70 43 74 78 2c 20  _text16le(pCtx, 
142c0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
142d0 78 74 31 36 6c 65 28 70 56 61 6c 29 2c 0a 20 20  xt16le(pVal),.  
142e0 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54      -1, SQLITE_T
142f0 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c  RANSIENT);.  sql
14300 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
14310 61 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  al);.}.#endif /*
14320 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
14330 31 36 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  16 */.static int
14340 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 28 0a   test_function(.
14350 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
14360 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
14370 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
14380 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
14390 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
143a0 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
143b0 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71  _OMIT_UTF16.  sq
143c0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
143d0 20 76 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a   val;..  if( obj
143e0 63 21 3d 35 20 29 20 67 6f 74 6f 20 62 61 64 5f  c!=5 ) goto bad_
143f0 61 72 67 73 3b 0a 20 20 69 66 28 20 67 65 74 44  args;.  if( getD
14400 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
14410 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
14420 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
14430 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14440 3b 0a 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21  ;..  if( TCL_OK!
14450 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46  =Tcl_GetBooleanF
14460 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
14470 62 6a 76 5b 32 5d 2c 20 26 76 61 6c 29 20 29 20  bjv[2], &val) ) 
14480 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14490 3b 0a 20 20 69 66 28 20 76 61 6c 20 29 7b 0a 20  ;.  if( val ){. 
144a0 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
144b0 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
144c0 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20  test_function", 
144d0 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
144e0 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c  .        interp,
144f0 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75   test_function_u
14500 74 66 38 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  tf8, 0, 0);.  }.
14510 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
14520 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
14530 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
14540 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74  [3], &val) ) ret
14550 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
14560 20 69 66 28 20 76 61 6c 20 29 7b 0a 20 20 20 20   if( val ){.    
14570 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
14580 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74 65 73  unction(db, "tes
14590 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 31 2c 20  t_function", 1, 
145a0 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20  SQLITE_UTF16LE, 
145b0 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c  .        interp,
145c0 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75   test_function_u
145d0 74 66 31 36 6c 65 2c 20 30 2c 20 30 29 3b 0a 20  tf16le, 0, 0);. 
145e0 20 7d 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21   }.  if( TCL_OK!
145f0 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46  =Tcl_GetBooleanF
14600 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
14610 62 6a 76 5b 34 5d 2c 20 26 76 61 6c 29 20 29 20  bjv[4], &val) ) 
14620 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14630 3b 0a 20 20 69 66 28 20 76 61 6c 20 29 7b 0a 20  ;.  if( val ){. 
14640 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
14650 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
14660 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20  test_function", 
14670 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  1, SQLITE_UTF16B
14680 45 2c 20 0a 20 20 20 20 20 20 20 20 69 6e 74 65  E, .        inte
14690 72 70 2c 20 74 65 73 74 5f 66 75 6e 63 74 69 6f  rp, test_functio
146a0 6e 5f 75 74 66 31 36 62 65 2c 20 30 2c 20 30 29  n_utf16be, 0, 0)
146b0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
146c0 54 43 4c 5f 4f 4b 3b 0a 62 61 64 5f 61 72 67 73  TCL_OK;.bad_args
146d0 3a 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  :.  Tcl_AppendRe
146e0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
146f0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
14700 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
14710 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
14720 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
14730 29 2c 20 22 20 3c 44 42 3e 20 3c 75 74 66 38 3e  ), " <DB> <utf8>
14740 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31   <utf16le> <utf1
14750 36 62 65 3e 22 2c 20 30 29 3b 0a 23 65 6e 64 69  6be>", 0);.#endi
14760 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
14770 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75  _UTF16 */.  retu
14780 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a  rn TCL_ERROR;.}.
14790 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
147a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65        sqlite3_te
147b0 73 74 5f 65 72 72 73 74 72 20 3c 65 72 72 20 63  st_errstr <err c
147c0 6f 64 65 3e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  ode>.**.** Test 
147d0 74 68 61 74 20 74 68 65 20 65 6e 67 6c 69 73 68  that the english
147e0 20 6c 61 6e 67 75 61 67 65 20 73 74 72 69 6e 67   language string
147f0 20 65 71 75 69 76 61 6c 65 6e 74 73 20 66 6f 72   equivalents for
14800 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f   sqlite error co
14810 64 65 73 0a 2a 2a 20 61 72 65 20 73 61 6e 65 2e  des.** are sane.
14820 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 69   The parameter i
14830 73 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65 70  s an integer rep
14840 72 65 73 65 6e 74 69 6e 67 20 61 6e 20 73 71 6c  resenting an sql
14850 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
14860 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69 73  ** The result is
14870 20 61 20 6c 69 73 74 20 6f 66 20 74 77 6f 20 65   a list of two e
14880 6c 65 6d 65 6e 74 73 2c 20 74 68 65 20 73 74 72  lements, the str
14890 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69  ing representati
148a0 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 65 72 72  on of the.** err
148b0 6f 72 20 63 6f 64 65 20 61 6e 64 20 74 68 65 20  or code and the 
148c0 65 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65  english language
148d0 20 65 78 70 6c 61 6e 61 74 69 6f 6e 2e 0a 2a 2f   explanation..*/
148e0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
148f0 5f 65 72 72 73 74 72 28 0a 20 20 76 6f 69 64 20  _errstr(.  void 
14900 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
14910 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
14920 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
14930 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
14940 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 68 61   objv[].){.  cha
14950 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 69 6e 74 20  r *zCode;.  int 
14960 69 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31  i;.  if( objc!=1
14970 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
14980 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
14990 20 31 2c 20 6f 62 6a 76 2c 20 22 3c 65 72 72 6f   1, objv, "<erro
149a0 72 20 63 6f 64 65 3e 22 29 3b 0a 20 20 7d 0a 0a  r code>");.  }..
149b0 20 20 7a 43 6f 64 65 20 3d 20 54 63 6c 5f 47 65    zCode = Tcl_Ge
149c0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
149d0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32  ;.  for(i=0; i<2
149e0 30 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  00; i++){.    if
149f0 28 20 30 3d 3d 73 74 72 63 6d 70 28 74 31 45 72  ( 0==strcmp(t1Er
14a00 72 6f 72 4e 61 6d 65 28 69 29 2c 20 7a 43 6f 64  rorName(i), zCod
14a10 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  e) ) break;.  }.
14a20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
14a30 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
14a40 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 69 29  sqlite3ErrStr(i)
14a50 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
14a60 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
14a70 55 73 61 67 65 3a 20 20 20 20 62 72 65 61 6b 70  Usage:    breakp
14a80 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  oint.**.** This 
14a90 72 6f 75 74 69 6e 65 20 65 78 69 73 74 73 20 66  routine exists f
14aa0 6f 72 20 6f 6e 65 20 70 75 72 70 6f 73 65 20 2d  or one purpose -
14ab0 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20 70 6c   to provide a pl
14ac0 61 63 65 20 74 6f 20 70 75 74 20 61 0a 2a 2a 20  ace to put a.** 
14ad0 62 72 65 61 6b 70 6f 69 6e 74 20 77 69 74 68 20  breakpoint with 
14ae0 47 44 42 20 74 68 61 74 20 63 61 6e 20 62 65 20  GDB that can be 
14af0 74 72 69 67 67 65 72 65 64 20 75 73 69 6e 67 20  triggered using 
14b00 54 43 4c 20 63 6f 64 65 2e 20 20 54 68 65 20 75  TCL code.  The u
14b10 73 65 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 69  se.** for this i
14b20 73 20 77 68 65 6e 20 61 20 70 61 72 74 69 63 75  s when a particu
14b30 6c 61 72 20 74 65 73 74 20 66 61 69 6c 73 20 6f  lar test fails o
14b40 6e 20 28 73 61 79 29 20 74 68 65 20 31 34 38 35  n (say) the 1485
14b50 74 68 20 69 74 65 72 61 74 69 6f 6e 2e 0a 2a 2a  th iteration..**
14b60 20 49 6e 20 74 68 65 20 54 43 4c 20 74 65 73 74   In the TCL test
14b70 20 73 63 72 69 70 74 2c 20 77 65 20 63 61 6e 20   script, we can 
14b80 61 64 64 20 63 6f 64 65 20 6c 69 6b 65 20 74 68  add code like th
14b90 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 69 66  is:.**.**     if
14ba0 20 7b 24 69 3d 3d 31 34 38 35 7d 20 62 72 65 61   {$i==1485} brea
14bb0 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 65  kpoint.**.** The
14bc0 6e 20 72 75 6e 20 74 65 73 74 66 69 78 74 75 72  n run testfixtur
14bd0 65 20 69 6e 20 74 68 65 20 64 65 62 75 67 67 65  e in the debugge
14be0 72 20 61 6e 64 20 77 61 69 74 20 66 6f 72 20 74  r and wait for t
14bf0 68 65 20 62 72 65 61 6b 70 6f 69 6e 74 20 74 6f  he breakpoint to
14c00 0a 2a 2a 20 66 69 72 65 2e 20 20 54 68 65 6e 20  .** fire.  Then 
14c10 61 64 64 69 74 69 6f 6e 61 6c 20 62 72 65 61 6b  additional break
14c20 70 6f 69 6e 74 73 20 63 61 6e 20 62 65 20 73 65  points can be se
14c30 74 20 74 6f 20 74 72 61 63 65 20 64 6f 77 6e 20  t to trace down 
14c40 74 68 65 20 62 75 67 2e 0a 2a 2f 0a 73 74 61 74  the bug..*/.stat
14c50 69 63 20 69 6e 74 20 74 65 73 74 5f 62 72 65 61  ic int test_brea
14c60 6b 70 6f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a  kpoint(.  void *
14c70 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
14c80 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
14c90 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
14ca0 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
14cb0 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
14cc0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
14cd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
14ce0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
14cf0 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
14d00 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
14d10 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
14d20 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
14d30 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
14d40 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  ;         /* Do 
14d50 6e 6f 74 68 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a  nothing */.}../*
14d60 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
14d70 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c  ite3_bind_zerobl
14d80 6f 62 20 20 53 54 4d 54 20 49 44 58 20 4e 0a 2a  ob  STMT IDX N.*
14d90 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71  *.** Test the sq
14da0 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62  lite3_bind_zerob
14db0 6c 6f 62 20 69 6e 74 65 72 66 61 63 65 2e 20 20  lob interface.  
14dc0 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72  STMT is a prepar
14dd0 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  ed statement..**
14de0 20 49 44 58 20 69 73 20 74 68 65 20 69 6e 64 65   IDX is the inde
14df0 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20  x of a wildcard 
14e00 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
14e10 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73  statement.  This
14e20 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64   command.** bind
14e30 73 20 61 20 4e 2d 62 79 74 65 20 7a 65 72 6f 2d  s a N-byte zero-
14e40 66 69 6c 6c 65 64 20 42 4c 4f 42 20 74 6f 20 74  filled BLOB to t
14e50 68 65 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a  he wildcard..*/.
14e60 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
14e70 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 28 0a 20  bind_zeroblob(. 
14e80 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
14e90 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
14ea0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
14eb0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
14ec0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
14ed0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
14ee0 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64  *pStmt;.  int id
14ef0 78 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e  x;.  int n;.  in
14f00 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
14f10 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
14f20 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
14f30 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
14f40 54 4d 54 20 49 44 58 20 4e 22 29 3b 0a 20 20 20  TMT IDX N");.   
14f50 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
14f60 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
14f70 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
14f80 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
14f90 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
14fa0 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
14fb0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
14fc0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
14fd0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
14fe0 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e  , &idx) ) return
14ff0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
15000 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
15010 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
15020 5b 33 5d 2c 20 26 6e 29 20 29 20 72 65 74 75 72  [3], &n) ) retur
15030 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
15040 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
15050 64 5f 7a 65 72 6f 62 6c 6f 62 28 70 53 74 6d 74  d_zeroblob(pStmt
15060 2c 20 69 64 78 2c 20 6e 29 3b 0a 20 20 69 66 28  , idx, n);.  if(
15070 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
15080 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74  ode(interp, Stmt
15090 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29  ToDb(pStmt), rc)
150a0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
150b0 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ROR;.  if( rc!=S
150c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
150d0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
150e0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
150f0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
15100 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
15110 33 5f 62 69 6e 64 5f 69 6e 74 20 20 53 54 4d 54  3_bind_int  STMT
15120 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54   N VALUE.**.** T
15130 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f  est the sqlite3_
15140 62 69 6e 64 5f 69 6e 74 20 69 6e 74 65 72 66 61  bind_int interfa
15150 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70  ce.  STMT is a p
15160 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
15170 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69  t..** N is the i
15180 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61  ndex of a wildca
15190 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72  rd in the prepar
151a0 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ed statement.  T
151b0 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62  his command.** b
151c0 69 6e 64 73 20 61 20 33 32 2d 62 69 74 20 69 6e  inds a 32-bit in
151d0 74 65 67 65 72 20 56 41 4c 55 45 20 74 6f 20 74  teger VALUE to t
151e0 68 61 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f  hat wildcard..*/
151f0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
15200 5f 62 69 6e 64 5f 69 6e 74 28 0a 20 20 76 6f 69  _bind_int(.  voi
15210 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
15220 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
15230 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
15240 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
15250 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
15260 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
15270 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  mt;.  int idx;. 
15280 20 69 6e 74 20 76 61 6c 75 65 3b 0a 20 20 69 6e   int value;.  in
15290 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
152a0 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
152b0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
152c0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
152d0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
152e0 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
152f0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
15300 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53  objv[0], 0), " S
15310 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20 30 29  TMT N VALUE", 0)
15320 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
15330 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
15340 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
15350 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
15360 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
15370 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
15380 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15390 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
153a0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
153b0 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72  jv[2], &idx) ) r
153c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
153d0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
153e0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
153f0 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65   objv[3], &value
15400 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
15410 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
15420 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
15430 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65  Stmt, idx, value
15440 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
15450 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
15460 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74  rp, StmtToDb(pSt
15470 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72  mt), rc) ) retur
15480 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
15490 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
154a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
154b0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
154c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
154d0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  }.../*.** Usage:
154e0 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
154f0 69 6e 74 36 34 20 20 53 54 4d 54 20 4e 20 56 41  int64  STMT N VA
15500 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  LUE.**.** Test t
15510 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  he sqlite3_bind_
15520 69 6e 74 36 34 20 69 6e 74 65 72 66 61 63 65 2e  int64 interface.
15530 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70    STMT is a prep
15540 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
15550 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65  ** N is the inde
15560 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20  x of a wildcard 
15570 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
15580 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73  statement.  This
15590 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64   command.** bind
155a0 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67  s a 64-bit integ
155b0 65 72 20 56 41 4c 55 45 20 74 6f 20 74 68 61 74  er VALUE to that
155c0 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74   wildcard..*/.st
155d0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69  atic int test_bi
155e0 6e 64 5f 69 6e 74 36 34 28 0a 20 20 76 6f 69 64  nd_int64(.  void
155f0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
15600 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
15610 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
15620 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
15630 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
15640 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
15650 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  t;.  int idx;.  
15660 54 63 6c 5f 57 69 64 65 49 6e 74 20 76 61 6c 75  Tcl_WideInt valu
15670 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  e;.  int rc;..  
15680 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
15690 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
156a0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
156b0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
156c0 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
156d0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
156e0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
156f0 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c  0), " STMT N VAL
15700 55 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  UE", 0);.    ret
15710 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
15720 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
15730 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
15740 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
15750 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
15760 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
15770 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
15780 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
15790 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69  erp, objv[2], &i
157a0 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  dx) ) return TCL
157b0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
157c0 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d  l_GetWideIntFrom
157d0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
157e0 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20 29 20 72  [3], &value) ) r
157f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
15800 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
15810 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d  _bind_int64(pStm
15820 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 29 3b 0a  t, idx, value);.
15830 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
15840 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
15850 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29   StmtToDb(pStmt)
15860 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
15870 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
15880 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
15890 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
158a0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65  ERROR;.  }..  re
158b0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
158c0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
158d0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75  sqlite3_bind_dou
158e0 62 6c 65 20 20 53 54 4d 54 20 4e 20 56 41 4c 55  ble  STMT N VALU
158f0 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65  E.**.** Test the
15900 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f   sqlite3_bind_do
15910 75 62 6c 65 20 69 6e 74 65 72 66 61 63 65 2e 20  uble interface. 
15920 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61   STMT is a prepa
15930 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  red statement..*
15940 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78  * N is the index
15950 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69   of a wildcard i
15960 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
15970 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20  tatement.  This 
15980 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73  command.** binds
15990 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65   a 64-bit intege
159a0 72 20 56 41 4c 55 45 20 74 6f 20 74 68 61 74 20  r VALUE to that 
159b0 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61  wildcard..*/.sta
159c0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
159d0 64 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64  d_double(.  void
159e0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
159f0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
15a00 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
15a10 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
15a20 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
15a30 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
15a40 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  t;.  int idx;.  
15a50 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20  double value;.  
15a60 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20  int rc;.  const 
15a70 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 20 20 69 6e  char *zVal;.  in
15a80 74 20 69 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  t i;.  static co
15a90 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
15aa0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
15ab0 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  me;     /* Name 
15ac0 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 66  of the special f
15ad0 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
15ae0 6c 75 65 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67  lue */.    unsig
15af0 6e 65 64 20 69 6e 74 20 69 55 70 70 65 72 3b 20  ned int iUpper; 
15b00 20 20 2f 2a 20 55 70 70 65 72 20 33 32 20 62 69    /* Upper 32 bi
15b10 74 73 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e  ts */.    unsign
15b20 65 64 20 69 6e 74 20 69 4c 6f 77 65 72 3b 20 20  ed int iLower;  
15b30 20 2f 2a 20 4c 6f 77 65 72 20 33 32 20 62 69 74   /* Lower 32 bit
15b40 73 20 2a 2f 0a 20 20 7d 20 61 53 70 65 63 69 61  s */.  } aSpecia
15b50 6c 46 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  lFp[] = {.    { 
15b60 20 22 4e 61 4e 22 2c 20 20 20 20 20 20 30 78 37   "NaN",      0x7
15b70 66 66 66 66 66 66 66 2c 20 30 78 66 66 66 66 66  fffffff, 0xfffff
15b80 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22 53  fff },.    {  "S
15b90 4e 61 4e 22 2c 20 20 20 20 20 30 78 37 66 66 37  NaN",     0x7ff7
15ba0 66 66 66 66 2c 20 30 78 66 66 66 66 66 66 66 66  ffff, 0xffffffff
15bb0 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 4e 61 4e   },.    {  "-NaN
15bc0 22 2c 20 20 20 20 20 30 78 66 66 66 66 66 66 66  ",     0xfffffff
15bd0 66 2c 20 30 78 66 66 66 66 66 66 66 66 20 7d 2c  f, 0xffffffff },
15be0 0a 20 20 20 20 7b 20 20 22 2d 53 4e 61 4e 22 2c  .    {  "-SNaN",
15bf0 20 20 20 20 30 78 66 66 66 37 66 66 66 66 2c 20      0xfff7ffff, 
15c00 30 78 66 66 66 66 66 66 66 66 20 7d 2c 0a 20 20  0xffffffff },.  
15c10 20 20 7b 20 20 22 2b 49 6e 66 22 2c 20 20 20 20    {  "+Inf",    
15c20 20 30 78 37 66 66 30 30 30 30 30 2c 20 30 78 30   0x7ff00000, 0x0
15c30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b  0000000 },.    {
15c40 20 20 22 2d 49 6e 66 22 2c 20 20 20 20 20 30 78    "-Inf",     0x
15c50 66 66 66 30 30 30 30 30 2c 20 30 78 30 30 30 30  fff00000, 0x0000
15c60 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 20 22  0000 },.    {  "
15c70 45 70 73 69 6c 6f 6e 22 2c 20 20 30 78 30 30 30  Epsilon",  0x000
15c80 30 30 30 30 30 2c 20 30 78 30 30 30 30 30 30 30  00000, 0x0000000
15c90 31 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 45 70  1 },.    {  "-Ep
15ca0 73 69 6c 6f 6e 22 2c 20 30 78 38 30 30 30 30 30  silon", 0x800000
15cb0 30 30 2c 20 30 78 30 30 30 30 30 30 30 31 20 7d  00, 0x00000001 }
15cc0 2c 0a 20 20 20 20 7b 20 20 22 4e 61 4e 30 22 2c  ,.    {  "NaN0",
15cd0 20 20 20 20 20 30 78 37 66 66 38 30 30 30 30 2c       0x7ff80000,
15ce0 20 30 78 30 30 30 30 30 30 30 30 20 7d 2c 0a 20   0x00000000 },. 
15cf0 20 20 20 7b 20 20 22 2d 4e 61 4e 30 22 2c 20 20     {  "-NaN0",  
15d00 20 20 30 78 66 66 66 38 30 30 30 30 2c 20 30 78    0xfff80000, 0x
15d10 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 7d 3b  00000000 },.  };
15d20 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20  ..  if( objc!=4 
15d30 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
15d40 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
15d50 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
15d60 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
15d70 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
15d80 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
15d90 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e  0], 0), " STMT N
15da0 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20   VALUE", 0);.   
15db0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
15dc0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
15dd0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
15de0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
15df0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
15e00 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
15e10 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
15e20 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
15e30 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
15e40 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e  , &idx) ) return
15e50 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f   TCL_ERROR;..  /
15e60 2a 20 49 6e 74 65 72 63 65 70 74 20 74 68 65 20  * Intercept the 
15e70 73 74 72 69 6e 67 20 22 4e 61 4e 22 20 61 6e 64  string "NaN" and
15e80 20 67 65 6e 65 72 61 74 65 20 61 20 4e 61 4e 20   generate a NaN 
15e90 76 61 6c 75 65 20 66 6f 72 20 69 74 2e 0a 20 20  value for it..  
15ea0 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 73 74 72  ** All other str
15eb0 69 6e 67 73 20 61 72 65 20 70 61 73 73 65 64 20  ings are passed 
15ec0 74 68 72 6f 75 67 68 20 74 6f 20 54 63 6c 5f 47  through to Tcl_G
15ed0 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28  etDoubleFromObj(
15ee0 29 2e 0a 20 20 2a 2a 20 54 63 6c 5f 47 65 74 44  )..  ** Tcl_GetD
15ef0 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 29 20 73  oubleFromObj() s
15f00 68 6f 75 6c 64 20 75 6e 64 65 72 73 74 61 6e 64  hould understand
15f10 20 22 4e 61 4e 22 20 62 75 74 20 73 6f 6d 65 20   "NaN" but some 
15f20 76 65 72 73 69 6f 6e 73 0a 20 20 2a 2a 20 63 6f  versions.  ** co
15f30 6e 74 61 69 6e 20 61 20 62 75 67 2e 0a 20 20 2a  ntain a bug..  *
15f40 2f 0a 20 20 7a 56 61 6c 20 3d 20 54 63 6c 5f 47  /.  zVal = Tcl_G
15f50 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
15f60 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
15f70 73 69 7a 65 6f 66 28 61 53 70 65 63 69 61 6c 46  sizeof(aSpecialF
15f80 70 29 2f 73 69 7a 65 6f 66 28 61 53 70 65 63 69  p)/sizeof(aSpeci
15f90 61 6c 46 70 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  alFp[0]); i++){.
15fa0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
15fb0 53 70 65 63 69 61 6c 46 70 5b 69 5d 2e 7a 4e 61  SpecialFp[i].zNa
15fc0 6d 65 2c 20 7a 56 61 6c 29 3d 3d 30 20 29 7b 0a  me, zVal)==0 ){.
15fd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 75 69        sqlite3_ui
15fe0 6e 74 36 34 20 78 3b 0a 20 20 20 20 20 20 78 20  nt64 x;.      x 
15ff0 3d 20 61 53 70 65 63 69 61 6c 46 70 5b 69 5d 2e  = aSpecialFp[i].
16000 69 55 70 70 65 72 3b 0a 20 20 20 20 20 20 78 20  iUpper;.      x 
16010 3c 3c 3d 20 33 32 3b 0a 20 20 20 20 20 20 78 20  <<= 32;.      x 
16020 7c 3d 20 61 53 70 65 63 69 61 6c 46 70 5b 69 5d  |= aSpecialFp[i]
16030 2e 69 4c 6f 77 65 72 3b 0a 20 20 20 20 20 20 61  .iLower;.      a
16040 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 61  ssert( sizeof(va
16050 6c 75 65 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20  lue)==8 );.     
16060 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
16070 78 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 6d  x)==8 );.      m
16080 65 6d 63 70 79 28 26 76 61 6c 75 65 2c 20 26 78  emcpy(&value, &x
16090 2c 20 38 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 8);.      brea
160a0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
160b0 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28 61 53 70  f( i>=sizeof(aSp
160c0 65 63 69 61 6c 46 70 29 2f 73 69 7a 65 6f 66 28  ecialFp)/sizeof(
160d0 61 53 70 65 63 69 61 6c 46 70 5b 30 5d 29 20 26  aSpecialFp[0]) &
160e0 26 0a 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47  &.         Tcl_G
160f0 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28  etDoubleFromObj(
16100 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
16110 20 26 76 61 6c 75 65 29 20 29 7b 0a 20 20 20 20   &value) ){.    
16120 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16130 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
16140 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65  ite3_bind_double
16150 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c  (pStmt, idx, val
16160 75 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ue);.  if( sqlit
16170 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
16180 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70  terp, StmtToDb(p
16190 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74  Stmt), rc) ) ret
161a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
161b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
161c0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
161d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
161e0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
161f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
16200 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
16210 5f 6e 75 6c 6c 20 20 53 54 4d 54 20 4e 0a 2a 2a  _null  STMT N.**
16220 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c  .** Test the sql
16230 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 69  ite3_bind_null i
16240 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20  nterface.  STMT 
16250 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74  is a prepared st
16260 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73  atement..** N is
16270 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
16280 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20  wildcard in the 
16290 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
162a0 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e  nt.  This comman
162b0 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 4e 55 4c  d.** binds a NUL
162c0 4c 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72  L to the wildcar
162d0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
162e0 20 74 65 73 74 5f 62 69 6e 64 5f 6e 75 6c 6c 28   test_bind_null(
162f0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
16300 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
16310 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
16320 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
16330 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
16340 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
16350 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
16360 69 64 78 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  idx;.  int rc;..
16370 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
16380 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
16390 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
163a0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
163b0 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
163c0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
163d0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
163e0 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 22 2c  , 0), " STMT N",
163f0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
16400 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
16410 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
16420 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
16430 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
16440 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
16450 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16460 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
16470 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
16480 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20   objv[2], &idx) 
16490 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
164a0 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
164b0 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53  te3_bind_null(pS
164c0 74 6d 74 2c 20 69 64 78 29 3b 0a 20 20 69 66 28  tmt, idx);.  if(
164d0 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
164e0 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74  ode(interp, Stmt
164f0 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29  ToDb(pStmt), rc)
16500 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
16510 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ROR;.  if( rc!=S
16520 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16530 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16540 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
16550 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
16560 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
16570 33 5f 62 69 6e 64 5f 74 65 78 74 20 20 53 54 4d  3_bind_text  STM
16580 54 20 4e 20 53 54 52 49 4e 47 20 42 59 54 45 53  T N STRING BYTES
16590 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20  .**.** Test the 
165a0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
165b0 74 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54  t interface.  ST
165c0 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64  MT is a prepared
165d0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e   statement..** N
165e0 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
165f0 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74   a wildcard in t
16600 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
16610 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d  ement.  This com
16620 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20  mand.** binds a 
16630 55 54 46 2d 38 20 73 74 72 69 6e 67 20 53 54 52  UTF-8 string STR
16640 49 4e 47 20 74 6f 20 74 68 65 20 77 69 6c 64 63  ING to the wildc
16650 61 72 64 2e 20 20 54 68 65 20 73 74 72 69 6e 67  ard.  The string
16660 20 69 73 20 42 59 54 45 53 20 62 79 74 65 73 0a   is BYTES bytes.
16670 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  ** long..*/.stat
16680 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
16690 5f 74 65 78 74 28 0a 20 20 76 6f 69 64 20 2a 20  _text(.  void * 
166a0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
166b0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
166c0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
166d0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
166e0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
166f0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
16700 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74    int idx;.  int
16710 20 62 79 74 65 73 3b 0a 20 20 63 68 61 72 20 2a   bytes;.  char *
16720 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b  value;.  int rc;
16730 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20  ..  if( objc!=5 
16740 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
16750 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
16760 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
16770 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
16780 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
16790 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
167a0 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e  0], 0), " STMT N
167b0 20 56 41 4c 55 45 20 42 59 54 45 53 22 2c 20 30   VALUE BYTES", 0
167c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
167d0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
167e0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
167f0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
16800 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
16810 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
16820 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16830 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
16840 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
16850 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  bjv[2], &idx) ) 
16860 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16870 3b 0a 20 20 76 61 6c 75 65 20 3d 20 28 63 68 61  ;.  value = (cha
16880 72 2a 29 54 63 6c 5f 47 65 74 42 79 74 65 41 72  r*)Tcl_GetByteAr
16890 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  rayFromObj(objv[
168a0 33 5d 2c 20 26 62 79 74 65 73 29 3b 0a 20 20 69  3], &bytes);.  i
168b0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
168c0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
168d0 76 5b 34 5d 2c 20 26 62 79 74 65 73 29 20 29 20  v[4], &bytes) ) 
168e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
168f0 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
16900 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d  3_bind_text(pStm
16910 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 2c 20 62  t, idx, value, b
16920 79 74 65 73 2c 20 53 51 4c 49 54 45 5f 54 52 41  ytes, SQLITE_TRA
16930 4e 53 49 45 4e 54 29 3b 0a 20 20 69 66 28 20 73  NSIENT);.  if( s
16940 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
16950 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f  e(interp, StmtTo
16960 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29  Db(pStmt), rc) )
16970 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16980 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  R;.  if( rc!=SQL
16990 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
169a0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
169b0 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72  nterp, sqlite3Er
169c0 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
169d0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
169e0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ROR;.  }..  retu
169f0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
16a00 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
16a10 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36  ite3_bind_text16
16a20 20 3f 2d 73 74 61 74 69 63 3f 20 53 54 4d 54 20   ?-static? STMT 
16a30 4e 20 53 54 52 49 4e 47 20 42 59 54 45 53 0a 2a  N STRING BYTES.*
16a40 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71  *.** Test the sq
16a50 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31  lite3_bind_text1
16a60 36 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54  6 interface.  ST
16a70 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64  MT is a prepared
16a80 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e   statement..** N
16a90 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
16aa0 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74   a wildcard in t
16ab0 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
16ac0 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d  ement.  This com
16ad0 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20  mand.** binds a 
16ae0 55 54 46 2d 31 36 20 73 74 72 69 6e 67 20 53 54  UTF-16 string ST
16af0 52 49 4e 47 20 74 6f 20 74 68 65 20 77 69 6c 64  RING to the wild
16b00 63 61 72 64 2e 20 20 54 68 65 20 73 74 72 69 6e  card.  The strin
16b10 67 20 69 73 20 42 59 54 45 53 20 62 79 74 65 73  g is BYTES bytes
16b20 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  .** long..*/.sta
16b30 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
16b40 64 5f 74 65 78 74 31 36 28 0a 20 20 76 6f 69 64  d_text16(.  void
16b50 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
16b60 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
16b70 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
16b80 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
16b90 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e  T objv[].){.#ifn
16ba0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16bb0 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33 5f  UTF16.  sqlite3_
16bc0 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
16bd0 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 62 79  nt idx;.  int by
16be0 74 65 73 3b 0a 20 20 63 68 61 72 20 2a 76 61 6c  tes;.  char *val
16bf0 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ue;.  int rc;.. 
16c00 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f   void (*xDel)(vo
16c10 69 64 2a 29 20 3d 20 28 6f 62 6a 63 3d 3d 36 3f  id*) = (objc==6?
16c20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 3a 53 51  SQLITE_STATIC:SQ
16c30 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
16c40 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 53 74 6d  .  Tcl_Obj *oStm
16c50 74 20 20 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63  t    = objv[objc
16c60 2d 34 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  -4];.  Tcl_Obj *
16c70 6f 4e 20 20 20 20 20 20 20 3d 20 6f 62 6a 76 5b  oN       = objv[
16c80 6f 62 6a 63 2d 33 5d 3b 0a 20 20 54 63 6c 5f 4f  objc-3];.  Tcl_O
16c90 62 6a 20 2a 6f 53 74 72 69 6e 67 20 20 3d 20 6f  bj *oString  = o
16ca0 62 6a 76 5b 6f 62 6a 63 2d 32 5d 3b 0a 20 20 54  bjv[objc-2];.  T
16cb0 63 6c 5f 4f 62 6a 20 2a 6f 42 79 74 65 73 20 20  cl_Obj *oBytes  
16cc0 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b   = objv[objc-1];
16cd0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20  ..  if( objc!=5 
16ce0 26 26 20 6f 62 6a 63 21 3d 36 29 7b 0a 20 20 20  && objc!=6){.   
16cf0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
16d00 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
16d10 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
16d20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
16d30 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
16d40 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
16d50 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45  , " STMT N VALUE
16d60 20 42 59 54 45 53 22 2c 20 30 29 3b 0a 20 20 20   BYTES", 0);.   
16d70 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16d80 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
16d90 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
16da0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
16db0 6e 67 28 6f 53 74 6d 74 29 2c 20 26 70 53 74 6d  ng(oStmt), &pStm
16dc0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
16dd0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
16de0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
16df0 6e 74 65 72 70 2c 20 6f 4e 2c 20 26 69 64 78 29  nterp, oN, &idx)
16e00 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
16e10 52 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d 20 28  ROR;.  value = (
16e20 63 68 61 72 2a 29 54 63 6c 5f 47 65 74 42 79 74  char*)Tcl_GetByt
16e30 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 53  eArrayFromObj(oS
16e40 74 72 69 6e 67 2c 20 30 29 3b 0a 20 20 69 66 28  tring, 0);.  if(
16e50 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
16e60 62 6a 28 69 6e 74 65 72 70 2c 20 6f 42 79 74 65  bj(interp, oByte
16e70 73 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74  s, &bytes) ) ret
16e80 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
16e90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
16ea0 69 6e 64 5f 74 65 78 74 31 36 28 70 53 74 6d 74  ind_text16(pStmt
16eb0 2c 20 69 64 78 2c 20 28 76 6f 69 64 20 2a 29 76  , idx, (void *)v
16ec0 61 6c 75 65 2c 20 62 79 74 65 73 2c 20 78 44 65  alue, bytes, xDe
16ed0 6c 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  l);.  if( sqlite
16ee0 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
16ef0 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53  erp, StmtToDb(pS
16f00 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75  tmt), rc) ) retu
16f10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16f20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16f30 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  K ){.    Tcl_App
16f40 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
16f50 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
16f60 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (rc), 0);.    re
16f70 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
16f80 20 20 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53    }..#endif /* S
16f90 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
16fa0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   */.  return TCL
16fb0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
16fc0 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
16fd0 69 6e 64 5f 62 6c 6f 62 20 3f 2d 73 74 61 74 69  ind_blob ?-stati
16fe0 63 3f 20 53 54 4d 54 20 4e 20 44 41 54 41 20 42  c? STMT N DATA B
16ff0 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  YTES.**.** Test 
17000 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
17010 5f 62 6c 6f 62 20 69 6e 74 65 72 66 61 63 65 2e  _blob interface.
17020 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70    STMT is a prep
17030 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
17040 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65  ** N is the inde
17050 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20  x of a wildcard 
17060 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
17070 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73  statement.  This
17080 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64   command.** bind
17090 73 20 61 20 42 4c 4f 42 20 74 6f 20 74 68 65 20  s a BLOB to the 
170a0 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 42  wildcard.  The B
170b0 4c 4f 42 20 69 73 20 42 59 54 45 53 20 62 79 74  LOB is BYTES byt
170c0 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73  es in size..*/.s
170d0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
170e0 69 6e 64 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64  ind_blob(.  void
170f0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
17100 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
17110 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
17120 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
17130 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
17140 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
17150 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  t;.  int idx;.  
17160 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 68 61  int bytes;.  cha
17170 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20  r *value;.  int 
17180 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 64 65  rc;.  sqlite3_de
17190 73 74 72 75 63 74 6f 72 5f 74 79 70 65 20 78 44  structor_type xD
171a0 65 73 74 72 75 63 74 6f 72 20 3d 20 53 51 4c 49  estructor = SQLI
171b0 54 45 5f 54 52 41 4e 53 49 45 4e 54 3b 0a 0a 20  TE_TRANSIENT;.. 
171c0 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20   if( objc!=5 && 
171d0 6f 62 6a 63 21 3d 36 20 29 7b 0a 20 20 20 20 54  objc!=6 ){.    T
171e0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
171f0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
17200 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
17210 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
17220 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
17230 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
17240 22 20 53 54 4d 54 20 4e 20 44 41 54 41 20 42 59  " STMT N DATA BY
17250 54 45 53 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  TES", 0);.    re
17260 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17270 20 20 7d 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d    }..  if( objc=
17280 3d 36 20 29 7b 0a 20 20 20 20 78 44 65 73 74 72  =6 ){.    xDestr
17290 75 63 74 6f 72 20 3d 20 53 51 4c 49 54 45 5f 53  uctor = SQLITE_S
172a0 54 41 54 49 43 3b 0a 20 20 20 20 6f 62 6a 76 2b  TATIC;.    objv+
172b0 2b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  +;.  }..  if( ge
172c0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
172d0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
172e0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
172f0 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
17300 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
17310 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
17320 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
17330 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e  , &idx) ) return
17340 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 76 61   TCL_ERROR;.  va
17350 6c 75 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  lue = Tcl_GetStr
17360 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20  ing(objv[3]);.  
17370 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
17380 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
17390 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73 29 20 29  jv[4], &bytes) )
173a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
173b0 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
173c0 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74  e3_bind_blob(pSt
173d0 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 2c 20  mt, idx, value, 
173e0 62 79 74 65 73 2c 20 78 44 65 73 74 72 75 63 74  bytes, xDestruct
173f0 6f 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  or);.  if( sqlit
17400 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
17410 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70  terp, StmtToDb(p
17420 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74  Stmt), rc) ) ret
17430 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17440 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17450 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
17460 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
17470 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
17480 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
17490 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
174a0 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74  _parameter_count
174b0 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74    STMT.**.** Ret
174c0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
174d0 66 20 77 69 6c 64 63 61 72 64 73 20 69 6e 20 74  f wildcards in t
174e0 68 65 20 67 69 76 65 6e 20 73 74 61 74 65 6d 65  he given stateme
174f0 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
17500 74 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61  t test_bind_para
17510 6d 65 74 65 72 5f 63 6f 75 6e 74 28 0a 20 20 76  meter_count(.  v
17520 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
17530 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
17540 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
17550 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
17560 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
17570 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
17580 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  Stmt;..  if( obj
17590 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
175a0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
175b0 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
175c0 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72  TMT");.    retur
175d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
175e0 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
175f0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
17600 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
17610 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
17620 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17630 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
17640 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
17650 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
17660 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
17670 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 29 29  r_count(pStmt)))
17680 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
17690 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
176a0 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  e:   sqlite3_bin
176b0 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65  d_parameter_name
176c0 20 20 53 54 4d 54 20 20 4e 0a 2a 2a 0a 2a 2a 20    STMT  N.**.** 
176d0 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
176e0 6f 66 20 74 68 65 20 4e 74 68 20 77 69 6c 64 63  of the Nth wildc
176f0 61 72 64 2e 20 20 54 68 65 20 66 69 72 73 74 20  ard.  The first 
17700 77 69 6c 64 63 61 72 64 20 69 73 20 31 2e 0a 2a  wildcard is 1..*
17710 2a 20 41 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  * An empty strin
17720 67 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  g is returned if
17730 20 4e 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e   N is out of ran
17740 67 65 20 6f 72 20 69 66 20 74 68 65 20 77 69 6c  ge or if the wil
17750 64 63 61 72 64 0a 2a 2a 20 69 73 20 6e 61 6d 65  dcard.** is name
17760 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  less..*/.static 
17770 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 70 61  int test_bind_pa
17780 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 0a 20 20  rameter_name(.  
17790 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
177a0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
177b0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
177c0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
177d0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
177e0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
177f0 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 3b 0a  pStmt;.  int i;.
17800 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
17810 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
17820 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
17830 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20 4e 22  , objv, "STMT N"
17840 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
17850 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
17860 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
17870 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
17880 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
17890 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
178a0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
178b0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
178c0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
178d0 6a 76 5b 32 5d 2c 20 26 69 29 20 29 20 72 65 74  jv[2], &i) ) ret
178e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
178f0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
17900 74 28 69 6e 74 65 72 70 2c 20 0a 20 20 20 20 20  t(interp, .     
17910 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
17920 28 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61  (sqlite3_bind_pa
17930 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70 53 74  rameter_name(pSt
17940 6d 74 2c 69 29 2c 2d 31 29 0a 20 20 29 3b 0a 20  mt,i),-1).  );. 
17950 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
17960 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
17970 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70    sqlite3_bind_p
17980 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 20 20  arameter_index  
17990 53 54 4d 54 20 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a  STMT  NAME.**.**
179a0 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
179b0 78 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72  x of the wildcar
179c0 64 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20  d called NAME.  
179d0 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 72  Return 0 if ther
179e0 65 20 69 73 0a 2a 2a 20 6e 6f 20 73 75 63 68 20  e is.** no such 
179f0 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61  wildcard..*/.sta
17a00 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
17a10 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65  d_parameter_inde
17a20 78 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  x(.  void * clie
17a30 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
17a40 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
17a50 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
17a60 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
17a70 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
17a80 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69  tmt *pStmt;..  i
17a90 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
17aa0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
17ab0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
17ac0 6a 76 2c 20 22 53 54 4d 54 20 4e 41 4d 45 22 29  jv, "STMT NAME")
17ad0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
17ae0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
17af0 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
17b00 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
17b10 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
17b20 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
17b30 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
17b40 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
17b50 69 6e 74 65 72 70 2c 20 0a 20 20 20 20 20 54 63  interp, .     Tc
17b60 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 0a 20 20 20  l_NewIntObj(.   
17b70 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
17b80 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78  _parameter_index
17b90 28 70 53 74 6d 74 2c 54 63 6c 5f 47 65 74 53 74  (pStmt,Tcl_GetSt
17ba0 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 0a 20  ring(objv[2])). 
17bb0 20 20 20 20 29 0a 20 20 29 3b 0a 20 20 72 65 74      ).  );.  ret
17bc0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
17bd0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
17be0 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64  lite3_clear_bind
17bf0 69 6e 67 73 20 53 54 4d 54 0a 2a 2a 0a 2a 2f 0a  ings STMT.**.*/.
17c00 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
17c10 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 28 0a  clear_bindings(.
17c20 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
17c30 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
17c40 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
17c50 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
17c60 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
17c70 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
17c80 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20   *pStmt;..  if( 
17c90 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
17ca0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
17cb0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
17cc0 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65   "STMT");.    re
17cd0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17ce0 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d    }.  if( getStm
17cf0 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
17d00 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
17d10 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
17d20 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
17d30 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ROR;.  Tcl_SetOb
17d40 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
17d50 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71  Tcl_NewIntObj(sq
17d60 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64  lite3_clear_bind
17d70 69 6e 67 73 28 70 53 74 6d 74 29 29 29 3b 0a 20  ings(pStmt)));. 
17d80 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
17d90 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
17da0 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 20    sqlite3_sleep 
17db0 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 0a 2a 2f 0a  MILLISECONDS.*/.
17dc0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
17dd0 73 6c 65 65 70 28 0a 20 20 76 6f 69 64 20 2a 20  sleep(.  void * 
17de0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
17df0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
17e00 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
17e10 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
17e20 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 6d  bjv[].){.  int m
17e30 73 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  s;..  if( objc!=
17e40 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
17e50 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
17e60 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c  , 1, objv, "MILL
17e70 49 53 45 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20  ISECONDS");.    
17e80 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17e90 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
17ea0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
17eb0 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26  terp, objv[1], &
17ec0 6d 73 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ms) ){.    retur
17ed0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
17ee0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
17ef0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
17f00 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65  NewIntObj(sqlite
17f10 33 5f 73 6c 65 65 70 28 6d 73 29 29 29 3b 0a 20  3_sleep(ms)));. 
17f20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
17f30 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
17f40 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
17f50 5f 65 72 72 63 6f 64 65 20 44 42 0a 2a 2a 0a 2a  _errcode DB.**.*
17f60 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 74 72  * Return the str
17f70 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69  ing representati
17f80 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  on of the most r
17f90 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20  ecent sqlite3_* 
17fa0 41 50 49 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64  API.** error cod
17fb0 65 2e 20 65 2e 67 2e 20 22 53 51 4c 49 54 45 5f  e. e.g. "SQLITE_
17fc0 45 52 52 4f 52 22 2e 0a 2a 2f 0a 73 74 61 74 69  ERROR"..*/.stati
17fd0 63 20 69 6e 74 20 74 65 73 74 5f 65 78 5f 65 72  c int test_ex_er
17fe0 72 63 6f 64 65 28 0a 20 20 76 6f 69 64 20 2a 20  rcode(.  void * 
17ff0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
18000 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
18010 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
18020 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
18030 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
18040 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
18050 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
18060 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
18070 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
18080 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
18090 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
180a0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
180b0 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
180c0 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
180d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
180e0 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
180f0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
18100 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
18110 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
18120 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18130 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
18140 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28  xtended_errcode(
18150 64 62 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  db);.  Tcl_Appen
18160 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
18170 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
18180 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72  ame(rc), 0);.  r
18190 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
181a0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
181b0 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 20 44  qlite3_errcode D
181c0 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  B.**.** Return t
181d0 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  he string repres
181e0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
181f0 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69  most recent sqli
18200 74 65 33 5f 2a 20 41 50 49 0a 2a 2a 20 65 72 72  te3_* API.** err
18210 6f 72 20 63 6f 64 65 2e 20 65 2e 67 2e 20 22 53  or code. e.g. "S
18220 51 4c 49 54 45 5f 45 52 52 4f 52 22 2e 0a 2a 2f  QLITE_ERROR"..*/
18230 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
18240 5f 65 72 72 63 6f 64 65 28 0a 20 20 76 6f 69 64  _errcode(.  void
18250 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
18260 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
18270 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
18280 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
18290 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
182a0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
182b0 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
182c0 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
182d0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
182e0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
182f0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
18300 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
18310 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
18320 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20  , " DB", 0);.   
18330 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
18340 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
18350 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
18360 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
18370 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
18380 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
18390 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
183a0 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20  3_errcode(db);. 
183b0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
183c0 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
183d0 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
183e0 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  ), 0);.  return 
183f0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
18400 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
18410 33 5f 65 72 72 6d 73 67 20 44 42 0a 2a 2a 0a 2a  3_errmsg DB.**.*
18420 2a 20 52 65 74 75 72 6e 73 20 74 68 65 20 55 54  * Returns the UT
18430 46 2d 38 20 72 65 70 72 65 73 65 6e 74 61 74 69  F-8 representati
18440 6f 6e 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20  on of the error 
18450 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 20 66  message string f
18460 6f 72 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72  or the.** most r
18470 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20  ecent sqlite3_* 
18480 41 50 49 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61  API call..*/.sta
18490 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72 72  tic int test_err
184a0 6d 73 67 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  msg(.  void * cl
184b0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
184c0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
184d0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
184e0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
184f0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
18500 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *db;.  const ch
18510 61 72 20 2a 7a 45 72 72 3b 0a 0a 20 20 69 66 28  ar *zErr;..  if(
18520 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
18530 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
18540 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
18550 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
18560 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
18570 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
18580 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29  v[0]), " DB", 0)
18590 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
185a0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
185b0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
185c0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
185d0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
185e0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
185f0 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20  _ERROR;..  zErr 
18600 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  = sqlite3_errmsg
18610 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  (db);.  Tcl_SetO
18620 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
18630 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
18640 6a 28 7a 45 72 72 2c 20 2d 31 29 29 3b 0a 20 20  j(zErr, -1));.  
18650 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
18660 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
18670 20 74 65 73 74 5f 65 72 72 6d 73 67 31 36 20 44   test_errmsg16 D
18680 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  B.**.** Returns 
18690 74 68 65 20 55 54 46 2d 31 36 20 72 65 70 72 65  the UTF-16 repre
186a0 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
186b0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73   error message s
186c0 74 72 69 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a  tring for the.**
186d0 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
186e0 69 74 65 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e  ite3_* API call.
186f0 20 54 68 69 73 20 69 73 20 61 20 62 79 74 65 20   This is a byte 
18700 61 72 72 61 79 20 6f 62 6a 65 63 74 20 61 74 20  array object at 
18710 74 68 65 20 54 43 4c 20 0a 2a 2a 20 6c 65 76 65  the TCL .** leve
18720 6c 2c 20 61 6e 64 20 69 74 20 69 6e 63 6c 75 64  l, and it includ
18730 65 73 20 74 68 65 20 30 78 30 30 20 30 78 30 30  es the 0x00 0x00
18740 20 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65   terminator byte
18750 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
18760 74 68 65 0a 2a 2a 20 55 54 46 2d 31 36 20 73 74  the.** UTF-16 st
18770 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
18780 69 6e 74 20 74 65 73 74 5f 65 72 72 6d 73 67 31  int test_errmsg1
18790 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  6(.  void * clie
187a0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
187b0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
187c0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
187d0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
187e0 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ].){.#ifndef SQL
187f0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
18800 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
18810 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 45 72 72  const void *zErr
18820 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
18830 7a 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 20 3d  z;.  int bytes =
18840 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   0;..  if( objc!
18850 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
18860 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
18870 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
18880 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
18890 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
188a0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
188b0 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
188c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
188d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
188e0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
188f0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
18900 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
18910 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
18920 3b 0a 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69  ;..  zErr = sqli
18930 74 65 33 5f 65 72 72 6d 73 67 31 36 28 64 62 29  te3_errmsg16(db)
18940 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a  ;.  if( zErr ){.
18950 20 20 20 20 7a 20 3d 20 7a 45 72 72 3b 0a 20 20      z = zErr;.  
18960 20 20 66 6f 72 28 62 79 74 65 73 3d 30 3b 20 7a    for(bytes=0; z
18970 5b 62 79 74 65 73 5d 20 7c 7c 20 7a 5b 62 79 74  [bytes] || z[byt
18980 65 73 2b 31 5d 3b 20 62 79 74 65 73 2b 3d 32 29  es+1]; bytes+=2)
18990 7b 7d 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74  {}.  }.  Tcl_Set
189a0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
189b0 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  , Tcl_NewByteArr
189c0 61 79 4f 62 6a 28 7a 45 72 72 2c 20 62 79 74 65  ayObj(zErr, byte
189d0 73 29 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  s));.#endif /* S
189e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
189f0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   */.  return TCL
18a00 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
18a10 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65  age: sqlite3_pre
18a20 70 61 72 65 20 44 42 20 73 71 6c 20 62 79 74 65  pare DB sql byte
18a30 73 20 3f 74 61 69 6c 76 61 72 3f 0a 2a 2a 0a 2a  s ?tailvar?.**.*
18a40 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20  * Compile up to 
18a50 3c 62 79 74 65 73 3e 20 62 79 74 65 73 20 6f 66  <bytes> bytes of
18a60 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 53 51   the supplied SQ
18a70 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75  L string <sql> u
18a80 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65  sing.** database
18a90 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68   handle <DB>. Th
18aa0 65 20 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69  e parameter <tai
18ab0 6c 76 61 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d  lval> is the nam
18ac0 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a  e of a global.**
18ad0 20 76 61 72 69 61 62 6c 65 20 74 68 61 74 20 69   variable that i
18ae0 73 20 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75  s set to the unu
18af0 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c  sed portion of <
18b00 73 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20 41  sql> (if any). A
18b10 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65 20  .** STMT handle 
18b20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
18b30 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
18b40 70 72 65 70 61 72 65 28 0a 20 20 76 6f 69 64 20  prepare(.  void 
18b50 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
18b60 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
18b70 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
18b80 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
18b90 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
18ba0 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
18bb0 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20  t char *zSql;.  
18bc0 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 6f 6e  int bytes;.  con
18bd0 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 20 3d  st char *zTail =
18be0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   0;.  sqlite3_st
18bf0 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
18c00 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
18c10 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
18c20 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63   objc!=5 && objc
18c30 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
18c40 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
18c50 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
18c60 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
18c70 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
18c80 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
18c90 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73  , " DB sql bytes
18ca0 20 3f 74 61 69 6c 76 61 72 3f 22 2c 20 30 29 3b   ?tailvar?", 0);
18cb0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
18cc0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
18cd0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
18ce0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
18cf0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
18d00 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
18d10 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20  ERROR;.  zSql = 
18d20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
18d30 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54 63  jv[2]);.  if( Tc
18d40 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
18d50 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
18d60 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75 72   &bytes) ) retur
18d70 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
18d80 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
18d90 70 61 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20 62  pare(db, zSql, b
18da0 79 74 65 73 2c 20 26 70 53 74 6d 74 2c 20 6f 62  ytes, &pStmt, ob
18db0 6a 63 3e 3d 35 20 3f 20 26 7a 54 61 69 6c 20 3a  jc>=5 ? &zTail :
18dc0 20 30 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74   0);.  Tcl_Reset
18dd0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
18de0 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
18df0 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
18e00 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72   db, rc) ) retur
18e10 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
18e20 66 28 20 7a 54 61 69 6c 20 26 26 20 6f 62 6a 63  f( zTail && objc
18e30 3e 3d 35 20 29 7b 0a 20 20 20 20 69 66 28 20 62  >=5 ){.    if( b
18e40 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ytes>=0 ){.     
18e50 20 62 79 74 65 73 20 3d 20 62 79 74 65 73 20 2d   bytes = bytes -
18e60 20 28 69 6e 74 29 28 7a 54 61 69 6c 2d 7a 53 71   (int)(zTail-zSq
18e70 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  l);.    }.    if
18e80 28 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54  ( (int)strlen(zT
18e90 61 69 6c 29 3c 62 79 74 65 73 20 29 7b 0a 20 20  ail)<bytes ){.  
18ea0 20 20 20 20 62 79 74 65 73 20 3d 20 28 69 6e 74      bytes = (int
18eb0 29 73 74 72 6c 65 6e 28 7a 54 61 69 6c 29 3b 0a  )strlen(zTail);.
18ec0 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4f 62      }.    Tcl_Ob
18ed0 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  jSetVar2(interp,
18ee0 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 54 63 6c   objv[4], 0, Tcl
18ef0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54  _NewStringObj(zT
18f00 61 69 6c 2c 20 62 79 74 65 73 29 2c 20 30 29 3b  ail, bytes), 0);
18f10 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
18f20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18f30 61 73 73 65 72 74 28 20 70 53 74 6d 74 3d 3d 30  assert( pStmt==0
18f40 20 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28   );.    sprintf(
18f50 7a 42 75 66 2c 20 22 28 25 64 29 20 22 2c 20 72  zBuf, "(%d) ", r
18f60 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  c);.    Tcl_Appe
18f70 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
18f80 20 7a 42 75 66 2c 20 73 71 6c 69 74 65 33 5f 65   zBuf, sqlite3_e
18f90 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20  rrmsg(db), 0);. 
18fa0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
18fb0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
18fc0 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28  pStmt ){.    if(
18fd0 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65   sqlite3TestMake
18fe0 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72  PointerStr(inter
18ff0 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20  p, zBuf, pStmt) 
19000 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
19010 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  OR;.    Tcl_Appe
19020 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
19030 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20   zBuf, 0);.  }. 
19040 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
19050 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
19060 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
19070 76 32 20 44 42 20 73 71 6c 20 62 79 74 65 73 20  v2 DB sql bytes 
19080 3f 74 61 69 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a 20  ?tailvar?.**.** 
19090 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62  Compile up to <b
190a0 79 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74  ytes> bytes of t
190b0 68 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20  he supplied SQL 
190c0 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69  string <sql> usi
190d0 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68  ng.** database h
190e0 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20  andle <DB>. The 
190f0 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76  parameter <tailv
19100 61 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20  al> is the name 
19110 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76  of a global.** v
19120 61 72 69 61 62 6c 65 20 74 68 61 74 20 69 73 20  ariable that is 
19130 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65  set to the unuse
19140 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71  d portion of <sq
19150 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a  l> (if any). A.*
19160 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73  * STMT handle is
19170 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
19180 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72  atic int test_pr
19190 65 70 61 72 65 5f 76 32 28 0a 20 20 76 6f 69 64  epare_v2(.  void
191a0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
191b0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
191c0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
191d0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
191e0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
191f0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
19200 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  st char *zSql;. 
19210 20 63 68 61 72 20 2a 7a 43 6f 70 79 20 3d 20 30   char *zCopy = 0
19220 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19230 20 2f 2a 20 6d 61 6c 6c 6f 63 28 29 20 63 6f 70   /* malloc() cop
19240 79 20 6f 66 20 7a 53 71 6c 20 2a 2f 0a 20 20 69  y of zSql */.  i
19250 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 6f 6e 73  nt bytes;.  cons
19260 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 20 3d 20  t char *zTail = 
19270 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  0;.  sqlite3_stm
19280 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
19290 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20  char zBuf[50];. 
192a0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
192b0 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21  objc!=5 && objc!
192c0 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =4 ){.    Tcl_Ap
192d0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
192e0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
192f0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
19300 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
19310 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
19320 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20   " DB sql bytes 
19330 74 61 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20  tailvar", 0);.  
19340 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
19350 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
19360 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
19370 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
19380 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
19390 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
193a0 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c  OR;.  zSql = Tcl
193b0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
193c0 32 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  2]);.  if( Tcl_G
193d0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
193e0 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62  erp, objv[3], &b
193f0 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54  ytes) ) return T
19400 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20  CL_ERROR;..  /* 
19410 49 6e 73 74 65 61 64 20 6f 66 20 75 73 69 6e 67  Instead of using
19420 20 7a 53 71 6c 20 64 69 72 65 63 74 6c 79 2c 20   zSql directly, 
19430 6d 61 6b 65 20 61 20 63 6f 70 79 20 69 6e 74 6f  make a copy into
19440 20 61 20 62 75 66 66 65 72 20 6f 62 74 61 69 6e   a buffer obtain
19450 65 64 0a 20 20 2a 2a 20 64 69 72 65 63 74 6c 79  ed.  ** directly
19460 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 20   from malloc(). 
19470 54 68 65 20 69 64 65 61 20 69 73 20 74 6f 20 6d  The idea is to m
19480 61 6b 65 20 69 74 20 65 61 73 69 65 72 20 66 6f  ake it easier fo
19490 72 20 76 61 6c 67 72 69 6e 64 0a 20 20 2a 2a 20  r valgrind.  ** 
194a0 74 6f 20 73 70 6f 74 20 62 75 66 66 65 72 20 6f  to spot buffer o
194b0 76 65 72 72 65 61 64 73 2e 20 20 2a 2f 0a 20 20  verreads.  */.  
194c0 69 66 28 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a  if( bytes>=0 ){.
194d0 20 20 20 20 7a 43 6f 70 79 20 3d 20 6d 61 6c 6c      zCopy = mall
194e0 6f 63 28 62 79 74 65 73 29 3b 0a 20 20 20 20 6d  oc(bytes);.    m
194f0 65 6d 63 70 79 28 7a 43 6f 70 79 2c 20 7a 53 71  emcpy(zCopy, zSq
19500 6c 2c 20 62 79 74 65 73 29 3b 0a 20 20 7d 65 6c  l, bytes);.  }el
19510 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20  se{.    int n = 
19520 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 53 71 6c  (int)strlen(zSql
19530 29 20 2b 20 31 3b 0a 20 20 20 20 7a 43 6f 70 79  ) + 1;.    zCopy
19540 20 3d 20 6d 61 6c 6c 6f 63 28 6e 29 3b 0a 20 20   = malloc(n);.  
19550 20 20 6d 65 6d 63 70 79 28 7a 43 6f 70 79 2c 20    memcpy(zCopy, 
19560 7a 53 71 6c 2c 20 6e 29 3b 0a 20 20 7d 0a 20 20  zSql, n);.  }.  
19570 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
19580 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 43 6f 70  pare_v2(db, zCop
19590 79 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74  y, bytes, &pStmt
195a0 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54 61  , objc>=5 ? &zTa
195b0 69 6c 20 3a 20 30 29 3b 0a 20 20 66 72 65 65 28  il : 0);.  free(
195c0 7a 43 6f 70 79 29 3b 0a 20 20 7a 54 61 69 6c 20  zCopy);.  zTail 
195d0 3d 20 26 7a 53 71 6c 5b 28 7a 54 61 69 6c 20 2d  = &zSql[(zTail -
195e0 20 7a 43 6f 70 79 29 5d 3b 0a 0a 20 20 61 73 73   zCopy)];..  ass
195f0 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ert(rc==SQLITE_O
19600 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d 30 29 3b 0a  K || pStmt==0);.
19610 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
19620 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 69 66 28  t(interp);.  if(
19630 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
19640 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20  ode(interp, db, 
19650 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
19660 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 7a 54  _ERROR;.  if( zT
19670 61 69 6c 20 26 26 20 6f 62 6a 63 3e 3d 35 20 29  ail && objc>=5 )
19680 7b 0a 20 20 20 20 69 66 28 20 62 79 74 65 73 3e  {.    if( bytes>
19690 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 79 74 65  =0 ){.      byte
196a0 73 20 3d 20 62 79 74 65 73 20 2d 20 28 69 6e 74  s = bytes - (int
196b0 29 28 7a 54 61 69 6c 2d 7a 53 71 6c 29 3b 0a 20  )(zTail-zSql);. 
196c0 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a     }.    Tcl_Obj
196d0 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
196e0 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 54 63 6c 5f  objv[4], 0, Tcl_
196f0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 61  NewStringObj(zTa
19700 69 6c 2c 20 62 79 74 65 73 29 2c 20 30 29 3b 0a  il, bytes), 0);.
19710 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
19720 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
19730 73 73 65 72 74 28 20 70 53 74 6d 74 3d 3d 30 20  ssert( pStmt==0 
19740 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  );.    sprintf(z
19750 42 75 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63  Buf, "(%d) ", rc
19760 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  );.    Tcl_Appen
19770 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
19780 7a 42 75 66 2c 20 73 71 6c 69 74 65 33 5f 65 72  zBuf, sqlite3_er
19790 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20  rmsg(db), 0);.  
197a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
197b0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  OR;.  }..  if( p
197c0 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20  Stmt ){.    if( 
197d0 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50  sqlite3TestMakeP
197e0 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70  ointerStr(interp
197f0 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29  , zBuf, pStmt) )
19800 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19810 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  R;.    Tcl_Appen
19820 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
19830 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  zBuf, 0);.  }.  
19840 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
19850 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
19860 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 74  qlite3_prepare_t
19870 6b 74 33 31 33 34 20 44 42 0a 2a 2a 0a 2a 2a 20  kt3134 DB.**.** 
19880 47 65 6e 65 72 61 74 65 20 61 20 70 72 65 70 61  Generate a prepa
19890 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 66 6f  red statement fo
198a0 72 20 61 20 7a 65 72 6f 2d 62 79 74 65 20 73 74  r a zero-byte st
198b0 72 69 6e 67 20 61 73 20 61 20 74 65 73 74 0a 2a  ring as a test.*
198c0 2a 20 66 6f 72 20 74 69 63 6b 65 74 20 23 33 31  * for ticket #31
198d0 33 34 2e 20 20 54 68 65 20 73 74 72 69 6e 67 20  34.  The string 
198e0 73 68 6f 75 6c 64 20 62 65 20 70 72 65 63 65 64  should be preced
198f0 65 64 20 62 79 20 61 20 7a 65 72 6f 20 62 79 74  ed by a zero byt
19900 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
19910 20 74 65 73 74 5f 70 72 65 70 61 72 65 5f 74 6b   test_prepare_tk
19920 74 33 31 33 34 28 0a 20 20 76 6f 69 64 20 2a 20  t3134(.  void * 
19930 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
19940 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
19950 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
19960 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
19970 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
19980 65 33 20 2a 64 62 3b 0a 20 20 73 74 61 74 69 63  e3 *db;.  static
19990 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 53 71 6c   const char zSql
199a0 5b 5d 20 3d 20 22 5c 30 30 30 53 45 4c 45 43 54  [] = "\000SELECT
199b0 20 31 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73   1";.  sqlite3_s
199c0 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
199d0 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b    char zBuf[50];
199e0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
199f0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
19a00 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
19a10 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
19a20 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
19a30 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
19a40 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
19a50 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c  jv[0]), " DB sql
19a60 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 22 2c   bytes tailvar",
19a70 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
19a80 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
19a90 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
19aa0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
19ab0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
19ac0 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
19ad0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
19ae0 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
19af0 65 5f 76 32 28 64 62 2c 20 26 7a 53 71 6c 5b 31  e_v2(db, &zSql[1
19b00 5d 2c 20 30 2c 20 26 70 53 74 6d 74 2c 20 30 29  ], 0, &pStmt, 0)
19b10 3b 0a 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53  ;.  assert(rc==S
19b20 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d  QLITE_OK || pStm
19b30 74 3d 3d 30 29 3b 0a 20 20 69 66 28 20 73 71 6c  t==0);.  if( sql
19b40 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
19b50 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20  interp, db, rc) 
19b60 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
19b70 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  OR;.  if( rc!=SQ
19b80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
19b90 73 73 65 72 74 28 20 70 53 74 6d 74 3d 3d 30 20  ssert( pStmt==0 
19ba0 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  );.    sprintf(z
19bb0 42 75 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63  Buf, "(%d) ", rc
19bc0 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  );.    Tcl_Appen
19bd0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
19be0 7a 42 75 66 2c 20 73 71 6c 69 74 65 33 5f 65 72  zBuf, sqlite3_er
19bf0 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20  rmsg(db), 0);.  
19c00 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
19c10 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  OR;.  }..  if( p
19c20 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20  Stmt ){.    if( 
19c30 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50  sqlite3TestMakeP
19c40 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70  ointerStr(interp
19c50 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29  , zBuf, pStmt) )
19c60 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19c70 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  R;.    Tcl_Appen
19c80 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
19c90 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  zBuf, 0);.  }.  
19ca0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
19cb0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
19cc0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36  qlite3_prepare16
19cd0 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 74 61   DB sql bytes ta
19ce0 69 6c 76 61 72 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70  ilvar.**.** Comp
19cf0 69 6c 65 20 75 70 20 74 6f 20 3c 62 79 74 65 73  ile up to <bytes
19d00 3e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 73  > bytes of the s
19d10 75 70 70 6c 69 65 64 20 53 51 4c 20 73 74 72 69  upplied SQL stri
19d20 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a  ng <sql> using.*
19d30 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
19d40 65 20 3c 44 42 3e 2e 20 54 68 65 20 70 61 72 61  e <DB>. The para
19d50 6d 65 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20  meter <tailval> 
19d60 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
19d70 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61   global.** varia
19d80 62 6c 65 20 74 68 61 74 20 69 73 20 73 65 74 20  ble that is set 
19d90 74 6f 20 74 68 65 20 75 6e 75 73 65 64 20 70 6f  to the unused po
19da0 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28  rtion of <sql> (
19db0 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54  if any). A.** ST
19dc0 4d 54 20 68 61 6e 64 6c 65 20 69 73 20 72 65 74  MT handle is ret
19dd0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
19de0 20 69 6e 74 20 74 65 73 74 5f 70 72 65 70 61 72   int test_prepar
19df0 65 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  e16(.  void * cl
19e00 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
19e10 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
19e20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
19e30 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
19e40 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53  v[].){.#ifndef S
19e50 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
19e60 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
19e70 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53    const void *zS
19e80 71 6c 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  ql;.  const void
19e90 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 54   *zTail = 0;.  T
19ea0 63 6c 5f 4f 62 6a 20 2a 70 54 61 69 6c 20 3d 20  cl_Obj *pTail = 
19eb0 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  0;.  sqlite3_stm
19ec0 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
19ed0 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 20 0a  char zBuf[50]; .
19ee0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
19ef0 62 79 74 65 73 3b 20 20 20 20 20 20 20 20 20 20  bytes;          
19f00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74        /* The int
19f10 65 67 65 72 20 73 70 65 63 69 66 69 65 64 20 61  eger specified a
19f20 73 20 61 72 67 20 33 20 2a 2f 0a 20 20 69 6e 74  s arg 3 */.  int
19f30 20 6f 62 6a 6c 65 6e 3b 20 20 20 20 20 20 20 20   objlen;        
19f40 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79         /* The by
19f50 74 65 2d 61 72 72 61 79 20 6c 65 6e 67 74 68 20  te-array length 
19f60 6f 66 20 61 72 67 20 32 20 2a 2f 0a 0a 20 20 69  of arg 2 */..  i
19f70 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62  f( objc!=5 && ob
19f80 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
19f90 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
19fa0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
19fb0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
19fc0 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
19fd0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
19fe0 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74  ]), " DB sql byt
19ff0 65 73 20 3f 74 61 69 6c 76 61 72 3f 22 2c 20 30  es ?tailvar?", 0
1a000 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1a010 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1a020 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
1a030 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1a040 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1a050 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
1a060 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20  L_ERROR;.  zSql 
1a070 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
1a080 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ayFromObj(objv[2
1a090 5d 2c 20 26 6f 62 6a 6c 65 6e 29 3b 0a 20 20 69  ], &objlen);.  i
1a0a0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
1a0b0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
1a0c0 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20  v[3], &bytes) ) 
1a0d0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1a0e0 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
1a0f0 33 5f 70 72 65 70 61 72 65 31 36 28 64 62 2c 20  3_prepare16(db, 
1a100 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53  zSql, bytes, &pS
1a110 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26  tmt, objc>=5 ? &
1a120 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20 20 69 66  zTail : 0);.  if
1a130 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
1a140 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
1a150 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
1a160 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
1a170 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
1a180 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1a190 20 20 69 66 28 20 6f 62 6a 63 3e 3d 35 20 29 7b    if( objc>=5 ){
1a1a0 0a 20 20 20 20 69 66 28 20 7a 54 61 69 6c 20 29  .    if( zTail )
1a1b0 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d  {.      objlen =
1a1c0 20 6f 62 6a 6c 65 6e 20 2d 20 28 69 6e 74 29 28   objlen - (int)(
1a1d0 28 75 38 20 2a 29 7a 54 61 69 6c 2d 28 75 38 20  (u8 *)zTail-(u8 
1a1e0 2a 29 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65 6c  *)zSql);.    }el
1a1f0 73 65 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e  se{.      objlen
1a200 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
1a210 70 54 61 69 6c 20 3d 20 54 63 6c 5f 4e 65 77 42  pTail = Tcl_NewB
1a220 79 74 65 41 72 72 61 79 4f 62 6a 28 28 75 38 20  yteArrayObj((u8 
1a230 2a 29 7a 54 61 69 6c 2c 20 6f 62 6a 6c 65 6e 29  *)zTail, objlen)
1a240 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ;.    Tcl_IncrRe
1a250 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20  fCount(pTail);. 
1a260 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72     Tcl_ObjSetVar
1a270 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34  2(interp, objv[4
1a280 5d 2c 20 30 2c 20 70 54 61 69 6c 2c 20 30 29 3b  ], 0, pTail, 0);
1a290 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
1a2a0 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20  Count(pTail);.  
1a2b0 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29  }..  if( pStmt )
1a2c0 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
1a2d0 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72  3TestMakePointer
1a2e0 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  Str(interp, zBuf
1a2f0 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72  , pStmt) ) retur
1a300 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1a310 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
1a320 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
1a330 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  , 0);.#endif /* 
1a340 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
1a350 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43  6 */.  return TC
1a360 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1a370 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72  sage: sqlite3_pr
1a380 65 70 61 72 65 31 36 5f 76 32 20 44 42 20 73 71  epare16_v2 DB sq
1a390 6c 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72  l bytes ?tailvar
1a3a0 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20  ?.**.** Compile 
1a3b0 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79  up to <bytes> by
1a3c0 74 65 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c  tes of the suppl
1a3d0 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c  ied SQL string <
1a3e0 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61  sql> using.** da
1a3f0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44  tabase handle <D
1a400 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65  B>. The paramete
1a410 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74  r <tailval> is t
1a420 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f  he name of a glo
1a430 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  bal.** variable 
1a440 74 68 61 74 20 69 73 20 73 65 74 20 74 6f 20 74  that is set to t
1a450 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f  he unused portio
1a460 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61  n of <sql> (if a
1a470 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68  ny). A.** STMT h
1a480 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65  andle is returne
1a490 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1a4a0 20 74 65 73 74 5f 70 72 65 70 61 72 65 31 36 5f   test_prepare16_
1a4b0 76 32 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  v2(.  void * cli
1a4c0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1a4d0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1a4e0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1a4f0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1a500 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  [].){.#ifndef SQ
1a510 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
1a520 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1a530 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71   const void *zSq
1a540 6c 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  l;.  const void 
1a550 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 54 63  *zTail = 0;.  Tc
1a560 6c 5f 4f 62 6a 20 2a 70 54 61 69 6c 20 3d 20 30  l_Obj *pTail = 0
1a570 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
1a580 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63   *pStmt = 0;.  c
1a590 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 20 0a 20  har zBuf[50]; . 
1a5a0 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62   int rc;.  int b
1a5b0 79 74 65 73 3b 20 20 20 20 20 20 20 20 20 20 20  ytes;           
1a5c0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65       /* The inte
1a5d0 67 65 72 20 73 70 65 63 69 66 69 65 64 20 61 73  ger specified as
1a5e0 20 61 72 67 20 33 20 2a 2f 0a 20 20 69 6e 74 20   arg 3 */.  int 
1a5f0 6f 62 6a 6c 65 6e 3b 20 20 20 20 20 20 20 20 20  objlen;         
1a600 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74        /* The byt
1a610 65 2d 61 72 72 61 79 20 6c 65 6e 67 74 68 20 6f  e-array length o
1a620 66 20 61 72 67 20 32 20 2a 2f 0a 0a 20 20 69 66  f arg 2 */..  if
1a630 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a  ( objc!=5 && obj
1a640 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
1a650 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1a660 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1a670 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1a680 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
1a690 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
1a6a0 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74 65  ), " DB sql byte
1a6b0 73 20 3f 74 61 69 6c 76 61 72 3f 22 2c 20 30 29  s ?tailvar?", 0)
1a6c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1a6d0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
1a6e0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
1a6f0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1a700 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1a710 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
1a720 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d  _ERROR;.  zSql =
1a730 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
1a740 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  yFromObj(objv[2]
1a750 2c 20 26 6f 62 6a 6c 65 6e 29 3b 0a 20 20 69 66  , &objlen);.  if
1a760 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
1a770 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
1a780 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72  [3], &bytes) ) r
1a790 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1a7a0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
1a7b0 5f 70 72 65 70 61 72 65 31 36 5f 76 32 28 64 62  _prepare16_v2(db
1a7c0 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26  , zSql, bytes, &
1a7d0 70 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f  pStmt, objc>=5 ?
1a7e0 20 26 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20 20   &zTail : 0);.  
1a7f0 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
1a800 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
1a810 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
1a820 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
1a830 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
1a840 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1a850 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3e 3d 35 20  ..  if( objc>=5 
1a860 29 7b 0a 20 20 20 20 69 66 28 20 7a 54 61 69 6c  ){.    if( zTail
1a870 20 29 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e   ){.      objlen
1a880 20 3d 20 6f 62 6a 6c 65 6e 20 2d 20 28 69 6e 74   = objlen - (int
1a890 29 28 28 75 38 20 2a 29 7a 54 61 69 6c 2d 28 75  )((u8 *)zTail-(u
1a8a0 38 20 2a 29 7a 53 71 6c 29 3b 0a 20 20 20 20 7d  8 *)zSql);.    }
1a8b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6f 62 6a 6c  else{.      objl
1a8c0 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  en = 0;.    }.  
1a8d0 20 20 70 54 61 69 6c 20 3d 20 54 63 6c 5f 4e 65    pTail = Tcl_Ne
1a8e0 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 28 75  wByteArrayObj((u
1a8f0 38 20 2a 29 7a 54 61 69 6c 2c 20 6f 62 6a 6c 65  8 *)zTail, objle
1a900 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72  n);.    Tcl_Incr
1a910 52 65 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b  RefCount(pTail);
1a920 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56  .    Tcl_ObjSetV
1a930 61 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  ar2(interp, objv
1a940 5b 34 5d 2c 20 30 2c 20 70 54 61 69 6c 2c 20 30  [4], 0, pTail, 0
1a950 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  );.    Tcl_DecrR
1a960 65 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a  efCount(pTail);.
1a970 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d 74    }..  if( pStmt
1a980 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
1a990 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74  te3TestMakePoint
1a9a0 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42  erStr(interp, zB
1a9b0 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74  uf, pStmt) ) ret
1a9c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1a9d0 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52   }.  Tcl_AppendR
1a9e0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
1a9f0 75 66 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f  uf, 0);.#endif /
1aa00 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
1aa10 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  F16 */.  return 
1aa20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1aa30 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1aa40 6f 70 65 6e 20 66 69 6c 65 6e 61 6d 65 20 3f 6f  open filename ?o
1aa50 70 74 69 6f 6e 73 2d 6c 69 73 74 3f 0a 2a 2f 0a  ptions-list?.*/.
1aa60 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1aa70 6f 70 65 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63  open(.  void * c
1aa80 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1aa90 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1aaa0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1aab0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1aac0 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  jv[].){.  const 
1aad0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
1aae0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
1aaf0 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d    char zBuf[100]
1ab00 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
1ab10 20 26 26 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f   && objc!=2 && o
1ab20 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63  bjc!=1 ){.    Tc
1ab30 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1ab40 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1ab50 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1ab60 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
1ab70 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1ab80 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61 6d 65 20  0]), " filename 
1ab90 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 22 2c 20 30  options-list", 0
1aba0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1abb0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1abc0 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 6f 62 6a 63  zFilename = objc
1abd0 3e 31 20 3f 20 54 63 6c 5f 47 65 74 53 74 72 69  >1 ? Tcl_GetStri
1abe0 6e 67 28 6f 62 6a 76 5b 31 5d 29 20 3a 20 30 3b  ng(objv[1]) : 0;
1abf0 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  .  sqlite3_open(
1ac00 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 64 62 29 3b  zFilename, &db);
1ac10 0a 20 20 0a 20 20 69 66 28 20 73 71 6c 69 74 65  .  .  if( sqlite
1ac20 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72  3TestMakePointer
1ac30 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  Str(interp, zBuf
1ac40 2c 20 64 62 29 20 29 20 72 65 74 75 72 6e 20 54  , db) ) return T
1ac50 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
1ac60 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1ac70 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  erp, zBuf, 0);. 
1ac80 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1ac90 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1aca0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 20  sqlite3_open_v2 
1acb0 46 49 4c 45 4e 41 4d 45 20 46 4c 41 47 53 20 56  FILENAME FLAGS V
1acc0 46 53 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  FS.*/.static int
1acd0 20 74 65 73 74 5f 6f 70 65 6e 5f 76 32 28 0a 20   test_open_v2(. 
1ace0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1acf0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1ad00 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1ad10 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1ad20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1ad30 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1ad40 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 63 6f 6e 73  Filename;.  cons
1ad50 74 20 63 68 61 72 20 2a 7a 56 66 73 3b 0a 20 20  t char *zVfs;.  
1ad60 69 6e 74 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20  int flags = 0;. 
1ad70 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1ad80 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a  int rc;.  char z
1ad90 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 6e 74  Buf[100];..  int
1ada0 20 6e 46 6c 61 67 3b 0a 20 20 54 63 6c 5f 4f 62   nFlag;.  Tcl_Ob
1adb0 6a 20 2a 2a 61 70 46 6c 61 67 3b 0a 20 20 69 6e  j **apFlag;.  in
1adc0 74 20 69 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  t i;..  if( objc
1add0 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=4 ){.    Tcl_W
1ade0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
1adf0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 46 49  rp, 1, objv, "FI
1ae00 4c 45 4e 41 4d 45 20 46 4c 41 47 53 20 56 46 53  LENAME FLAGS VFS
1ae10 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
1ae20 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1ae30 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 54 63 6c 5f  zFilename = Tcl_
1ae40 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1ae50 5d 29 3b 0a 20 20 7a 56 66 73 20 3d 20 54 63 6c  ]);.  zVfs = Tcl
1ae60 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1ae70 33 5d 29 3b 0a 20 20 69 66 28 20 7a 56 66 73 5b  3]);.  if( zVfs[
1ae80 30 5d 3d 3d 30 78 30 30 20 29 20 7a 56 66 73 20  0]==0x00 ) zVfs 
1ae90 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20 54 63 6c  = 0;..  rc = Tcl
1aea0 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65  _ListObjGetEleme
1aeb0 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  nts(interp, objv
1aec0 5b 32 5d 2c 20 26 6e 46 6c 61 67 2c 20 26 61 70  [2], &nFlag, &ap
1aed0 46 6c 61 67 29 3b 0a 20 20 69 66 28 20 72 63 21  Flag);.  if( rc!
1aee0 3d 54 43 4c 5f 4f 4b 20 29 20 72 65 74 75 72 6e  =TCL_OK ) return
1aef0 20 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   rc;.  for(i=0; 
1af00 69 3c 6e 46 6c 61 67 3b 20 69 2b 2b 29 7b 0a 20  i<nFlag; i++){. 
1af10 20 20 20 69 6e 74 20 69 46 6c 61 67 3b 0a 20 20     int iFlag;.  
1af20 20 20 73 74 72 75 63 74 20 4f 70 65 6e 46 6c 61    struct OpenFla
1af30 67 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  g {.      const 
1af40 63 68 61 72 20 2a 7a 46 6c 61 67 3b 0a 20 20 20  char *zFlag;.   
1af50 20 20 20 69 6e 74 20 66 6c 61 67 3b 0a 20 20 20     int flag;.   
1af60 20 7d 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 0a 20   } aFlag[] = {. 
1af70 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f       { "SQLITE_O
1af80 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 22 2c 20 53  PEN_READONLY", S
1af90 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
1afa0 4e 4c 59 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  NLY },.      { "
1afb0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1afc0 57 52 49 54 45 22 2c 20 53 51 4c 49 54 45 5f 4f  WRITE", SQLITE_O
1afd0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7d 2c  PEN_READWRITE },
1afe0 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1aff0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 22 2c 20 53  _OPEN_CREATE", S
1b000 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
1b010 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51  E },.      { "SQ
1b020 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
1b030 4f 4e 43 4c 4f 53 45 22 2c 20 53 51 4c 49 54 45  ONCLOSE", SQLITE
1b040 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
1b050 4f 53 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  OSE },.      { "
1b060 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
1b070 55 53 49 56 45 22 2c 20 53 51 4c 49 54 45 5f 4f  USIVE", SQLITE_O
1b080 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7d 2c  PEN_EXCLUSIVE },
1b090 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1b0a0 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 22  _OPEN_AUTOPROXY"
1b0b0 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55  , SQLITE_OPEN_AU
1b0c0 54 4f 50 52 4f 58 59 20 7d 2c 0a 20 20 20 20 20  TOPROXY },.     
1b0d0 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   { "SQLITE_OPEN_
1b0e0 4d 41 49 4e 5f 44 42 22 2c 20 53 51 4c 49 54 45  MAIN_DB", SQLITE
1b0f0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7d 2c  _OPEN_MAIN_DB },
1b100 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1b110 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 22 2c 20  _OPEN_TEMP_DB", 
1b120 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
1b130 5f 44 42 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  _DB },.      { "
1b140 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e  SQLITE_OPEN_TRAN
1b150 53 49 45 4e 54 5f 44 42 22 2c 20 53 51 4c 49 54  SIENT_DB", SQLIT
1b160 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54  E_OPEN_TRANSIENT
1b170 5f 44 42 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  _DB },.      { "
1b180 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
1b190 5f 4a 4f 55 52 4e 41 4c 22 2c 20 53 51 4c 49 54  _JOURNAL", SQLIT
1b1a0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
1b1b0 4e 41 4c 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  NAL },.      { "
1b1c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
1b1d0 5f 4a 4f 55 52 4e 41 4c 22 2c 20 53 51 4c 49 54  _JOURNAL", SQLIT
1b1e0 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
1b1f0 4e 41 4c 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  NAL },.      { "
1b200 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
1b210 4f 55 52 4e 41 4c 22 2c 20 53 51 4c 49 54 45 5f  OURNAL", SQLITE_
1b220 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20  OPEN_SUBJOURNAL 
1b230 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49  },.      { "SQLI
1b240 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
1b250 4f 55 52 4e 41 4c 22 2c 20 53 51 4c 49 54 45 5f  OURNAL", SQLITE_
1b260 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
1b270 4e 41 4c 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  NAL },.      { "
1b280 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55  SQLITE_OPEN_NOMU
1b290 54 45 58 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  TEX", SQLITE_OPE
1b2a0 4e 5f 4e 4f 4d 55 54 45 58 20 7d 2c 0a 20 20 20  N_NOMUTEX },.   
1b2b0 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45     { "SQLITE_OPE
1b2c0 4e 5f 46 55 4c 4c 4d 55 54 45 58 22 2c 20 53 51  N_FULLMUTEX", SQ
1b2d0 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55  LITE_OPEN_FULLMU
1b2e0 54 45 58 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  TEX },.      { "
1b2f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
1b300 45 44 43 41 43 48 45 22 2c 20 53 51 4c 49 54 45  EDCACHE", SQLITE
1b310 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
1b320 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51  E },.      { "SQ
1b330 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54  LITE_OPEN_PRIVAT
1b340 45 43 41 43 48 45 22 2c 20 53 51 4c 49 54 45 5f  ECACHE", SQLITE_
1b350 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48  OPEN_PRIVATECACH
1b360 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51  E },.      { "SQ
1b370 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 22 2c 20  LITE_OPEN_WAL", 
1b380 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20  SQLITE_OPEN_WAL 
1b390 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49  },.      { "SQLI
1b3a0 54 45 5f 4f 50 45 4e 5f 55 52 49 22 2c 20 53 51  TE_OPEN_URI", SQ
1b3b0 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 7d 2c  LITE_OPEN_URI },
1b3c0 0a 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a  .      { 0, 0 }.
1b3d0 20 20 20 20 7d 3b 0a 20 20 20 20 72 63 20 3d 20      };.    rc = 
1b3e0 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
1b3f0 4f 62 6a 53 74 72 75 63 74 28 69 6e 74 65 72 70  ObjStruct(interp
1b400 2c 20 61 70 46 6c 61 67 5b 69 5d 2c 20 61 46 6c  , apFlag[i], aFl
1b410 61 67 2c 20 73 69 7a 65 6f 66 28 61 46 6c 61 67  ag, sizeof(aFlag
1b420 5b 30 5d 29 2c 20 0a 20 20 20 20 20 20 20 20 22  [0]), .        "
1b430 66 6c 61 67 22 2c 20 30 2c 20 26 69 46 6c 61 67  flag", 0, &iFlag
1b440 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
1b450 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72 65 74  rc!=TCL_OK ) ret
1b460 75 72 6e 20 72 63 3b 0a 20 20 20 20 66 6c 61 67  urn rc;.    flag
1b470 73 20 7c 3d 20 61 46 6c 61 67 5b 69 46 6c 61 67  s |= aFlag[iFlag
1b480 5d 2e 66 6c 61 67 3b 0a 20 20 7d 0a 0a 20 20 72  ].flag;.  }..  r
1b490 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  c = sqlite3_open
1b4a0 5f 76 32 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26  _v2(zFilename, &
1b4b0 64 62 2c 20 66 6c 61 67 73 2c 20 7a 56 66 73 29  db, flags, zVfs)
1b4c0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
1b4d0 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
1b4e0 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  r(interp, zBuf, 
1b4f0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
1b500 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70  _ERROR;.  Tcl_Ap
1b510 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1b520 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72  p, zBuf, 0);.  r
1b530 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1b540 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1b550 6c 69 74 65 33 5f 6f 70 65 6e 31 36 20 66 69 6c  lite3_open16 fil
1b560 65 6e 61 6d 65 20 6f 70 74 69 6f 6e 73 0a 2a 2f  ename options.*/
1b570 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1b580 5f 6f 70 65 6e 31 36 28 0a 20 20 76 6f 69 64 20  _open16(.  void 
1b590 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1b5a0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1b5b0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1b5c0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1b5d0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64   objv[].){.#ifnd
1b5e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
1b5f0 54 46 31 36 0a 20 20 63 6f 6e 73 74 20 76 6f 69  TF16.  const voi
1b600 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  d *zFilename;.  
1b610 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
1b620 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a  har zBuf[100];..
1b630 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
1b640 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1b650 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1b660 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1b670 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
1b680 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
1b690 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 66 69  g(objv[0]), " fi
1b6a0 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e 73 2d 6c  lename options-l
1b6b0 69 73 74 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  ist", 0);.    re
1b6c0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1b6d0 20 20 7d 0a 0a 20 20 7a 46 69 6c 65 6e 61 6d 65    }..  zFilename
1b6e0 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72   = Tcl_GetByteAr
1b6f0 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  rayFromObj(objv[
1b700 31 5d 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  1], 0);.  sqlite
1b710 33 5f 6f 70 65 6e 31 36 28 7a 46 69 6c 65 6e 61  3_open16(zFilena
1b720 6d 65 2c 20 26 64 62 29 3b 0a 20 20 0a 20 20 69  me, &db);.  .  i
1b730 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61  f( sqlite3TestMa
1b740 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74  kePointerStr(int
1b750 65 72 70 2c 20 7a 42 75 66 2c 20 64 62 29 20 29  erp, zBuf, db) )
1b760 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1b770 52 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  R;.  Tcl_AppendR
1b780 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
1b790 75 66 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f  uf, 0);.#endif /
1b7a0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
1b7b0 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  F16 */.  return 
1b7c0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1b7d0 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1b7e0 63 6f 6d 70 6c 65 74 65 31 36 20 3c 55 54 46 2d  complete16 <UTF-
1b7f0 31 36 20 73 74 72 69 6e 67 3e 0a 2a 2a 0a 2a 2a  16 string>.**.**
1b800 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
1b810 20 73 75 70 70 6c 69 65 64 20 61 72 67 75 6d 65   supplied argume
1b820 6e 74 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65  nt is a complete
1b830 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20   SQL statement, 
1b840 6f 72 20 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72  or zero.** other
1b850 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
1b860 69 6e 74 20 74 65 73 74 5f 63 6f 6d 70 6c 65 74  int test_complet
1b870 65 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  e16(.  void * cl
1b880 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1b890 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1b8a0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1b8b0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1b8c0 76 5b 5d 0a 29 7b 0a 23 69 66 20 21 64 65 66 69  v[].){.#if !defi
1b8d0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1b8e0 43 4f 4d 50 4c 45 54 45 29 20 26 26 20 21 64 65  COMPLETE) && !de
1b8f0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1b900 54 5f 55 54 46 31 36 29 0a 20 20 63 68 61 72 20  T_UTF16).  char 
1b910 2a 7a 42 75 66 3b 0a 0a 20 20 69 66 28 20 6f 62  *zBuf;..  if( ob
1b920 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
1b930 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
1b940 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
1b950 3c 75 74 66 2d 31 36 20 73 71 6c 3e 22 29 3b 0a  <utf-16 sql>");.
1b960 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1b970 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 42 75  RROR;.  }..  zBu
1b980 66 20 3d 20 28 63 68 61 72 2a 29 54 63 6c 5f 47  f = (char*)Tcl_G
1b990 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
1b9a0 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a  bj(objv[1], 0);.
1b9b0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
1b9c0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
1b9d0 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  ewIntObj(sqlite3
1b9e0 5f 63 6f 6d 70 6c 65 74 65 31 36 28 7a 42 75 66  _complete16(zBuf
1b9f0 29 29 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  )));.#endif /* S
1ba00 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c  QLITE_OMIT_COMPL
1ba10 45 54 45 20 26 26 20 53 51 4c 49 54 45 5f 4f 4d  ETE && SQLITE_OM
1ba20 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65  IT_UTF16 */.  re
1ba30 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1ba40 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1ba50 69 74 65 33 5f 73 74 65 70 20 53 54 4d 54 0a 2a  ite3_step STMT.*
1ba60 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
1ba70 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68   statement to th
1ba80 65 20 6e 65 78 74 20 72 6f 77 2e 0a 2a 2f 0a 73  e next row..*/.s
1ba90 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
1baa0 74 65 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  tep(.  void * cl
1bab0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1bac0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1bad0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1bae0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1baf0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
1bb00 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
1bb10 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
1bb20 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
1bb30 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1bb40 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1bb50 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1bb60 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
1bb70 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1bb80 30 5d 29 2c 20 22 20 53 54 4d 54 22 2c 20 30 29  0]), " STMT", 0)
1bb90 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1bba0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
1bbb0 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
1bbc0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1bbd0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1bbe0 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
1bbf0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1bc00 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
1bc10 70 28 70 53 74 6d 74 29 3b 0a 0a 20 20 2f 2a 20  p(pStmt);..  /* 
1bc20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  if( rc!=SQLITE_D
1bc30 4f 4e 45 20 26 26 20 72 63 21 3d 53 51 4c 49 54  ONE && rc!=SQLIT
1bc40 45 5f 52 4f 57 20 29 20 72 65 74 75 72 6e 20 54  E_ROW ) return T
1bc50 43 4c 5f 45 52 52 4f 52 3b 20 2a 2f 0a 20 20 54  CL_ERROR; */.  T
1bc60 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
1bc70 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
1bc80 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29  rrorName(rc), 0)
1bc90 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1bca0 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  K;.}..static int
1bcb0 20 74 65 73 74 5f 73 71 6c 28 0a 20 20 76 6f 69   test_sql(.  voi
1bcc0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1bcd0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1bce0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1bcf0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1bd00 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
1bd10 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1bd20 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  mt;..  if( objc!
1bd30 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
1bd40 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
1bd50 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d  p, 1, objv, "STM
1bd60 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  T");.    return 
1bd70 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1bd80 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
1bd90 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1bda0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1bdb0 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
1bdc0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1bdd0 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
1bde0 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
1bdf0 29 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74  )sqlite3_sql(pSt
1be00 6d 74 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  mt), TCL_VOLATIL
1be10 45 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  E);.  return TCL
1be20 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1be30 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
1be40 75 6d 6e 5f 63 6f 75 6e 74 20 53 54 4d 54 20 0a  umn_count STMT .
1be50 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
1be60 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
1be70 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ns returned by t
1be80 68 65 20 73 71 6c 20 73 74 61 74 65 6d 65 6e 74  he sql statement
1be90 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63   STMT..*/.static
1bea0 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e   int test_column
1beb0 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64 20 2a  _count(.  void *
1bec0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1bed0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1bee0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1bef0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1bf00 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
1bf10 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
1bf20 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
1bf30 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1bf40 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1bf50 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1bf60 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
1bf70 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
1bf80 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
1bf90 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29  STMT column", 0)
1bfa0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1bfb0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
1bfc0 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
1bfd0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1bfe0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1bff0 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
1c000 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
1c010 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
1c020 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
1c030 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
1c040 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74  column_count(pSt
1c050 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  mt)));.  return 
1c060 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1c070 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1c080 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 53 54 4d 54  column_type STMT
1c090 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65   column.**.** Re
1c0a0 74 75 72 6e 20 74 68 65 20 74 79 70 65 20 6f 66  turn the type of
1c0b0 20 74 68 65 20 64 61 74 61 20 69 6e 20 63 6f 6c   the data in col
1c0c0 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20  umn 'column' of 
1c0d0 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e  the current row.
1c0e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1c0f0 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28  est_column_type(
1c100 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1c110 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1c120 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1c130 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1c140 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1c150 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
1c160 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
1c170 63 6f 6c 3b 0a 20 20 69 6e 74 20 74 70 3b 0a 0a  col;.  int tp;..
1c180 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
1c190 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1c1a0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1c1b0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1c1c0 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
1c1d0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
1c1e0 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54  g(objv[0]), " ST
1c1f0 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  MT column", 0);.
1c200 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1c210 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
1c220 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
1c230 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1c240 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1c250 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
1c260 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
1c270 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
1c280 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
1c290 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74  [2], &col) ) ret
1c2a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
1c2b0 20 20 74 70 20 3d 20 73 71 6c 69 74 65 33 5f 63    tp = sqlite3_c
1c2c0 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74  olumn_type(pStmt
1c2d0 2c 20 63 6f 6c 29 3b 0a 20 20 73 77 69 74 63 68  , col);.  switch
1c2e0 28 20 74 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( tp ){.    case
1c2f0 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a   SQLITE_INTEGER:
1c300 20 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52   .      Tcl_SetR
1c310 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 49  esult(interp, "I
1c320 4e 54 45 47 45 52 22 2c 20 54 43 4c 5f 53 54 41  NTEGER", TCL_STA
1c330 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65  TIC); .      bre
1c340 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1c350 49 54 45 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20  ITE_NULL:.      
1c360 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
1c370 74 65 72 70 2c 20 22 4e 55 4c 4c 22 2c 20 54 43  terp, "NULL", TC
1c380 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20  L_STATIC); .    
1c390 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1c3a0 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 0a  e SQLITE_FLOAT:.
1c3b0 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73        Tcl_SetRes
1c3c0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 46 4c 4f  ult(interp, "FLO
1c3d0 41 54 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  AT", TCL_STATIC)
1c3e0 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ; .      break;.
1c3f0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1c400 54 45 58 54 3a 0a 20 20 20 20 20 20 54 63 6c 5f  TEXT:.      Tcl_
1c410 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
1c420 2c 20 22 54 45 58 54 22 2c 20 54 43 4c 5f 53 54  , "TEXT", TCL_ST
1c430 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72  ATIC); .      br
1c440 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
1c450 4c 49 54 45 5f 42 4c 4f 42 3a 0a 20 20 20 20 20  LITE_BLOB:.     
1c460 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
1c470 6e 74 65 72 70 2c 20 22 42 4c 4f 42 22 2c 20 54  nterp, "BLOB", T
1c480 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20  CL_STATIC); .   
1c490 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
1c4a0 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73  fault:.      ass
1c4b0 65 72 74 28 30 29 3b 0a 20 20 7d 0a 0a 20 20 72  ert(0);.  }..  r
1c4c0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1c4d0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1c4e0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
1c4f0 36 34 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  64 STMT column.*
1c500 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1c510 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20 27  data in column '
1c520 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20 63  column' of the c
1c530 75 72 72 65 6e 74 20 72 6f 77 20 63 61 73 74 20  urrent row cast 
1c540 61 73 20 61 6e 0a 2a 2a 20 77 69 64 65 20 28 36  as an.** wide (6
1c550 34 2d 62 69 74 29 20 69 6e 74 65 67 65 72 2e 0a  4-bit) integer..
1c560 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1c570 73 74 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  st_column_int64(
1c580 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1c590 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1c5a0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1c5b0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1c5c0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1c5d0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
1c5e0 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
1c5f0 63 6f 6c 3b 0a 20 20 69 36 34 20 69 56 61 6c 3b  col;.  i64 iVal;
1c600 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
1c610 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1c620 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1c630 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1c640 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
1c650 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
1c660 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
1c670 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29  STMT column", 0)
1c680 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1c690 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
1c6a0 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
1c6b0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1c6c0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1c6d0 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
1c6e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1c6f0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
1c700 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
1c710 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72  jv[2], &col) ) r
1c720 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1c730 0a 0a 20 20 69 56 61 6c 20 3d 20 73 71 6c 69 74  ..  iVal = sqlit
1c740 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
1c750 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 54  pStmt, col);.  T
1c760 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1c770 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57  interp, Tcl_NewW
1c780 69 64 65 49 6e 74 4f 62 6a 28 69 56 61 6c 29 29  ideIntObj(iVal))
1c790 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1c7a0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1c7b0 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
1c7c0 6e 5f 62 6c 6f 62 20 53 54 4d 54 20 63 6f 6c 75  n_blob STMT colu
1c7d0 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  mn.*/.static int
1c7e0 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f   test_column_blo
1c7f0 62 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  b(.  void * clie
1c800 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1c810 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1c820 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1c830 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1c840 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
1c850 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
1c860 74 20 63 6f 6c 3b 0a 0a 20 20 69 6e 74 20 6c 65  t col;..  int le
1c870 6e 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  n;.  const void 
1c880 2a 70 42 6c 6f 62 3b 0a 0a 20 20 69 66 28 20 6f  *pBlob;..  if( o
1c890 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
1c8a0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1c8b0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1c8c0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1c8d0 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
1c8e0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1c8f0 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75  0]), " STMT colu
1c900 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  mn", 0);.    ret
1c910 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1c920 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
1c930 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
1c940 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1c950 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
1c960 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1c970 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
1c980 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
1c990 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63  erp, objv[2], &c
1c9a0 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ol) ) return TCL
1c9b0 5f 45 52 52 4f 52 3b 0a 0a 20 20 6c 65 6e 20 3d  _ERROR;..  len =
1c9c0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1c9d0 62 79 74 65 73 28 70 53 74 6d 74 2c 20 63 6f 6c  bytes(pStmt, col
1c9e0 29 3b 0a 20 20 70 42 6c 6f 62 20 3d 20 73 71 6c  );.  pBlob = sql
1c9f0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
1ca00 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20  (pStmt, col);.  
1ca10 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
1ca20 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
1ca30 42 79 74 65 41 72 72 61 79 4f 62 6a 28 70 42 6c  ByteArrayObj(pBl
1ca40 6f 62 2c 20 6c 65 6e 29 29 3b 0a 20 20 72 65 74  ob, len));.  ret
1ca50 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1ca60 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1ca70 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c  te3_column_doubl
1ca80 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a  e STMT column.**
1ca90 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
1caa0 61 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20 27 63  ata in column 'c
1cab0 6f 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20 63 75  olumn' of the cu
1cac0 72 72 65 6e 74 20 72 6f 77 20 63 61 73 74 20 61  rrent row cast a
1cad0 73 20 61 20 64 6f 75 62 6c 65 2e 0a 2a 2f 0a 73  s a double..*/.s
1cae0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63  tatic int test_c
1caf0 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 0a 20 20  olumn_double(.  
1cb00 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1cb10 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1cb20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1cb30 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1cb40 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1cb50 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1cb60 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c  pStmt;.  int col
1cb70 3b 0a 20 20 64 6f 75 62 6c 65 20 72 56 61 6c 3b  ;.  double rVal;
1cb80 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
1cb90 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1cba0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1cbb0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1cbc0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
1cbd0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
1cbe0 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
1cbf0 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29  STMT column", 0)
1cc00 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1cc10 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
1cc20 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
1cc30 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1cc40 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1cc50 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
1cc60 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1cc70 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
1cc80 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
1cc90 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72  jv[2], &col) ) r
1cca0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1ccb0 0a 0a 20 20 72 56 61 6c 20 3d 20 73 71 6c 69 74  ..  rVal = sqlit
1ccc0 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65  e3_column_double
1ccd0 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20  (pStmt, col);.  
1cce0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
1ccf0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
1cd00 44 6f 75 62 6c 65 4f 62 6a 28 72 56 61 6c 29 29  DoubleObj(rVal))
1cd10 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1cd20 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1cd30 65 3a 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f  e: sqlite3_data_
1cd40 63 6f 75 6e 74 20 53 54 4d 54 20 0a 2a 2a 0a 2a  count STMT .**.*
1cd50 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
1cd60 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72  ber of columns r
1cd70 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 73  eturned by the s
1cd80 71 6c 20 73 74 61 74 65 6d 65 6e 74 20 53 54 4d  ql statement STM
1cd90 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  T..*/.static int
1cda0 20 74 65 73 74 5f 64 61 74 61 5f 63 6f 75 6e 74   test_data_count
1cdb0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1cdc0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1cdd0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1cde0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1cdf0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1ce00 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
1ce10 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66  mt *pStmt;..  if
1ce20 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
1ce30 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1ce40 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1ce50 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1ce60 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1ce70 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1ce80 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63  jv[0]), " STMT c
1ce90 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20  olumn", 0);.    
1cea0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1ceb0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
1cec0 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
1ced0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1cee0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
1cef0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
1cf00 5f 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53  _ERROR;..  Tcl_S
1cf10 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1cf20 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
1cf30 6a 28 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 63  j(sqlite3_data_c
1cf40 6f 75 6e 74 28 70 53 74 6d 74 29 29 29 3b 0a 20  ount(pStmt)));. 
1cf50 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1cf60 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1cf70 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
1cf80 65 78 74 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a  ext STMT column.
1cf90 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  **.** Usage: sql
1cfa0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c  ite3_column_decl
1cfb0 74 79 70 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  type STMT column
1cfc0 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  .**.** Usage: sq
1cfd0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  lite3_column_nam
1cfe0 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f  e STMT column.*/
1cff0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1d000 5f 73 74 6d 74 5f 75 74 66 38 28 0a 20 20 76 6f  _stmt_utf8(.  vo
1d010 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1d020 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
1d030 65 72 20 74 6f 20 53 51 4c 69 74 65 20 41 50 49  er to SQLite API
1d040 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20   function to be 
1d050 69 6e 76 6f 6b 65 20 2a 2f 0a 20 20 54 63 6c 5f  invoke */.  Tcl_
1d060 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1d070 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1d080 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1d090 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
1d0a0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
1d0b0 69 6e 74 20 63 6f 6c 3b 0a 20 20 63 6f 6e 73 74  int col;.  const
1d0c0 20 63 68 61 72 20 2a 28 2a 78 46 75 6e 63 29 28   char *(*xFunc)(
1d0d0 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69  sqlite3_stmt*, i
1d0e0 6e 74 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  nt);.  const cha
1d0f0 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 78 46 75 6e  r *zRet;..  xFun
1d100 63 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  c = (const char 
1d110 2a 28 2a 29 28 73 71 6c 69 74 65 33 5f 73 74 6d  *(*)(sqlite3_stm
1d120 74 2a 2c 20 69 6e 74 29 29 63 6c 69 65 6e 74 44  t*, int))clientD
1d130 61 74 61 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  ata;.  if( objc!
1d140 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
1d150 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1d160 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1d170 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1d180 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
1d190 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
1d1a0 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
1d1b0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1d1c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1d1d0 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
1d1e0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1d1f0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1d200 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
1d210 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1d220 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
1d230 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
1d240 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20   objv[2], &col) 
1d250 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1d260 4f 52 3b 0a 20 20 7a 52 65 74 20 3d 20 78 46 75  OR;.  zRet = xFu
1d270 6e 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a  nc(pStmt, col);.
1d280 20 20 69 66 28 20 7a 52 65 74 20 29 7b 0a 20 20    if( zRet ){.  
1d290 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
1d2a0 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
1d2b0 7a 52 65 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  zRet, 0);.  }.  
1d2c0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1d2d0 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  ..static int tes
1d2e0 74 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72  t_global_recover
1d2f0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1d300 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1d310 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1d320 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1d330 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1d340 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
1d350 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
1d360 45 44 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ED.  int rc;.  i
1d370 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20  f( objc!=1 ){.  
1d380 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
1d390 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
1d3a0 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 72 65 74  jv, "");.    ret
1d3b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1d3c0 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
1d3d0 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72  3_global_recover
1d3e0 28 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73  ();.  Tcl_SetRes
1d3f0 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
1d400 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28  r *)t1ErrorName(
1d410 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  rc), TCL_STATIC)
1d420 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
1d430 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1d440 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1d450 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 53 54  3_column_text ST
1d460 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
1d470 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
1d480 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 20 53  olumn_decltype S
1d490 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a  TMT column.**.**
1d4a0 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1d4b0 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 53 54 4d 54  column_name STMT
1d4c0 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69   column.*/.stati
1d4d0 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f  c int test_stmt_
1d4e0 75 74 66 31 36 28 0a 20 20 76 6f 69 64 20 2a 20  utf16(.  void * 
1d4f0 63 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20  clientData,     
1d500 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 51  /* Pointer to SQ
1d510 4c 69 74 65 20 41 50 49 20 66 75 6e 63 74 69 6f  Lite API functio
1d520 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  n to be invoked 
1d530 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
1d540 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1d550 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1d560 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1d570 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1d580 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69  MIT_UTF16.  sqli
1d590 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
1d5a0 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 54 63  .  int col;.  Tc
1d5b0 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 20 20 63  l_Obj *pRet;.  c
1d5c0 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61 6d 65  onst void *zName
1d5d0 31 36 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  16;.  const void
1d5e0 20 2a 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74   *(*xFunc)(sqlit
1d5f0 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 3b 0a  e3_stmt*, int);.
1d600 0a 20 20 78 46 75 6e 63 20 3d 20 28 63 6f 6e 73  .  xFunc = (cons
1d610 74 20 76 6f 69 64 20 2a 28 2a 29 28 73 71 6c 69  t void *(*)(sqli
1d620 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 29  te3_stmt*, int))
1d630 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 69 66  clientData;.  if
1d640 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
1d650 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1d660 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1d670 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1d680 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1d690 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1d6a0 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63  jv[0]), " STMT c
1d6b0 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20  olumn", 0);.    
1d6c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1d6d0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
1d6e0 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
1d6f0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1d700 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
1d710 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
1d720 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
1d730 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
1d740 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
1d750 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20   &col) ) return 
1d760 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 4e  TCL_ERROR;..  zN
1d770 61 6d 65 31 36 20 3d 20 78 46 75 6e 63 28 70 53  ame16 = xFunc(pS
1d780 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 69 66 28  tmt, col);.  if(
1d790 20 7a 4e 61 6d 65 31 36 20 29 7b 0a 20 20 20 20   zName16 ){.    
1d7a0 69 6e 74 20 6e 3b 0a 20 20 20 20 63 6f 6e 73 74  int n;.    const
1d7b0 20 63 68 61 72 20 2a 7a 20 3d 20 7a 4e 61 6d 65   char *z = zName
1d7c0 31 36 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b  16;.    for(n=0;
1d7d0 20 7a 5b 6e 5d 20 7c 7c 20 7a 5b 6e 2b 31 5d 3b   z[n] || z[n+1];
1d7e0 20 6e 2b 3d 32 29 7b 7d 0a 20 20 20 20 70 52 65   n+=2){}.    pRe
1d7f0 74 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  t = Tcl_NewByteA
1d800 72 72 61 79 4f 62 6a 28 7a 4e 61 6d 65 31 36 2c  rrayObj(zName16,
1d810 20 6e 2b 32 29 3b 0a 20 20 20 20 54 63 6c 5f 53   n+2);.    Tcl_S
1d820 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1d830 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 7d 0a 23  rp, pRet);.  }.#
1d840 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1d850 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 20  OMIT_UTF16 */.. 
1d860 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1d870 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1d880 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
1d890 6e 74 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  nt STMT column.*
1d8a0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1d8b0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
1d8c0 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a   STMT column.**.
1d8d0 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1d8e0 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36  3_column_bytes16
1d8f0 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a   STMT column.**.
1d900 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1d910 73 74 5f 73 74 6d 74 5f 69 6e 74 28 0a 20 20 76  st_stmt_int(.  v
1d920 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1d930 2c 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ,    /* Pointer 
1d940 74 6f 20 53 51 4c 69 74 65 20 41 50 49 20 66 75  to SQLite API fu
1d950 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76  nction to be inv
1d960 6f 6b 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  oked */.  Tcl_In
1d970 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1d980 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1d990 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1d9a0 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
1d9b0 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
1d9c0 74 20 63 6f 6c 3b 0a 20 20 69 6e 74 20 28 2a 78  t col;.  int (*x
1d9d0 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74  Func)(sqlite3_st
1d9e0 6d 74 2a 2c 20 69 6e 74 29 3b 0a 0a 20 20 78 46  mt*, int);..  xF
1d9f0 75 6e 63 20 3d 20 28 69 6e 74 20 28 2a 29 28 73  unc = (int (*)(s
1da00 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e  qlite3_stmt*, in
1da10 74 29 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  t))clientData;. 
1da20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
1da30 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1da40 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1da50 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1da60 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
1da70 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
1da80 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
1da90 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20  T column", 0);. 
1daa0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1dab0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
1dac0 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
1dad0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1dae0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1daf0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
1db00 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
1db10 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1db20 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
1db30 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75  2], &col) ) retu
1db40 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
1db50 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
1db60 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
1db70 77 49 6e 74 4f 62 6a 28 78 46 75 6e 63 28 70 53  wIntObj(xFunc(pS
1db80 74 6d 74 2c 20 63 6f 6c 29 29 29 3b 0a 20 20 72  tmt, col)));.  r
1db90 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1dba0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
1dbb0 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 20  qlite_set_magic 
1dbc0 20 44 42 20 20 4d 41 47 49 43 2d 4e 55 4d 42 45   DB  MAGIC-NUMBE
1dbd0 52 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  R.**.** Set the 
1dbe0 64 62 2d 3e 6d 61 67 69 63 20 76 61 6c 75 65 2e  db->magic value.
1dbf0 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
1dc00 6f 20 74 65 73 74 20 65 72 72 6f 72 20 72 65 63  o test error rec
1dc10 6f 76 65 72 79 20 6c 6f 67 69 63 2e 0a 2a 2f 0a  overy logic..*/.
1dc20 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
1dc30 65 5f 73 65 74 5f 6d 61 67 69 63 28 0a 20 20 76  e_set_magic(.  v
1dc40 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1dc50 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1dc60 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72  interp,.  int ar
1dc70 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67  gc,.  char **arg
1dc80 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  v.){.  sqlite3 *
1dc90 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  db;.  if( argc!=
1dca0 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
1dcb0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1dcc0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1dcd0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1dce0 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
1dcf0 20 20 22 20 44 42 20 4d 41 47 49 43 22 2c 20 30    " DB MAGIC", 0
1dd00 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1dd10 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1dd20 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
1dd30 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
1dd40 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
1dd50 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
1dd60 73 74 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20  strcmp(argv[2], 
1dd70 22 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50  "SQLITE_MAGIC_OP
1dd80 45 4e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64  EN")==0 ){.    d
1dd90 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
1dda0 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20  E_MAGIC_OPEN;.  
1ddb0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
1ddc0 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54  (argv[2], "SQLIT
1ddd0 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 22 29  E_MAGIC_CLOSED")
1dde0 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  ==0 ){.    db->m
1ddf0 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
1de00 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20 7d 65  GIC_CLOSED;.  }e
1de10 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
1de20 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f  rgv[2], "SQLITE_
1de30 4d 41 47 49 43 5f 42 55 53 59 22 29 3d 3d 30 20  MAGIC_BUSY")==0 
1de40 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63  ){.    db->magic
1de50 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
1de60 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 20 69 66  BUSY;.  }else if
1de70 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 32 5d  ( strcmp(argv[2]
1de80 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  , "SQLITE_MAGIC_
1de90 45 52 52 4f 52 22 29 3d 3d 30 20 29 7b 0a 20 20  ERROR")==0 ){.  
1dea0 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
1deb0 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52  LITE_MAGIC_ERROR
1dec0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 54 63  ;.  }else if( Tc
1ded0 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
1dee0 20 61 72 67 76 5b 32 5d 2c 20 28 69 6e 74 2a 29   argv[2], (int*)
1def0 26 64 62 2d 3e 6d 61 67 69 63 29 20 29 7b 0a 20  &db->magic) ){. 
1df00 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1df10 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
1df20 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1df30 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
1df40 65 33 5f 69 6e 74 65 72 72 75 70 74 20 20 44 42  e3_interrupt  DB
1df50 20 0a 2a 2a 0a 2a 2a 20 54 72 69 67 67 65 72 20   .**.** Trigger 
1df60 61 6e 20 69 6e 74 65 72 72 75 70 74 20 6f 6e 20  an interrupt on 
1df70 44 42 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  DB.*/.static int
1df80 20 74 65 73 74 5f 69 6e 74 65 72 72 75 70 74 28   test_interrupt(
1df90 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1dfa0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1dfb0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1dfc0 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a  t argc,.  char *
1dfd0 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74  *argv.){.  sqlit
1dfe0 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72  e3 *db;.  if( ar
1dff0 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
1e000 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1e010 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1e020 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1e030 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 22 20 44  "", argv[0], " D
1e040 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
1e050 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1e060 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
1e070 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
1e080 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
1e090 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1e0a0 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75   sqlite3_interru
1e0b0 70 74 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e  pt(db);.  return
1e0c0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74   TCL_OK;.}..stat
1e0d0 69 63 20 75 38 20 2a 73 71 6c 69 74 65 33 5f 73  ic u8 *sqlite3_s
1e0e0 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65 20 3d 20  tack_baseline = 
1e0f0 30 3b 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74  0;../*.** Fill t
1e100 68 65 20 73 74 61 63 6b 20 77 69 74 68 20 61 20  he stack with a 
1e110 6b 6e 6f 77 6e 20 62 69 74 70 61 74 74 65 72 6e  known bitpattern
1e120 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1e130 20 70 72 65 70 53 74 61 63 6b 28 76 6f 69 64 29   prepStack(void)
1e140 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 33 32  {.  int i;.  u32
1e150 20 62 69 67 42 75 66 5b 36 35 35 33 36 5d 3b 0a   bigBuf[65536];.
1e160 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
1e170 65 6f 66 28 62 69 67 42 75 66 29 2f 73 69 7a 65  eof(bigBuf)/size
1e180 6f 66 28 62 69 67 42 75 66 5b 30 5d 29 3b 20 69  of(bigBuf[0]); i
1e190 2b 2b 29 20 62 69 67 42 75 66 5b 69 5d 20 3d 20  ++) bigBuf[i] = 
1e1a0 30 78 64 65 61 64 62 65 65 66 3b 0a 20 20 73 71  0xdeadbeef;.  sq
1e1b0 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62 61 73 65  lite3_stack_base
1e1c0 6c 69 6e 65 20 3d 20 28 75 38 2a 29 26 62 69 67  line = (u8*)&big
1e1d0 42 75 66 5b 36 35 35 33 36 5d 3b 0a 7d 0a 0a 2f  Buf[65536];.}../
1e1e0 2a 0a 2a 2a 20 47 65 74 20 74 68 65 20 63 75 72  *.** Get the cur
1e1f0 72 65 6e 74 20 73 74 61 63 6b 20 64 65 70 74 68  rent stack depth
1e200 2e 20 20 55 73 65 64 20 66 6f 72 20 64 65 62 75  .  Used for debu
1e210 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 75  gging only..*/.u
1e220 36 34 20 73 71 6c 69 74 65 33 53 74 61 63 6b 44  64 sqlite3StackD
1e230 65 70 74 68 28 76 6f 69 64 29 7b 0a 20 20 75 38  epth(void){.  u8
1e240 20 78 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 36   x;.  return (u6
1e250 34 29 28 73 71 6c 69 74 65 33 5f 73 74 61 63 6b  4)(sqlite3_stack
1e260 5f 62 61 73 65 6c 69 6e 65 20 2d 20 26 78 29 3b  _baseline - &x);
1e270 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1e280 20 20 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f    sqlite3_stack_
1e290 75 73 65 64 20 44 42 20 53 51 4c 0a 2a 2a 0a 2a  used DB SQL.**.*
1e2a0 2a 20 54 72 79 20 74 6f 20 6d 65 61 73 75 72 65  * Try to measure
1e2b0 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73   the amount of s
1e2c0 74 61 63 6b 20 73 70 61 63 65 20 75 73 65 64 20  tack space used 
1e2d0 62 79 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  by a call to sql
1e2e0 69 74 65 33 5f 65 78 65 63 0a 2a 2f 0a 73 74 61  ite3_exec.*/.sta
1e2f0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74 61  tic int test_sta
1e300 63 6b 5f 75 73 65 64 28 0a 20 20 76 6f 69 64 20  ck_used(.  void 
1e310 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1e320 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1e330 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  rp,.  int argc,.
1e340 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b    char **argv.){
1e350 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
1e360 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 61    int i;.  if( a
1e370 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
1e380 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1e390 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1e3a0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1e3b0 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
1e3c0 20 20 20 20 20 20 20 22 20 44 42 20 53 51 4c 22         " DB SQL"
1e3d0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1e3e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1e3f0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
1e400 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
1e410 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
1e420 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 70  n TCL_ERROR;.  p
1e430 72 65 70 53 74 61 63 6b 28 29 3b 0a 20 20 28 76  repStack();.  (v
1e440 6f 69 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63  oid)sqlite3_exec
1e450 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 30 2c  (db, argv[2], 0,
1e460 20 30 2c 20 30 29 3b 0a 20 20 66 6f 72 28 69 3d   0, 0);.  for(i=
1e470 36 35 35 33 35 3b 20 69 3e 3d 30 20 26 26 20 28  65535; i>=0 && (
1e480 28 75 33 32 2a 29 73 71 6c 69 74 65 33 5f 73 74  (u32*)sqlite3_st
1e490 61 63 6b 5f 62 61 73 65 6c 69 6e 65 29 5b 2d 69  ack_baseline)[-i
1e4a0 5d 3d 3d 30 78 64 65 61 64 62 65 65 66 3b 20 69  ]==0xdeadbeef; i
1e4b0 2d 2d 29 7b 7d 0a 20 20 54 63 6c 5f 53 65 74 4f  --){}.  Tcl_SetO
1e4c0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
1e4d0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 69   Tcl_NewIntObj(i
1e4e0 2a 34 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  *4));.  return T
1e4f0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1e500 55 73 61 67 65 3a 20 73 71 6c 69 74 65 5f 64 65  Usage: sqlite_de
1e510 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e 20 44 42  lete_function DB
1e520 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 0a 2a   function-name.*
1e530 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
1e540 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 27 66  user function 'f
1e550 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 27 20 66 72  unction-name' fr
1e560 6f 6d 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  om database hand
1e570 6c 65 20 44 42 2e 20 49 74 0a 2a 2a 20 69 73 20  le DB. It.** is 
1e580 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
1e590 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 77   user function w
1e5a0 61 73 20 63 72 65 61 74 65 64 20 61 73 20 55 54  as created as UT
1e5b0 46 38 2c 20 61 6e 79 20 6e 75 6d 62 65 72 20 6f  F8, any number o
1e5c0 66 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 28  f.** arguments (
1e5d0 74 68 65 20 77 61 79 20 74 68 65 20 54 43 4c 20  the way the TCL 
1e5e0 69 6e 74 65 72 66 61 63 65 20 64 6f 65 73 20 69  interface does i
1e5f0 74 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  t)..*/.static in
1e600 74 20 64 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f  t delete_functio
1e610 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  n(.  void * clie
1e620 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1e630 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1e640 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72  int argc,.  char
1e650 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74   **argv.){.  int
1e660 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   rc;.  sqlite3 *
1e670 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  db;.  if( argc!=
1e680 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
1e690 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1e6a0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1e6b0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1e6c0 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
1e6d0 20 20 22 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d    " DB function-
1e6e0 6e 61 6d 65 22 2c 20 30 29 3b 0a 20 20 20 20 72  name", 0);.    r
1e6f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1e700 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
1e710 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1e720 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
1e730 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1e740 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1e750 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
1e760 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 2d 31  (db, argv[2], -1
1e770 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
1e780 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63  , 0, 0, 0);.  Tc
1e790 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
1e7a0 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72  rp, (char *)t1Er
1e7b0 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c  rorName(rc), TCL
1e7c0 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75  _STATIC);.  retu
1e7d0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1e7e0 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1e7f0 65 5f 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69  e_delete_collati
1e800 6f 6e 20 44 42 20 63 6f 6c 6c 61 74 69 6f 6e 2d  on DB collation-
1e810 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74  name.**.** Delet
1e820 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  e the collation 
1e830 73 65 71 75 65 6e 63 65 20 27 63 6f 6c 6c 61 74  sequence 'collat
1e840 69 6f 6e 2d 6e 61 6d 65 27 20 66 72 6f 6d 20 64  ion-name' from d
1e850 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 0a  atabase handle .
1e860 2a 2a 20 44 42 2e 20 49 74 20 69 73 20 61 73 73  ** DB. It is ass
1e870 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 6f  umed that the co
1e880 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1e890 20 77 61 73 20 63 72 65 61 74 65 64 20 61 73 20   was created as 
1e8a0 55 54 46 38 20 28 74 68 65 20 0a 2a 2a 20 77 61  UTF8 (the .** wa
1e8b0 79 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 66  y the TCL interf
1e8c0 61 63 65 20 64 6f 65 73 20 69 74 29 2e 0a 2a 2f  ace does it)..*/
1e8d0 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 6c 65  .static int dele
1e8e0 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20  te_collation(.  
1e8f0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1e900 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1e910 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61  *interp,.  int a
1e920 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72  rgc,.  char **ar
1e930 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  gv.){.  int rc;.
1e940 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1e950 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a   if( argc!=3 ){.
1e960 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1e970 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1e980 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1e990 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
1e9a0 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44  0], .        " D
1e9b0 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 22  B function-name"
1e9c0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1e9d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1e9e0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
1e9f0 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
1ea00 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
1ea10 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
1ea20 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
1ea30 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  te_collation(db,
1ea40 20 61 72 67 76 5b 32 5d 2c 20 53 51 4c 49 54 45   argv[2], SQLITE
1ea50 5f 55 54 46 38 2c 20 30 2c 20 30 29 3b 0a 20 20  _UTF8, 0, 0);.  
1ea60 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
1ea70 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
1ea80 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
1ea90 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65  CL_STATIC);.  re
1eaa0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1eab0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1eac0 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d  ite3_get_autocom
1ead0 6d 69 74 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74  mit DB.**.** Ret
1eae0 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
1eaf0 64 61 74 61 62 61 73 65 20 44 42 20 69 73 20 63  database DB is c
1eb00 75 72 72 65 6e 74 6c 79 20 69 6e 20 61 75 74 6f  urrently in auto
1eb10 2d 63 6f 6d 6d 69 74 20 6d 6f 64 65 2e 0a 2a 2a  -commit mode..**
1eb20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66   Return false if
1eb30 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   not..*/.static 
1eb40 69 6e 74 20 67 65 74 5f 61 75 74 6f 63 6f 6d 6d  int get_autocomm
1eb50 69 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  it(.  void * cli
1eb60 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1eb70 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1eb80 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61   int argc,.  cha
1eb90 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 68  r **argv.){.  ch
1eba0 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 73  ar zBuf[30];.  s
1ebb0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66  qlite3 *db;.  if
1ebc0 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20  ( argc!=2 ){.   
1ebd0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1ebe0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1ebf0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1ec00 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
1ec10 20 0a 20 20 20 20 20 20 20 20 22 20 44 42 22 2c   .        " DB",
1ec20 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1ec30 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1ec40 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
1ec50 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
1ec60 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
1ec70 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 70   TCL_ERROR;.  sp
1ec80 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22  rintf(zBuf, "%d"
1ec90 2c 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75  , sqlite3_get_au
1eca0 74 6f 63 6f 6d 6d 69 74 28 64 62 29 29 3b 0a 20  tocommit(db));. 
1ecb0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1ecc0 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
1ecd0 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
1ece0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1ecf0 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 62 75 73  age: sqlite3_bus
1ed00 79 5f 74 69 6d 65 6f 75 74 20 44 42 20 4d 53 0a  y_timeout DB MS.
1ed10 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75  **.** Set the bu
1ed20 73 79 20 74 69 6d 65 6f 75 74 2e 20 20 54 68 69  sy timeout.  Thi
1ed30 73 20 69 73 20 6d 6f 72 65 20 65 61 73 69 6c 79  s is more easily
1ed40 20 64 6f 6e 65 20 75 73 69 6e 67 20 74 68 65 20   done using the 
1ed50 74 69 6d 65 6f 75 74 0a 2a 2a 20 6d 65 74 68 6f  timeout.** metho
1ed60 64 20 6f 66 20 74 68 65 20 54 43 4c 20 69 6e 74  d of the TCL int
1ed70 65 72 66 61 63 65 2e 20 20 42 75 74 20 77 65 20  erface.  But we 
1ed80 6e 65 65 64 20 61 20 77 61 79 20 74 6f 20 74 65  need a way to te
1ed90 73 74 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77  st the case.** w
1eda0 68 65 72 65 20 69 74 20 72 65 74 75 72 6e 73 20  here it returns 
1edb0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e 0a 2a  SQLITE_MISUSE..*
1edc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1edd0 74 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 0a  t_busy_timeout(.
1ede0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1edf0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1ee00 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1ee10 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a   argc,.  char **
1ee20 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63  argv.){.  int rc
1ee30 2c 20 6d 73 3b 0a 20 20 73 71 6c 69 74 65 33 20  , ms;.  sqlite3 
1ee40 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21  *db;.  if( argc!
1ee50 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
1ee60 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1ee70 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1ee80 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1ee90 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
1eea0 20 20 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20     " DB", 0);.  
1eeb0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1eec0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
1eed0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
1eee0 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
1eef0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1ef00 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
1ef10 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72  etInt(interp, ar
1ef20 67 76 5b 32 5d 2c 20 26 6d 73 29 20 29 20 72 65  gv[2], &ms) ) re
1ef30 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1ef40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
1ef50 75 73 79 5f 74 69 6d 65 6f 75 74 28 64 62 2c 20  usy_timeout(db, 
1ef60 6d 73 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  ms);.  Tcl_Appen
1ef70 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1ef80 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
1ef90 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  c), 0);.  return
1efa0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1efb0 2a 20 55 73 61 67 65 3a 20 20 74 63 6c 5f 76 61  * Usage:  tcl_va
1efc0 72 69 61 62 6c 65 5f 74 79 70 65 20 56 41 52 49  riable_type VARI
1efd0 41 42 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52  ABLENAME.**.** R
1efe0 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
1eff0 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 72  f the internal r
1f000 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 66 6f  epresentation fo
1f010 72 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  r the.** value o
1f020 66 20 74 68 65 20 67 69 76 65 6e 20 76 61 72 69  f the given vari
1f030 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
1f040 69 6e 74 20 74 63 6c 5f 76 61 72 69 61 62 6c 65  int tcl_variable
1f050 5f 74 79 70 65 28 0a 20 20 76 6f 69 64 20 2a 20  _type(.  void * 
1f060 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1f070 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1f080 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1f090 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1f0a0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 54 63 6c 5f 4f  bjv[].){.  Tcl_O
1f0b0 62 6a 20 2a 70 56 61 72 3b 0a 20 20 69 66 28 20  bj *pVar;.  if( 
1f0c0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1f0d0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
1f0e0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
1f0f0 20 22 56 41 52 49 41 42 4c 45 22 29 3b 0a 20 20   "VARIABLE");.  
1f100 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1f110 4f 52 3b 0a 20 20 7d 0a 20 20 70 56 61 72 20 3d  OR;.  }.  pVar =
1f120 20 54 63 6c 5f 47 65 74 56 61 72 32 45 78 28 69   Tcl_GetVar2Ex(i
1f130 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1f140 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 30  ring(objv[1]), 0
1f150 2c 20 54 43 4c 5f 4c 45 41 56 45 5f 45 52 52 5f  , TCL_LEAVE_ERR_
1f160 4d 53 47 29 3b 0a 20 20 69 66 28 20 70 56 61 72  MSG);.  if( pVar
1f170 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ==0 ) return TCL
1f180 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 70 56  _ERROR;.  if( pV
1f190 61 72 2d 3e 74 79 70 65 50 74 72 20 29 7b 0a 20  ar->typePtr ){. 
1f1a0 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
1f1b0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
1f1c0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 56 61  NewStringObj(pVa
1f1d0 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65  r->typePtr->name
1f1e0 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 72 65  , -1));.  }.  re
1f1f0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1f200 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
1f210 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65  lite3_release_me
1f220 6d 6f 72 79 20 3f 4e 3f 0a 2a 2a 0a 2a 2a 20 41  mory ?N?.**.** A
1f230 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 65 61 73  ttempt to releas
1f240 65 20 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e 74  e memory current
1f250 6c 79 20 68 65 6c 64 20 62 75 74 20 6e 6f 74 20  ly held but not 
1f260 61 63 74 75 61 6c 6c 79 20 72 65 71 75 69 72 65  actually require
1f270 64 2e 0a 2a 2a 20 54 68 65 20 69 6e 74 65 67 65  d..** The intege
1f280 72 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  r N is the numbe
1f290 72 20 6f 66 20 62 79 74 65 73 20 77 65 20 61 72  r of bytes we ar
1f2a0 65 20 74 72 79 69 6e 67 20 74 6f 20 72 65 6c 65  e trying to rele
1f2b0 61 73 65 2e 20 20 54 68 65 20 0a 2a 2a 20 72 65  ase.  The .** re
1f2c0 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
1f2d0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f  e amount of memo
1f2e0 72 79 20 61 63 74 75 61 6c 6c 79 20 72 65 6c 65  ry actually rele
1f2f0 61 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ased..*/.static 
1f300 69 6e 74 20 74 65 73 74 5f 72 65 6c 65 61 73 65  int test_release
1f310 5f 6d 65 6d 6f 72 79 28 0a 20 20 76 6f 69 64 20  _memory(.  void 
1f320 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1f330 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1f340 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1f350 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1f360 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 20 64   objv[].){.#if d
1f370 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
1f380 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
1f390 47 45 4d 45 4e 54 29 20 26 26 20 21 64 65 66 69  GEMENT) && !defi
1f3a0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1f3b0 44 49 53 4b 49 4f 29 0a 20 20 69 6e 74 20 4e 3b  DISKIO).  int N;
1f3c0 0a 20 20 69 6e 74 20 61 6d 74 3b 0a 20 20 69 66  .  int amt;.  if
1f3d0 28 20 6f 62 6a 63 21 3d 31 20 26 26 20 6f 62 6a  ( objc!=1 && obj
1f3e0 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1f3f0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
1f400 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 1, objv, "?
1f410 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  N?");.    return
1f420 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1f430 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b    if( objc==2 ){
1f440 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
1f450 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
1f460 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 4e 29 20  p, objv[1], &N) 
1f470 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1f480 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OR;.  }else{.   
1f490 20 4e 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 61   N = -1;.  }.  a
1f4a0 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 6c  mt = sqlite3_rel
1f4b0 65 61 73 65 5f 6d 65 6d 6f 72 79 28 4e 29 3b 0a  ease_memory(N);.
1f4c0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
1f4d0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
1f4e0 65 77 49 6e 74 4f 62 6a 28 61 6d 74 29 29 3b 0a  ewIntObj(amt));.
1f4f0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
1f500 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TCL_OK;.}.../*.*
1f510 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
1f520 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  3_db_release_mem
1f530 6f 72 79 20 44 42 0a 2a 2a 0a 2a 2a 20 41 74 74  ory DB.**.** Att
1f540 65 6d 70 74 20 74 6f 20 72 65 6c 65 61 73 65 20  empt to release 
1f550 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e 74 6c 79  memory currently
1f560 20 68 65 6c 64 20 62 79 20 64 61 74 61 62 61 73   held by databas
1f570 65 20 44 42 2e 20 20 52 65 74 75 72 6e 20 74 68  e DB.  Return th
1f580 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 64 65  e.** result code
1f590 20 28 77 68 69 63 68 20 69 6e 20 74 68 65 20 63   (which in the c
1f5a0 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
1f5b0 61 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20  ation is always 
1f5c0 7a 65 72 6f 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  zero)..*/.static
1f5d0 20 69 6e 74 20 74 65 73 74 5f 64 62 5f 72 65 6c   int test_db_rel
1f5e0 65 61 73 65 5f 6d 65 6d 6f 72 79 28 0a 20 20 76  ease_memory(.  v
1f5f0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1f600 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1f610 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1f620 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1f630 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1f640 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1f650 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 6f 62  int rc;.  if( ob
1f660 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
1f670 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
1f680 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
1f690 44 42 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  DB");.    return
1f6a0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1f6b0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
1f6c0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1f6d0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1f6e0 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
1f6f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
1f700 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65   = sqlite3_db_re
1f710 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 64 62 29  lease_memory(db)
1f720 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
1f730 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
1f740 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b  _NewIntObj(rc));
1f750 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1f760 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1f770 3a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 66 69  :  sqlite3_db_fi
1f780 6c 65 6e 61 6d 65 20 44 42 20 44 42 4e 41 4d 45  lename DB DBNAME
1f790 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
1f7a0 65 20 6e 61 6d 65 20 6f 66 20 61 20 66 69 6c 65  e name of a file
1f7b0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1f7c0 20 61 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a   a database..*/.
1f7d0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1f7e0 64 62 5f 66 69 6c 65 6e 61 6d 65 28 0a 20 20 76  db_filename(.  v
1f7f0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1f800 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1f810 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1f820 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1f830 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1f840 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1f850 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e  const char *zDbN
1f860 61 6d 65 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  ame;.  if( objc!
1f870 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =3 ){.    Tcl_Wr
1f880 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
1f890 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
1f8a0 44 42 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65  DBNAME");.    re
1f8b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1f8c0 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
1f8d0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
1f8e0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1f8f0 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
1f900 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1f910 20 20 7a 44 62 4e 61 6d 65 20 3d 20 54 63 6c 5f    zDbName = Tcl_
1f920 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
1f930 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  ]);.  Tcl_Append
1f940 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73  Result(interp, s
1f950 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61  qlite3_db_filena
1f960 6d 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 2c  me(db, zDbName),
1f970 20 28 76 6f 69 64 2a 29 30 29 3b 0a 20 20 72 65   (void*)0);.  re
1f980 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1f990 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
1f9a0 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c  lite3_db_readonl
1f9b0 79 20 44 42 20 44 42 4e 41 4d 45 0a 2a 2a 0a 2a  y DB DBNAME.**.*
1f9c0 2a 20 52 65 74 75 72 6e 20 31 20 6f 72 20 30 20  * Return 1 or 0 
1f9d0 69 66 20 44 42 4e 41 4d 45 20 69 73 20 72 65 61  if DBNAME is rea
1f9e0 64 6f 6e 6c 79 20 6f 72 20 6e 6f 74 2e 20 20 52  donly or not.  R
1f9f0 65 74 75 72 6e 20 2d 31 20 69 66 20 44 42 4e 41  eturn -1 if DBNA
1fa00 4d 45 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65  ME does.** not e
1fa10 78 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  xist..*/.static 
1fa20 69 6e 74 20 74 65 73 74 5f 64 62 5f 72 65 61 64  int test_db_read
1fa30 6f 6e 6c 79 28 0a 20 20 76 6f 69 64 20 2a 20 63  only(.  void * c
1fa40 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1fa50 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1fa60 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1fa70 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1fa80 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
1fa90 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
1faa0 68 61 72 20 2a 7a 44 62 4e 61 6d 65 3b 0a 20 20  har *zDbName;.  
1fab0 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
1fac0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
1fad0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
1fae0 62 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d 45 22  bjv, "DB DBNAME"
1faf0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1fb00 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1fb10 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
1fb20 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1fb30 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1fb40 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
1fb50 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 44 62 4e 61  L_ERROR;.  zDbNa
1fb60 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  me = Tcl_GetStri
1fb70 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 54  ng(objv[2]);.  T
1fb80 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1fb90 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
1fba0 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 64 62  ntObj(sqlite3_db
1fbb0 5f 72 65 61 64 6f 6e 6c 79 28 64 62 2c 20 7a 44  _readonly(db, zD
1fbc0 62 4e 61 6d 65 29 29 29 3b 0a 20 20 72 65 74 75  bName)));.  retu
1fbd0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1fbe0 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
1fbf0 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69  te3_soft_heap_li
1fc00 6d 69 74 20 3f 4e 3f 0a 2a 2a 0a 2a 2a 20 51 75  mit ?N?.**.** Qu
1fc10 65 72 79 20 6f 72 20 73 65 74 20 74 68 65 20 73  ery or set the s
1fc20 6f 66 74 20 68 65 61 70 20 6c 69 6d 69 74 20 66  oft heap limit f
1fc30 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  or the current t
1fc40 68 72 65 61 64 2e 20 20 54 68 65 0a 2a 2a 20 6c  hread.  The.** l
1fc50 69 6d 69 74 20 69 73 20 6f 6e 6c 79 20 63 68 61  imit is only cha
1fc60 6e 67 65 64 20 69 66 20 74 68 65 20 4e 20 69 73  nged if the N is
1fc70 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 70   present.  The p
1fc80 72 65 76 69 6f 75 73 20 6c 69 6d 69 74 0a 2a 2a  revious limit.**
1fc90 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
1fca0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1fcb0 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74  _soft_heap_limit
1fcc0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1fcd0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1fce0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1fcf0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1fd00 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1fd10 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  .){.  sqlite3_in
1fd20 74 36 34 20 61 6d 74 3b 0a 20 20 54 63 6c 5f 57  t64 amt;.  Tcl_W
1fd30 69 64 65 49 6e 74 20 4e 20 3d 20 2d 31 3b 0a 20  ideInt N = -1;. 
1fd40 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 26 26 20   if( objc!=1 && 
1fd50 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1fd60 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
1fd70 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
1fd80 20 22 3f 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74   "?N?");.    ret
1fd90 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1fda0 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32   }.  if( objc==2
1fdb0 20 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f   ){.    if( Tcl_
1fdc0 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62  GetWideIntFromOb
1fdd0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31  j(interp, objv[1
1fde0 5d 2c 20 26 4e 29 20 29 20 72 65 74 75 72 6e 20  ], &N) ) return 
1fdf0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1fe00 20 61 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f 73   amt = sqlite3_s
1fe10 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34  oft_heap_limit64
1fe20 28 4e 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  (N);.  Tcl_SetOb
1fe30 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
1fe40 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
1fe50 6a 28 61 6d 74 29 29 3b 0a 20 20 72 65 74 75 72  j(amt));.  retur
1fe60 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1fe70 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
1fe80 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e  te3_thread_clean
1fe90 75 70 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68  up.**.** Call th
1fea0 65 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64  e sqlite3_thread
1feb0 5f 63 6c 65 61 6e 75 70 20 41 50 49 2e 0a 2a 2f  _cleanup API..*/
1fec0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1fed0 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28  _thread_cleanup(
1fee0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1fef0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1ff00 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1ff10 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1ff20 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1ff30 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
1ff40 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
1ff50 44 0a 20 20 73 71 6c 69 74 65 33 5f 74 68 72 65  D.  sqlite3_thre
1ff60 61 64 5f 63 6c 65 61 6e 75 70 28 29 3b 0a 23 65  ad_cleanup();.#e
1ff70 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43  ndif.  return TC
1ff80 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1ff90 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
1ffa0 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 20  pager_refcounts 
1ffb0 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e   DB.**.** Return
1ffc0 20 61 20 6c 69 73 74 20 6f 66 20 6e 75 6d 62 65   a list of numbe
1ffd0 72 73 20 77 68 69 63 68 20 61 72 65 20 74 68 65  rs which are the
1ffe0 20 50 61 67 65 72 52 65 66 63 6f 75 6e 74 20 66   PagerRefcount f
1fff0 6f 72 20 61 6c 6c 0a 2a 2a 20 70 61 67 65 72 73  or all.** pagers
20000 20 6f 6e 20 65 61 63 68 20 64 61 74 61 62 61 73   on each databas
20010 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
20020 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
20030 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73  _pager_refcounts
20040 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
20050 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
20060 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
20070 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
20080 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
20090 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
200a0 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  b;.  int i;.  in
200b0 74 20 76 2c 20 2a 61 3b 0a 20 20 54 63 6c 5f 4f  t v, *a;.  Tcl_O
200c0 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 0a 20 20  bj *pResult;..  
200d0 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
200e0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
200f0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
20100 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
20110 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
20120 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
20130 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
20140 30 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20  0), " DB", 0);. 
20150 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
20160 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
20170 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
20180 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
20190 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
201a0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
201b0 52 4f 52 3b 0a 20 20 70 52 65 73 75 6c 74 20 3d  ROR;.  pResult =
201c0 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20   Tcl_NewObj();. 
201d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
201e0 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
201f0 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  f( db->aDb[i].pB
20200 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20  t==0 ){.      v 
20210 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = -1;.    }else{
20220 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
20230 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
20240 75 74 65 78 29 3b 0a 20 20 20 20 20 20 61 20 3d  utex);.      a =
20250 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 61   sqlite3PagerSta
20260 74 73 28 73 71 6c 69 74 65 33 42 74 72 65 65 50  ts(sqlite3BtreeP
20270 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 69 5d 2e  ager(db->aDb[i].
20280 70 42 74 29 29 3b 0a 20 20 20 20 20 20 76 20 3d  pBt));.      v =
20290 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 73 71 6c   a[0];.      sql
202a0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
202b0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
202c0 20 7d 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f   }.    Tcl_ListO
202d0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
202e0 30 2c 20 70 52 65 73 75 6c 74 2c 20 54 63 6c 5f  0, pResult, Tcl_
202f0 4e 65 77 49 6e 74 4f 62 6a 28 76 29 29 3b 0a 20  NewIntObj(v));. 
20300 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52   }.  Tcl_SetObjR
20310 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52  esult(interp, pR
20320 65 73 75 6c 74 29 3b 0a 20 20 72 65 74 75 72 6e  esult);.  return
20330 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
20340 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 77 6f 72  ** tclcmd:   wor
20350 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 0a 2a  king_64bit_int.*
20360 2a 0a 2a 2a 20 53 6f 6d 65 20 54 43 4c 20 62 75  *.** Some TCL bu
20370 69 6c 64 73 20 28 65 78 3a 20 63 79 67 77 69 6e  ilds (ex: cygwin
20380 29 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  ) do not support
20390 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 73   64-bit integers
203a0 2e 20 20 54 68 69 73 0a 2a 2a 20 6c 65 61 64 73  .  This.** leads
203b0 20 74 6f 20 61 20 6e 75 6d 62 65 72 20 6f 66 20   to a number of 
203c0 74 65 73 74 20 66 61 69 6c 75 72 65 73 2e 20 20  test failures.  
203d0 54 68 65 20 70 72 65 73 65 6e 74 20 63 6f 6d 6d  The present comm
203e0 61 6e 64 20 63 68 65 63 6b 73 20 74 68 65 0a 2a  and checks the.*
203f0 2a 20 54 43 4c 20 62 75 69 6c 64 20 74 6f 20 73  * TCL build to s
20400 65 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ee whether or no
20410 74 20 69 74 20 73 75 70 70 6f 72 74 73 20 36 34  t it supports 64
20420 2d 62 69 74 20 69 6e 74 65 67 65 72 73 2e 20 20  -bit integers.  
20430 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 54 52  It.** returns TR
20440 55 45 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e  UE if it does an
20450 64 20 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 0a  d FALSE if not..
20460 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61  **.** This comma
20470 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 77 61  nd is used to wa
20480 72 6e 20 75 73 65 72 73 20 74 68 61 74 20 74 68  rn users that th
20490 65 69 72 20 54 43 4c 20 62 75 69 6c 64 20 69 73  eir TCL build is
204a0 20 64 65 66 65 63 74 69 76 65 0a 2a 2a 20 61 6e   defective.** an
204b0 64 20 74 68 61 74 20 74 68 65 20 65 72 72 6f 72  d that the error
204c0 73 20 74 68 65 79 20 61 72 65 20 73 65 65 69 6e  s they are seein
204d0 67 20 69 6e 20 74 68 65 20 74 65 73 74 20 73 63  g in the test sc
204e0 72 69 70 74 73 20 6d 69 67 68 74 20 62 65 0a 2a  ripts might be.*
204f0 2a 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  * a result of th
20500 65 69 72 20 64 65 66 65 63 74 69 76 65 20 54 43  eir defective TC
20510 4c 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 72  L rather than pr
20520 6f 62 6c 65 6d 73 20 69 6e 20 53 51 4c 69 74 65  oblems in SQLite
20530 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20540 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e  working_64bit_in
20550 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
20560 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
20570 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
20580 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
20590 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
205a0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
205b0 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
205c0 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
205d0 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
205e0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
205f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
20600 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
20610 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
20620 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
20630 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
20640 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54  uments */.){.  T
20650 63 6c 5f 4f 62 6a 20 2a 70 54 65 73 74 4f 62 6a  cl_Obj *pTestObj
20660 3b 0a 20 20 69 6e 74 20 77 6f 72 6b 69 6e 67 20  ;.  int working 
20670 3d 20 30 3b 0a 0a 20 20 70 54 65 73 74 4f 62 6a  = 0;..  pTestObj
20680 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e   = Tcl_NewWideIn
20690 74 4f 62 6a 28 31 30 30 30 30 30 30 2a 28 69 36  tObj(1000000*(i6
206a0 34 29 31 32 33 34 35 36 37 38 39 30 29 3b 0a 20  4)1234567890);. 
206b0 20 77 6f 72 6b 69 6e 67 20 3d 20 73 74 72 63 6d   working = strcm
206c0 70 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  p(Tcl_GetString(
206d0 70 54 65 73 74 4f 62 6a 29 2c 20 22 31 32 33 34  pTestObj), "1234
206e0 35 36 37 38 39 30 30 30 30 30 30 30 22 29 3d 3d  567890000000")==
206f0 30 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  0;.  Tcl_DecrRef
20700 43 6f 75 6e 74 28 70 54 65 73 74 4f 62 6a 29 3b  Count(pTestObj);
20710 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
20720 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
20730 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 77 6f  NewBooleanObj(wo
20740 72 6b 69 6e 67 29 29 3b 0a 20 20 72 65 74 75 72  rking));.  retur
20750 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  n TCL_OK;.}.../*
20760 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76 66  .** tclcmd:   vf
20770 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74 0a 2a 2a  s_unlink_test.**
20780 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d  .** This TCL com
20790 6d 61 6e 64 20 75 6e 72 65 67 69 73 74 65 72 73  mand unregisters
207a0 20 74 68 65 20 70 72 69 6d 61 72 79 20 56 46 53   the primary VFS
207b0 20 61 6e 64 20 74 68 65 6e 20 72 65 67 69 73 74   and then regist
207c0 65 72 73 0a 2a 2a 20 69 74 20 62 61 63 6b 20 61  ers.** it back a
207d0 67 61 69 6e 2e 20 20 54 68 69 73 20 69 73 20 75  gain.  This is u
207e0 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 65 20  sed to test the 
207f0 61 62 69 6c 69 74 79 20 74 6f 20 72 65 67 69 73  ability to regis
20800 74 65 72 20 61 0a 2a 2a 20 56 46 53 20 77 68 65  ter a.** VFS whe
20810 6e 20 6e 6f 6e 65 20 61 72 65 20 70 72 65 76 69  n none are previ
20820 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64  ously registered
20830 2c 20 61 6e 64 20 74 68 65 20 61 62 69 6c 69 74  , and the abilit
20840 79 20 74 6f 20 0a 2a 2a 20 75 6e 72 65 67 69 73  y to .** unregis
20850 74 65 72 20 74 68 65 20 6f 6e 6c 79 20 61 76 61  ter the only ava
20860 69 6c 61 62 6c 65 20 56 46 53 2e 20 20 54 69 63  ilable VFS.  Tic
20870 6b 65 74 20 23 32 37 33 38 0a 2a 2f 0a 73 74 61  ket #2738.*/.sta
20880 74 69 63 20 69 6e 74 20 76 66 73 5f 75 6e 6c 69  tic int vfs_unli
20890 6e 6b 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e  nk_test(.  Clien
208a0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
208b0 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
208c0 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
208d0 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
208e0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
208f0 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
20900 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
20910 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
20920 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
20930 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
20940 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
20950 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
20960 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
20970 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
20980 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
20990 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
209a0 6c 69 74 65 33 5f 76 66 73 20 2a 70 4d 61 69 6e  lite3_vfs *pMain
209b0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  ;.  sqlite3_vfs 
209c0 2a 61 70 56 66 73 5b 32 30 5d 3b 0a 20 20 73 71  *apVfs[20];.  sq
209d0 6c 69 74 65 33 5f 76 66 73 20 6f 6e 65 2c 20 74  lite3_vfs one, t
209e0 77 6f 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76  wo;..  sqlite3_v
209f0 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 30 29  fs_unregister(0)
20a00 3b 20 20 20 2f 2a 20 55 6e 72 65 67 69 73 74 65  ;   /* Unregiste
20a10 72 20 6f 66 20 4e 55 4c 4c 20 69 73 20 68 61 72  r of NULL is har
20a20 6d 6c 65 73 73 20 2a 2f 0a 20 20 6f 6e 65 2e 7a  mless */.  one.z
20a30 4e 61 6d 65 20 3d 20 22 5f 5f 6f 6e 65 22 3b 0a  Name = "__one";.
20a40 20 20 74 77 6f 2e 7a 4e 61 6d 65 20 3d 20 22 5f    two.zName = "_
20a50 5f 74 77 6f 22 3b 0a 0a 20 20 2f 2a 20 43 61 6c  _two";..  /* Cal
20a60 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 76 66 73  ling sqlite3_vfs
20a70 5f 72 65 67 69 73 74 65 72 20 77 69 74 68 20 32  _register with 2
20a80 6e 64 20 61 72 67 75 6d 65 6e 74 20 6f 66 20 30  nd argument of 0
20a90 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 63   does not.  ** c
20aa0 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c  hange the defaul
20ab0 74 20 56 46 53 0a 20 20 2a 2f 0a 20 20 70 4d 61  t VFS.  */.  pMa
20ac0 69 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73  in = sqlite3_vfs
20ad0 5f 66 69 6e 64 28 30 29 3b 0a 20 20 73 71 6c 69  _find(0);.  sqli
20ae0 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
20af0 28 26 6f 6e 65 2c 20 30 29 3b 0a 20 20 61 73 73  (&one, 0);.  ass
20b00 65 72 74 28 20 70 4d 61 69 6e 3d 3d 30 20 7c 7c  ert( pMain==0 ||
20b10 20 70 4d 61 69 6e 3d 3d 73 71 6c 69 74 65 33 5f   pMain==sqlite3_
20b20 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20  vfs_find(0) );. 
20b30 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
20b40 69 73 74 65 72 28 26 74 77 6f 2c 20 30 29 3b 0a  ister(&two, 0);.
20b50 20 20 61 73 73 65 72 74 28 20 70 4d 61 69 6e 3d    assert( pMain=
20b60 3d 30 20 7c 7c 20 70 4d 61 69 6e 3d 3d 73 71 6c  =0 || pMain==sql
20b70 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
20b80 20 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 63 61 6e   );..  /* We can
20b90 20 66 69 6e 64 20 61 20 56 46 53 20 62 79 20 69   find a VFS by i
20ba0 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 73 73  ts name */.  ass
20bb0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
20bc0 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d  _find("__one")==
20bd0 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74  &one );.  assert
20be0 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
20bf0 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77  nd("__two")==&tw
20c00 6f 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c 69  o );..  /* Calli
20c10 6e 67 20 73 71 6c 69 74 65 5f 76 66 73 5f 72 65  ng sqlite_vfs_re
20c20 67 69 73 74 65 72 20 77 69 74 68 20 6e 6f 6e 2d  gister with non-
20c30 7a 65 72 6f 20 73 65 63 6f 6e 64 20 70 61 72 61  zero second para
20c40 6d 65 74 65 72 20 63 68 61 6e 67 65 73 20 74 68  meter changes th
20c50 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 56  e.  ** default V
20c60 46 53 2c 20 65 76 65 6e 20 69 66 20 74 68 65 20  FS, even if the 
20c70 31 73 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  1st parameter is
20c80 20 61 6e 20 65 78 69 73 74 69 67 20 56 46 53 20   an existig VFS 
20c90 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 70 72 65  that is.  ** pre
20ca0 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72  viously register
20cb0 65 64 20 61 73 20 74 68 65 20 6e 6f 6e 2d 64 65  ed as the non-de
20cc0 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 73 71  fault..  */.  sq
20cd0 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
20ce0 65 72 28 26 6f 6e 65 2c 20 31 29 3b 0a 20 20 61  er(&one, 1);.  a
20cf0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
20d00 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29  fs_find("__one")
20d10 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73 65  ==&one );.  asse
20d20 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
20d30 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26  find("__two")==&
20d40 74 77 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  two );.  assert(
20d50 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
20d60 64 28 30 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20  d(0)==&one );.  
20d70 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
20d80 73 74 65 72 28 26 74 77 6f 2c 20 31 29 3b 0a 20  ster(&two, 1);. 
20d90 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
20da0 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65  _vfs_find("__one
20db0 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 61 73  ")==&one );.  as
20dc0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66  sert( sqlite3_vf
20dd0 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d  s_find("__two")=
20de0 3d 26 74 77 6f 20 29 3b 0a 20 20 61 73 73 65 72  =&two );.  asser
20df0 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
20e00 69 6e 64 28 30 29 3d 3d 26 74 77 6f 20 29 3b 0a  ind(0)==&two );.
20e10 20 20 69 66 28 20 70 4d 61 69 6e 20 29 7b 0a 20    if( pMain ){. 
20e20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72     sqlite3_vfs_r
20e30 65 67 69 73 74 65 72 28 70 4d 61 69 6e 2c 20 31  egister(pMain, 1
20e40 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
20e50 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
20e60 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20 29  "__one")==&one )
20e70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
20e80 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22  lite3_vfs_find("
20e90 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b  __two")==&two );
20ea0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
20eb0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
20ec0 3d 3d 70 4d 61 69 6e 20 29 3b 0a 20 20 7d 0a 20  ==pMain );.  }. 
20ed0 20 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68   .  /* Unlink th
20ee0 65 20 64 65 66 61 75 6c 74 20 56 46 53 2e 20 20  e default VFS.  
20ef0 52 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65  Repeat until the
20f00 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 56  re are no more V
20f10 46 53 65 73 0a 20 20 2a 2a 20 72 65 67 69 73 74  FSes.  ** regist
20f20 65 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ered..  */.  for
20f30 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
20f40 70 56 66 73 29 2f 73 69 7a 65 6f 66 28 61 70 56  pVfs)/sizeof(apV
20f50 66 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  fs[0]); i++){.  
20f60 20 20 61 70 56 66 73 5b 69 5d 20 3d 20 73 71 6c    apVfs[i] = sql
20f70 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
20f80 3b 0a 20 20 20 20 69 66 28 20 61 70 56 66 73 5b  ;.    if( apVfs[
20f90 69 5d 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i] ){.      asse
20fa0 72 74 28 20 61 70 56 66 73 5b 69 5d 3d 3d 73 71  rt( apVfs[i]==sq
20fb0 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 61  lite3_vfs_find(a
20fc0 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20  pVfs[i]->zName) 
20fd0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
20fe0 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28  _vfs_unregister(
20ff0 61 70 56 66 73 5b 69 5d 29 3b 0a 20 20 20 20 20  apVfs[i]);.     
21000 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69   assert( 0==sqli
21010 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 61 70 56  te3_vfs_find(apV
21020 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b  fs[i]->zName) );
21030 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
21040 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f  ert( 0==sqlite3_
21050 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20  vfs_find(0) );. 
21060 20 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20   .  /* Register 
21070 74 68 65 20 6d 61 69 6e 20 56 46 53 20 61 73 20  the main VFS as 
21080 6e 6f 6e 2d 64 65 66 61 75 6c 74 20 28 77 69 6c  non-default (wil
21090 6c 20 62 65 20 6d 61 64 65 20 64 65 66 61 75 6c  l be made defaul
210a0 74 2c 20 73 69 6e 63 65 0a 20 20 2a 2a 20 69 74  t, since.  ** it
210b0 27 6c 6c 20 62 65 20 74 68 65 20 6f 6e 6c 79 20  'll be the only 
210c0 6f 6e 65 20 69 6e 20 65 78 69 73 74 65 6e 63 65  one in existence
210d0 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  )..  */.  sqlite
210e0 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 70  3_vfs_register(p
210f0 4d 61 69 6e 2c 20 30 29 3b 0a 20 20 61 73 73 65  Main, 0);.  asse
21100 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
21110 66 69 6e 64 28 30 29 3d 3d 70 4d 61 69 6e 20 29  find(0)==pMain )
21120 3b 0a 20 20 0a 20 20 2f 2a 20 55 6e 2d 72 65 67  ;.  .  /* Un-reg
21130 69 73 74 65 72 20 74 68 65 20 6d 61 69 6e 20 56  ister the main V
21140 46 53 20 61 67 61 69 6e 20 74 6f 20 72 65 73 74  FS again to rest
21150 6f 72 65 20 61 6e 20 65 6d 70 74 79 20 56 46 53  ore an empty VFS
21160 20 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74   list */.  sqlit
21170 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65  e3_vfs_unregiste
21180 72 28 70 4d 61 69 6e 29 3b 0a 20 20 61 73 73 65  r(pMain);.  asse
21190 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 76  rt( 0==sqlite3_v
211a0 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 0a 20  fs_find(0) );.. 
211b0 20 2f 2a 20 52 65 6c 69 6e 6b 20 61 6c 6c 20 56   /* Relink all V
211c0 46 53 65 73 20 69 6e 20 72 65 76 65 72 73 65 20  FSes in reverse 
211d0 6f 72 64 65 72 2e 20 2a 2f 20 20 0a 20 20 66 6f  order. */  .  fo
211e0 72 28 69 3d 73 69 7a 65 6f 66 28 61 70 56 66 73  r(i=sizeof(apVfs
211f0 29 2f 73 69 7a 65 6f 66 28 61 70 56 66 73 5b 30  )/sizeof(apVfs[0
21200 5d 29 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  ])-1; i>=0; i--)
21210 7b 0a 20 20 20 20 69 66 28 20 61 70 56 66 73 5b  {.    if( apVfs[
21220 69 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i] ){.      sqli
21230 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
21240 28 61 70 56 66 73 5b 69 5d 2c 20 31 29 3b 0a 20  (apVfs[i], 1);. 
21250 20 20 20 20 20 61 73 73 65 72 74 28 20 61 70 56       assert( apV
21260 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65 33 5f 76  fs[i]==sqlite3_v
21270 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20 20  fs_find(0) );.  
21280 20 20 20 20 61 73 73 65 72 74 28 20 61 70 56 66      assert( apVf
21290 73 5b 69 5d 3d 3d 73 71 6c 69 74 65 33 5f 76 66  s[i]==sqlite3_vf
212a0 73 5f 66 69 6e 64 28 61 70 56 66 73 5b 69 5d 2d  s_find(apVfs[i]-
212b0 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20 20 20 20 7d  >zName) );.    }
212c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 72 65 67  .  }..  /* Unreg
212d0 69 73 74 65 72 20 6f 75 74 20 73 61 6d 70 6c 65  ister out sample
212e0 20 56 46 53 65 73 2e 20 2a 2f 0a 20 20 73 71 6c   VFSes. */.  sql
212f0 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73  ite3_vfs_unregis
21300 74 65 72 28 26 6f 6e 65 29 3b 0a 20 20 73 71 6c  ter(&one);.  sql
21310 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73  ite3_vfs_unregis
21320 74 65 72 28 26 74 77 6f 29 3b 0a 0a 20 20 2f 2a  ter(&two);..  /*
21330 20 55 6e 72 65 67 69 73 74 65 72 69 6e 67 20 61   Unregistering a
21340 20 56 46 53 20 74 68 61 74 20 69 73 20 6e 6f 74   VFS that is not
21350 20 63 75 72 72 65 6e 74 6c 79 20 72 65 67 69 73   currently regis
21360 74 65 72 65 64 20 69 73 20 68 61 72 6d 6c 65 73  tered is harmles
21370 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  s */.  sqlite3_v
21380 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26 6f  fs_unregister(&o
21390 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ne);.  sqlite3_v
213a0 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26 74  fs_unregister(&t
213b0 77 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  wo);.  assert( s
213c0 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
213d0 22 5f 5f 6f 6e 65 22 29 3d 3d 30 20 29 3b 0a 20  "__one")==0 );. 
213e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
213f0 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f  _vfs_find("__two
21400 22 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57  ")==0 );..  /* W
21410 65 20 73 68 6f 75 6c 64 20 62 65 20 6c 65 66 74  e should be left
21420 20 77 69 74 68 20 74 68 65 20 6f 72 69 67 69 6e   with the origin
21430 61 6c 20 64 65 66 61 75 6c 74 20 56 46 53 20 62  al default VFS b
21440 61 63 6b 20 61 73 20 74 68 65 0a 20 20 2a 2a 20  ack as the.  ** 
21450 6f 72 69 67 69 6e 61 6c 20 2a 2f 0a 20 20 61 73  original */.  as
21460 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66  sert( sqlite3_vf
21470 73 5f 66 69 6e 64 28 30 29 3d 3d 70 4d 61 69 6e  s_find(0)==pMain
21480 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43   );..  return TC
21490 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  L_OK;.}../*.** t
214a0 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f 69 6e 69  clcmd:   vfs_ini
214b0 74 66 61 69 6c 5f 74 65 73 74 0a 2a 2a 0a 2a 2a  tfail_test.**.**
214c0 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e   This TCL comman
214d0 64 20 61 74 74 65 6d 70 74 73 20 74 6f 20 76 66  d attempts to vf
214e0 73 5f 66 69 6e 64 20 61 6e 64 20 76 66 73 5f 72  s_find and vfs_r
214f0 65 67 69 73 74 65 72 20 77 68 65 6e 20 74 68 65  egister when the
21500 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  .** sqlite3_init
21510 69 61 6c 69 7a 65 28 29 20 69 6e 74 65 72 66 61  ialize() interfa
21520 63 65 20 69 73 20 66 61 69 6c 69 6e 67 2e 20 20  ce is failing.  
21530 41 6c 6c 20 63 61 6c 6c 73 20 73 68 6f 75 6c 64  All calls should
21540 20 66 61 69 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   fail..*/.static
21550 20 69 6e 74 20 76 66 73 5f 69 6e 69 74 66 61 69   int vfs_initfai
21560 6c 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74  l_test(.  Client
21570 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
21580 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
21590 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
215a0 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
215b0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
215c0 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
215d0 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
215e0 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
215f0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
21600 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
21610 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
21620 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
21630 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
21640 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
21650 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
21660 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
21670 6f 6e 65 3b 0a 20 20 6f 6e 65 2e 7a 4e 61 6d 65  one;.  one.zName
21680 20 3d 20 22 5f 5f 6f 6e 65 22 3b 0a 0a 20 20 69   = "__one";..  i
21690 66 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  f( sqlite3_vfs_f
216a0 69 6e 64 28 30 29 20 29 20 72 65 74 75 72 6e 20  ind(0) ) return 
216b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c  TCL_ERROR;.  sql
216c0 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
216d0 72 28 26 6f 6e 65 2c 20 30 29 3b 0a 20 20 69 66  r(&one, 0);.  if
216e0 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
216f0 6e 64 28 30 29 20 29 20 72 65 74 75 72 6e 20 54  nd(0) ) return T
21700 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69  CL_ERROR;.  sqli
21710 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
21720 28 26 6f 6e 65 2c 20 31 29 3b 0a 20 20 69 66 28  (&one, 1);.  if(
21730 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
21740 64 28 30 29 20 29 20 72 65 74 75 72 6e 20 54 43  d(0) ) return TC
21750 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72  L_ERROR;.  retur
21760 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
21770 2a 2a 20 53 61 76 65 64 20 56 46 53 65 73 0a 2a  ** Saved VFSes.*
21780 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
21790 5f 76 66 73 20 2a 61 70 56 66 73 5b 32 30 5d 3b  _vfs *apVfs[20];
217a0 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 56 66 73  .static int nVfs
217b0 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c   = 0;../*.** tcl
217c0 63 6d 64 3a 20 20 20 76 66 73 5f 75 6e 72 65 67  cmd:   vfs_unreg
217d0 69 73 74 65 72 5f 61 6c 6c 0a 2a 2a 0a 2a 2a 20  ister_all.**.** 
217e0 55 6e 72 65 67 69 73 74 65 72 20 61 6c 6c 20 56  Unregister all V
217f0 46 53 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  FSes..*/.static 
21800 69 6e 74 20 76 66 73 5f 75 6e 72 65 67 69 73 74  int vfs_unregist
21810 65 72 5f 61 6c 6c 28 0a 20 20 43 6c 69 65 6e 74  er_all(.  Client
21820 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
21830 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
21840 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
21850 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
21860 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
21870 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
21880 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
21890 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
218a0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
218b0 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
218c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
218d0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
218e0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
218f0 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
21900 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
21910 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
21920 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
21930 65 28 61 70 56 66 73 29 3b 20 69 2b 2b 29 7b 0a  e(apVfs); i++){.
21940 20 20 20 20 61 70 56 66 73 5b 69 5d 20 3d 20 73      apVfs[i] = s
21950 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
21960 30 29 3b 0a 20 20 20 20 69 66 28 20 61 70 56 66  0);.    if( apVf
21970 73 5b 69 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b  s[i]==0 ) break;
21980 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
21990 5f 75 6e 72 65 67 69 73 74 65 72 28 61 70 56 66  _unregister(apVf
219a0 73 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 6e 56 66  s[i]);.  }.  nVf
219b0 73 20 3d 20 69 3b 0a 20 20 72 65 74 75 72 6e 20  s = i;.  return 
219c0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  TCL_OK;.}./*.** 
219d0 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f 72 65  tclcmd:   vfs_re
219e0 72 65 67 69 73 74 65 72 5f 61 6c 6c 0a 2a 2a 0a  register_all.**.
219f0 2a 2a 20 52 65 73 74 6f 72 65 20 61 6c 6c 20 56  ** Restore all V
21a00 46 53 65 73 20 74 68 61 74 20 77 65 72 65 20 72  FSes that were r
21a10 65 6d 6f 76 65 64 20 75 73 69 6e 67 20 76 66 73  emoved using vfs
21a20 5f 75 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c 0a  _unregister_all.
21a30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66  */.static int vf
21a40 73 5f 72 65 72 65 67 69 73 74 65 72 5f 61 6c 6c  s_reregister_all
21a50 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
21a60 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
21a70 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
21a80 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
21a90 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
21aa0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
21ab0 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
21ac0 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
21ad0 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
21ae0 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
21af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21b00 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
21b10 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
21b20 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
21b30 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
21b40 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ments */.){.  in
21b50 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
21b60 69 3c 6e 56 66 73 3b 20 69 2b 2b 29 7b 0a 20 20  i<nVfs; i++){.  
21b70 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65    sqlite3_vfs_re
21b80 67 69 73 74 65 72 28 61 70 56 66 73 5b 69 5d 2c  gister(apVfs[i],
21b90 20 69 3d 3d 30 29 3b 0a 20 20 7d 0a 20 20 72 65   i==0);.  }.  re
21ba0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
21bb0 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
21bc0 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65   file_control_te
21bd0 73 74 20 44 42 0a 2a 2a 0a 2a 2a 20 54 68 69 73  st DB.**.** This
21be0 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e   TCL command run
21bf0 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  s the sqlite3_fi
21c00 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72  le_control inter
21c10 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69  face and.** veri
21c20 66 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65  fies correct ope
21c30 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 61  ration of the sa
21c40 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  me..*/.static in
21c50 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74  t file_control_t
21c60 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  est(.  ClientDat
21c70 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
21c80 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
21c90 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
21ca0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
21cb0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
21cc0 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
21cd0 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
21ce0 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
21cf0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
21d00 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
21d10 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
21d20 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
21d30 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
21d40 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
21d50 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
21d60 20 69 6e 74 20 69 41 72 67 20 3d 20 30 3b 0a 20   int iArg = 0;. 
21d70 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
21d80 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
21d90 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
21da0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
21db0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
21dc0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
21dd0 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
21de0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
21df0 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
21e00 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
21e10 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
21e20 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
21e30 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
21e40 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
21e50 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
21e60 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
21e70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
21e80 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
21e90 30 2c 20 30 2c 20 26 69 41 72 67 29 3b 0a 20 20  0, 0, &iArg);.  
21ea0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
21eb0 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 3b 0a 20  TE_NOTFOUND );. 
21ec0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
21ed0 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22  le_control(db, "
21ee0 6e 6f 74 61 64 61 74 61 62 61 73 65 22 2c 20 53  notadatabase", S
21ef0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b  QLITE_FCNTL_LOCK
21f00 53 54 41 54 45 2c 20 26 69 41 72 67 29 3b 0a 20  STATE, &iArg);. 
21f10 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
21f20 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 72  ITE_ERROR );.  r
21f30 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
21f40 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6d 61  _control(db, "ma
21f50 69 6e 22 2c 20 2d 31 2c 20 26 69 41 72 67 29 3b  in", -1, &iArg);
21f60 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
21f70 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29  QLITE_NOTFOUND )
21f80 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
21f90 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
21fa0 2c 20 22 74 65 6d 70 22 2c 20 2d 31 2c 20 26 69  , "temp", -1, &i
21fb0 41 72 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Arg);.  assert( 
21fc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  rc==SQLITE_NOTFO
21fd0 55 4e 44 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  UND || rc==SQLIT
21fe0 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20 72 65  E_ERROR );..  re
21ff0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
22000 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
22010 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61   file_control_la
22020 73 74 65 72 72 6e 6f 5f 74 65 73 74 20 44 42 0a  sterrno_test DB.
22030 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63  **.** This TCL c
22040 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20  ommand runs the 
22050 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
22060 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 61  trol interface a
22070 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73 20 63  nd.** verifies c
22080 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e  orrect operation
22090 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4c   of the SQLITE_L
220a0 41 53 54 5f 45 52 52 4e 4f 20 76 65 72 62 2e 0a  AST_ERRNO verb..
220b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
220c0 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65  le_control_laste
220d0 72 72 6e 6f 5f 74 65 73 74 28 0a 20 20 43 6c 69  rrno_test(.  Cli
220e0 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
220f0 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
22100 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
22110 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
22120 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
22130 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
22140 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
22150 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
22160 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
22170 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
22180 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
22190 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
221a0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
221b0 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
221c0 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
221d0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 41 72 67 20  /.){.  int iArg 
221e0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  = 0;.  sqlite3 *
221f0 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  db;.  int rc;.. 
22200 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
22210 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
22220 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
22230 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
22240 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
22250 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
22260 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
22270 20 30 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a   0), " DB", 0);.
22280 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
22290 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
222a0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
222b0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
222c0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
222d0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
222e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
222f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
22300 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e  le_control(db, N
22310 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 4c 41 53 54  ULL, SQLITE_LAST
22320 5f 45 52 52 4e 4f 2c 20 26 69 41 72 67 29 3b 0a  _ERRNO, &iArg);.
22330 20 20 69 66 28 20 72 63 20 29 7b 20 0a 20 20 20    if( rc ){ .   
22340 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
22350 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
22360 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 20 0a 20  wIntObj(rc)); . 
22370 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
22380 52 4f 52 3b 20 0a 20 20 7d 0a 20 20 69 66 28 20  ROR; .  }.  if( 
22390 69 41 72 67 21 3d 30 20 29 20 7b 0a 20 20 20 20  iArg!=0 ) {.    
223a0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
223b0 28 69 6e 74 65 72 70 2c 20 22 55 6e 65 78 70 65  (interp, "Unexpe
223c0 63 74 65 64 20 6e 6f 6e 2d 7a 65 72 6f 20 65 72  cted non-zero er
223d0 72 6e 6f 3a 20 22 2c 0a 20 20 20 20 20 20 20 20  rno: ",.        
223e0 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
223f0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
22400 6a 28 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  j(Tcl_NewIntObj(
22410 69 41 72 67 29 2c 20 30 29 2c 20 22 20 22 2c 20  iArg), 0), " ", 
22420 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
22430 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
22440 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20  return TCL_OK;  
22450 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
22460 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  :   file_control
22470 5f 63 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74 20  _chunksize_test 
22480 44 42 20 44 42 4e 41 4d 45 20 53 49 5a 45 0a 2a  DB DBNAME SIZE.*
22490 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f  *.** This TCL co
224a0 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73  mmand runs the s
224b0 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
224c0 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 61 6e  rol interface an
224d0 64 0a 2a 2a 20 76 65 72 69 66 69 65 73 20 63 6f  d.** verifies co
224e0 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20  rrect operation 
224f0 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 47 45  of the SQLITE_GE
22500 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20  T_LOCKPROXYFILE 
22510 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 45  and.** SQLITE_SE
22520 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20  T_LOCKPROXYFILE 
22530 76 65 72 62 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  verbs..*/.static
22540 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f   int file_contro
22550 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74  l_chunksize_test
22560 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
22570 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
22580 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
22590 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
225a0 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
225b0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
225c0 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
225d0 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
225e0 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
225f0 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
22600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22610 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
22620 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
22630 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
22640 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
22650 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ments */.){.  in
22660 74 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20  t nSize;        
22670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22680 20 4e 65 77 20 63 68 75 6e 6b 20 73 69 7a 65 20   New chunk size 
22690 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 20  */.  char *zDb; 
226a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226b0 20 20 20 20 20 2f 2a 20 44 62 20 6e 61 6d 65 20       /* Db name 
226c0 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20  ("main", "temp" 
226d0 65 74 63 2e 29 20 2a 2f 0a 20 20 73 71 6c 69 74  etc.) */.  sqlit
226e0 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
226f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
22700 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
22710 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
22720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22730 20 20 20 2f 2a 20 66 69 6c 65 5f 63 6f 6e 74 72     /* file_contr
22740 6f 6c 28 29 20 72 65 74 75 72 6e 20 63 6f 64 65  ol() return code
22750 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   */..  if( objc!
22760 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =4 ){.    Tcl_Wr
22770 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
22780 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
22790 44 42 4e 41 4d 45 20 53 49 5a 45 22 29 3b 0a 20  DBNAME SIZE");. 
227a0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
227b0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
227c0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
227d0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
227e0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
227f0 20 0a 20 20 20 7c 7c 20 54 63 6c 5f 47 65 74 49   .   || Tcl_GetI
22800 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
22810 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 69 7a  , objv[3], &nSiz
22820 65 29 0a 20 20 29 7b 0a 20 20 20 72 65 74 75 72  e).  ){.   retur
22830 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
22840 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74  .  zDb = Tcl_Get
22850 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
22860 0a 20 20 69 66 28 20 7a 44 62 5b 30 5d 3d 3d 27  .  if( zDb[0]=='
22870 5c 30 27 20 29 20 7a 44 62 20 3d 20 4e 55 4c 4c  \0' ) zDb = NULL
22880 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
22890 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
228a0 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46  b, zDb, SQLITE_F
228b0 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 2c  CNTL_CHUNK_SIZE,
228c0 20 28 76 6f 69 64 20 2a 29 26 6e 53 69 7a 65 29   (void *)&nSize)
228d0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
228e0 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
228f0 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
22900 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
22910 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  c), TCL_STATIC);
22920 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
22930 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
22940 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
22950 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66  *.** tclcmd:   f
22960 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69 7a 65  ile_control_size
22970 68 69 6e 74 5f 74 65 73 74 20 44 42 20 44 42 4e  hint_test DB DBN
22980 41 4d 45 20 53 49 5a 45 0a 2a 2a 0a 2a 2a 20 54  AME SIZE.**.** T
22990 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20  his TCL command 
229a0 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33  runs the sqlite3
229b0 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e  _file_control in
229c0 74 65 72 66 61 63 65 20 0a 2a 2a 20 77 69 74 68  terface .** with
229d0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49   SQLITE_FCNTL_SI
229e0 5a 45 5f 48 49 4e 54 0a 2a 2f 0a 73 74 61 74 69  ZE_HINT.*/.stati
229f0 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72  c int file_contr
22a00 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74 65 73 74  ol_sizehint_test
22a10 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
22a20 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
22a30 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
22a40 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
22a50 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
22a60 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
22a70 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
22a80 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
22a90 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
22aa0 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
22ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22ac0 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
22ad0 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
22ae0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
22af0 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
22b00 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63  ments */.){.  Tc
22b10 6c 5f 57 69 64 65 49 6e 74 20 6e 53 69 7a 65 3b  l_WideInt nSize;
22b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22b30 20 48 69 6e 74 65 64 20 73 69 7a 65 20 2a 2f 0a   Hinted size */.
22b40 20 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20    char *zDb;    
22b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b60 20 20 2f 2a 20 44 62 20 6e 61 6d 65 20 28 22 6d    /* Db name ("m
22b70 61 69 6e 22 2c 20 22 74 65 6d 70 22 20 65 74 63  ain", "temp" etc
22b80 2e 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  .) */.  sqlite3 
22b90 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
22ba0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
22bb0 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
22bc0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
22bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22be0 2f 2a 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  /* file_control(
22bf0 29 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  ) return code */
22c00 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20  ..  if( objc!=4 
22c10 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
22c20 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
22c30 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44 42 4e  1, objv, "DB DBN
22c40 41 4d 45 20 53 49 5a 45 22 29 3b 0a 20 20 20 20  AME SIZE");.    
22c50 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
22c60 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
22c70 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
22c80 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
22c90 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 0a 20  bjv[1]), &db) . 
22ca0 20 20 7c 7c 20 54 63 6c 5f 47 65 74 57 69 64 65    || Tcl_GetWide
22cb0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
22cc0 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 69  p, objv[3], &nSi
22cd0 7a 65 29 0a 20 20 29 7b 0a 20 20 20 72 65 74 75  ze).  ){.   retu
22ce0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
22cf0 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65  }.  zDb = Tcl_Ge
22d00 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
22d10 3b 0a 20 20 69 66 28 20 7a 44 62 5b 30 5d 3d 3d  ;.  if( zDb[0]==
22d20 27 5c 30 27 20 29 20 7a 44 62 20 3d 20 4e 55 4c  '\0' ) zDb = NUL
22d30 4c 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  L;..  rc = sqlit
22d40 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
22d50 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f  db, zDb, SQLITE_
22d60 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c  FCNTL_SIZE_HINT,
22d70 20 28 76 6f 69 64 20 2a 29 26 6e 53 69 7a 65 29   (void *)&nSize)
22d80 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
22d90 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
22da0 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
22db0 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
22dc0 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  c), TCL_STATIC);
22dd0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
22de0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
22df0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
22e00 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66  *.** tclcmd:   f
22e10 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b  ile_control_lock
22e20 70 72 6f 78 79 5f 74 65 73 74 20 44 42 20 50 57  proxy_test DB PW
22e30 44 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c  D.**.** This TCL
22e40 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68   command runs th
22e50 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  e sqlite3_file_c
22e60 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65  ontrol interface
22e70 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73   and.** verifies
22e80 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69   correct operati
22e90 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45  on of the SQLITE
22ea0 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _GET_LOCKPROXYFI
22eb0 4c 45 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  LE and.** SQLITE
22ec0 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
22ed0 4c 45 20 76 65 72 62 73 2e 0a 2a 2f 0a 73 74 61  LE verbs..*/.sta
22ee0 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e  tic int file_con
22ef0 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74  trol_lockproxy_t
22f00 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  est(.  ClientDat
22f10 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
22f20 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
22f30 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
22f40 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
22f50 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
22f60 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
22f70 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
22f80 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
22f90 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
22fa0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
22fb0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
22fc0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
22fd0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
22fe0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
22ff0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
23000 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
23010 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
23020 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
23030 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
23040 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
23050 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
23060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23070 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
23080 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
23090 30 29 2c 20 22 20 44 42 20 50 57 44 22 2c 20 30  0), " DB PWD", 0
230a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
230b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
230c0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
230d0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
230e0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
230f0 26 64 62 29 20 29 7b 0a 20 20 20 72 65 74 75 72  &db) ){.   retur
23100 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
23110 0a 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .  .#if !defined
23120 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c  (SQLITE_ENABLE_L
23130 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20  OCKING_STYLE).# 
23140 20 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   if defined(__AP
23150 50 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69  PLE__).#    defi
23160 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ne SQLITE_ENABLE
23170 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31  _LOCKING_STYLE 1
23180 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65  .#  else.#    de
23190 66 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42  fine SQLITE_ENAB
231a0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
231b0 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64   0.#  endif.#end
231c0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  if.#if SQLITE_EN
231d0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
231e0 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
231f0 41 50 50 4c 45 5f 5f 29 0a 20 20 7b 0a 20 20 20  APPLE__).  {.   
23200 20 63 68 61 72 20 2a 74 65 73 74 50 61 74 68 3b   char *testPath;
23210 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
23220 20 69 6e 74 20 6e 50 77 64 3b 0a 20 20 20 20 63   int nPwd;.    c
23230 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 77 64 3b  onst char *zPwd;
23240 0a 20 20 20 20 63 68 61 72 20 70 72 6f 78 79 50  .    char proxyP
23250 61 74 68 5b 34 30 30 5d 3b 0a 20 20 20 20 0a 20  ath[400];.    . 
23260 20 20 20 7a 50 77 64 20 3d 20 54 63 6c 5f 47 65     zPwd = Tcl_Ge
23270 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
23280 62 6a 76 5b 32 5d 2c 20 26 6e 50 77 64 29 3b 0a  bjv[2], &nPwd);.
23290 20 20 20 20 69 66 28 20 73 69 7a 65 6f 66 28 70      if( sizeof(p
232a0 72 6f 78 79 50 61 74 68 29 3c 6e 50 77 64 2b 32  roxyPath)<nPwd+2
232b0 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  0 ){.      Tcl_A
232c0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
232d0 72 70 2c 20 22 50 57 44 20 74 6f 6f 20 62 69 67  rp, "PWD too big
232e0 22 2c 20 28 76 6f 69 64 2a 29 30 29 3b 0a 20 20  ", (void*)0);.  
232f0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
23300 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
23310 73 70 72 69 6e 74 66 28 70 72 6f 78 79 50 61 74  sprintf(proxyPat
23320 68 2c 20 22 25 73 2f 74 65 73 74 2e 70 72 6f 78  h, "%s/test.prox
23330 79 22 2c 20 7a 50 77 64 29 3b 0a 20 20 20 20 72  y", zPwd);.    r
23340 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
23350 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c  _control(db, NUL
23360 4c 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f  L, SQLITE_SET_LO
23370 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 70 72 6f  CKPROXYFILE, pro
23380 78 79 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28  xyPath);.    if(
23390 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c   rc ){.      Tcl
233a0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
233b0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
233c0 4f 62 6a 28 72 63 29 29 3b 20 0a 20 20 20 20 20  Obj(rc)); .     
233d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
233e0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  R;.    }.    rc 
233f0 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
23400 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c  ontrol(db, NULL,
23410 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b   SQLITE_GET_LOCK
23420 50 52 4f 58 59 46 49 4c 45 2c 20 26 74 65 73 74  PROXYFILE, &test
23430 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 73  Path);.    if( s
23440 74 72 6e 63 6d 70 28 70 72 6f 78 79 50 61 74 68  trncmp(proxyPath
23450 2c 74 65 73 74 50 61 74 68 2c 31 31 29 20 29 7b  ,testPath,11) ){
23460 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
23470 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
23480 22 4c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65  "Lock proxy file
23490 20 64 69 64 20 6e 6f 74 20 6d 61 74 63 68 20 74   did not match t
234a0 68 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  he ".           
234b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234c0 20 20 20 20 22 70 72 65 76 69 6f 75 73 6c 79 20      "previously 
234d0 61 73 73 69 67 6e 65 64 20 76 61 6c 75 65 22 2c  assigned value",
234e0 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
234f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
23500 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b   }.    if( rc ){
23510 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  .      Tcl_SetOb
23520 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
23530 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63  Tcl_NewIntObj(rc
23540 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
23550 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
23560 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
23570 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
23580 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45  db, NULL, SQLITE
23590 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
235a0 4c 45 2c 20 70 72 6f 78 79 50 61 74 68 29 3b 0a  LE, proxyPath);.
235b0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
235c0 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
235d0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
235e0 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b  _NewIntObj(rc));
235f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
23600 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
23610 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
23620 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a  rn TCL_OK;  .}..
23630 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
23640 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  N./*.** tclcmd: 
23650 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77    file_control_w
23660 69 6e 33 32 5f 61 76 5f 72 65 74 72 79 20 44 42  in32_av_retry DB
23670 20 20 4e 52 45 54 52 59 20 20 44 45 4c 41 59 0a    NRETRY  DELAY.
23680 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63  **.** This TCL c
23690 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20  ommand runs the 
236a0 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
236b0 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 77  trol interface w
236c0 69 74 68 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54  ith.** the SQLIT
236d0 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 41 56  E_FCNTL_WIN32_AV
236e0 5f 52 45 54 52 59 20 6f 70 63 6f 64 65 2e 0a 2a  _RETRY opcode..*
236f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
23700 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f  e_control_win32_
23710 61 76 5f 72 65 74 72 79 28 0a 20 20 43 6c 69 65  av_retry(.  Clie
23720 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
23730 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
23740 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
23750 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
23760 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
23770 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
23780 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
23790 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
237a0 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
237b0 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
237c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
237d0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
237e0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
237f0 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
23800 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
23810 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
23820 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  b;.  int rc;.  i
23830 6e 74 20 61 5b 32 5d 3b 0a 20 20 63 68 61 72 20  nt a[2];.  char 
23840 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f  z[100];..  if( o
23850 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
23860 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
23870 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
23880 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
23890 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
238a0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
238b0 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
238c0 20 44 42 20 4e 52 45 54 52 59 20 44 45 4c 41 59   DB NRETRY DELAY
238d0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
238e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
238f0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
23900 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
23910 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
23920 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20  ]), &db) ){.    
23930 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
23940 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
23950 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
23960 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
23970 61 5b 30 5d 29 20 29 20 72 65 74 75 72 6e 20 54  a[0]) ) return T
23980 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
23990 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
239a0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
239b0 5d 2c 20 26 61 5b 31 5d 29 20 29 20 72 65 74 75  ], &a[1]) ) retu
239c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
239d0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
239e0 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55  e_control(db, NU
239f0 4c 4c 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  LL, SQLITE_FCNTL
23a00 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52 59 2c  _WIN32_AV_RETRY,
23a10 20 28 76 6f 69 64 2a 29 61 29 3b 0a 20 20 73 71   (void*)a);.  sq
23a20 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
23a30 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 64  izeof(z), z, "%d
23a40 20 25 64 20 25 64 22 2c 20 72 63 2c 20 61 5b 30   %d %d", rc, a[0
23a50 5d 2c 20 61 5b 31 5d 29 3b 0a 20 20 54 63 6c 5f  ], a[1]);.  Tcl_
23a60 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
23a70 65 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30  erp, z, (char*)0
23a80 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
23a90 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  OK;  .}../*.** t
23aa0 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f  clcmd:   file_co
23ab0 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 73 65 74 5f  ntrol_win32_set_
23ac0 68 61 6e 64 6c 65 20 44 42 20 48 41 4e 44 4c 45  handle DB HANDLE
23ad0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20  .**.** This TCL 
23ae0 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65  command runs the
23af0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
23b00 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20  ntrol interface 
23b10 77 69 74 68 0a 2a 2a 20 74 68 65 20 53 51 4c 49  with.** the SQLI
23b20 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 53  TE_FCNTL_WIN32_S
23b30 45 54 5f 48 41 4e 44 4c 45 20 6f 70 63 6f 64 65  ET_HANDLE opcode
23b40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23b50 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e  file_control_win
23b60 33 32 5f 73 65 74 5f 68 61 6e 64 6c 65 28 0a 20  32_set_handle(. 
23b70 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
23b80 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
23b90 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
23ba0 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
23bb0 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
23bc0 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
23bd0 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
23be0 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
23bf0 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
23c00 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
23c10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
23c20 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
23c30 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
23c40 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
23c50 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
23c60 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
23c70 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
23c80 3b 0a 20 20 48 41 4e 44 4c 45 20 68 46 69 6c 65  ;.  HANDLE hFile
23c90 20 3d 20 4e 55 4c 4c 3b 0a 20 20 63 68 61 72 20   = NULL;.  char 
23ca0 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f  z[100];..  if( o
23cb0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
23cc0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
23cd0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
23ce0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
23cf0 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
23d00 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
23d10 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
23d20 20 44 42 20 48 41 4e 44 4c 45 22 2c 20 30 29 3b   DB HANDLE", 0);
23d30 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
23d40 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
23d50 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
23d60 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
23d70 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
23d80 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
23d90 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
23da0 20 20 69 66 28 20 67 65 74 57 69 6e 33 32 48 61    if( getWin32Ha
23db0 6e 64 6c 65 28 69 6e 74 65 72 70 2c 20 54 63 6c  ndle(interp, Tcl
23dc0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
23dd0 32 5d 29 2c 20 26 68 46 69 6c 65 29 20 29 7b 0a  2]), &hFile) ){.
23de0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
23df0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  RROR;.  }.  rc =
23e00 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
23e10 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20  ntrol(db, NULL, 
23e20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e  SQLITE_FCNTL_WIN
23e30 33 32 5f 53 45 54 5f 48 41 4e 44 4c 45 2c 0a 20  32_SET_HANDLE,. 
23e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e50 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
23e60 2a 29 26 68 46 69 6c 65 29 3b 0a 20 20 73 71 6c  *)&hFile);.  sql
23e70 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
23e80 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 64 20  zeof(z), z, "%d 
23e90 25 70 22 2c 20 72 63 2c 20 28 76 6f 69 64 2a 29  %p", rc, (void*)
23ea0 68 46 69 6c 65 29 3b 0a 20 20 54 63 6c 5f 41 70  hFile);.  Tcl_Ap
23eb0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
23ec0 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30 29 3b  p, z, (char*)0);
23ed0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
23ee0 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ;  .}.#endif../*
23ef0 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69  .** tclcmd:   fi
23f00 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72 73 69  le_control_persi
23f10 73 74 5f 77 61 6c 20 44 42 20 50 45 52 53 49 53  st_wal DB PERSIS
23f20 54 2d 46 4c 41 47 0a 2a 2a 0a 2a 2a 20 54 68 69  T-FLAG.**.** Thi
23f30 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75  s TCL command ru
23f40 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66  ns the sqlite3_f
23f50 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65  ile_control inte
23f60 72 66 61 63 65 20 77 69 74 68 0a 2a 2a 20 74 68  rface with.** th
23f70 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  e SQLITE_FCNTL_P
23f80 45 52 53 49 53 54 5f 57 41 4c 20 6f 70 63 6f 64  ERSIST_WAL opcod
23f90 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
23fa0 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65   file_control_pe
23fb0 72 73 69 73 74 5f 77 61 6c 28 0a 20 20 43 6c 69  rsist_wal(.  Cli
23fc0 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
23fd0 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
23fe0 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
23ff0 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
24000 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
24010 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
24020 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
24030 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
24040 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
24050 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
24060 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
24070 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
24080 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
24090 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
240a0 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
240b0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
240c0 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
240d0 69 6e 74 20 62 50 65 72 73 69 73 74 3b 0a 20 20  int bPersist;.  
240e0 63 68 61 72 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20  char z[100];..  
240f0 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
24100 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
24110 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
24120 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
24130 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
24140 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
24150 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
24160 30 29 2c 20 22 20 44 42 20 46 4c 41 47 22 2c 20  0), " DB FLAG", 
24170 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
24180 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
24190 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
241a0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
241b0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
241c0 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74   &db) ){.    ret
241d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
241e0 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
241f0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
24200 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 62 50 65  p, objv[2], &bPe
24210 72 73 69 73 74 29 20 29 20 72 65 74 75 72 6e 20  rsist) ) return 
24220 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
24230 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
24240 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c  ontrol(db, NULL,
24250 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45   SQLITE_FCNTL_PE
24260 52 53 49 53 54 5f 57 41 4c 2c 20 28 76 6f 69 64  RSIST_WAL, (void
24270 2a 29 26 62 50 65 72 73 69 73 74 29 3b 0a 20 20  *)&bPersist);.  
24280 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
24290 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22  (sizeof(z), z, "
242a0 25 64 20 25 64 22 2c 20 72 63 2c 20 62 50 65 72  %d %d", rc, bPer
242b0 73 69 73 74 29 3b 0a 20 20 54 63 6c 5f 41 70 70  sist);.  Tcl_App
242c0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
242d0 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  , z, (char*)0);.
242e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
242f0 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63    .}../*.** tclc
24300 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72  md:   file_contr
24310 6f 6c 5f 70 6f 77 65 72 73 61 66 65 5f 6f 76 65  ol_powersafe_ove
24320 72 77 72 69 74 65 20 44 42 20 50 53 4f 57 2d 46  rwrite DB PSOW-F
24330 4c 41 47 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54  LAG.**.** This T
24340 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20  CL command runs 
24350 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
24360 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61  _control interfa
24370 63 65 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 53  ce with.** the S
24380 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45  QLITE_FCNTL_POWE
24390 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20  RSAFE_OVERWRITE 
243a0 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  opcode..*/.stati
243b0 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72  c int file_contr
243c0 6f 6c 5f 70 6f 77 65 72 73 61 66 65 5f 6f 76 65  ol_powersafe_ove
243d0 72 77 72 69 74 65 28 0a 20 20 43 6c 69 65 6e 74  rwrite(.  Client
243e0 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
243f0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
24400 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
24410 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
24420 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
24430 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
24440 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
24450 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
24460 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
24470 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
24480 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
24490 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
244a0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
244b0 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
244c0 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
244d0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
244e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
244f0 20 62 3b 0a 20 20 63 68 61 72 20 7a 5b 31 30 30   b;.  char z[100
24500 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ];..  if( objc!=
24510 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
24520 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
24530 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
24540 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
24550 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
24560 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
24570 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 46  v[0], 0), " DB F
24580 4c 41 47 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  LAG", 0);.    re
24590 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
245a0 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
245b0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
245c0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
245d0 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20  v[1]), &db) ){. 
245e0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
245f0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  ROR;.  }.  if( T
24600 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
24610 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
24620 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e 20 54  , &b) ) return T
24630 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
24640 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
24650 6e 74 72 6f 6c 28 64 62 2c 4e 55 4c 4c 2c 53 51  ntrol(db,NULL,SQ
24660 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52  LITE_FCNTL_POWER
24670 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 2c 28  SAFE_OVERWRITE,(
24680 76 6f 69 64 2a 29 26 62 29 3b 0a 20 20 73 71 6c  void*)&b);.  sql
24690 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
246a0 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 64 20  zeof(z), z, "%d 
246b0 25 64 22 2c 20 72 63 2c 20 62 29 3b 0a 20 20 54  %d", rc, b);.  T
246c0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
246d0 69 6e 74 65 72 70 2c 20 7a 2c 20 28 63 68 61 72  interp, z, (char
246e0 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  *)0);.  return T
246f0 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a  CL_OK;  .}.../*.
24700 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c  ** tclcmd:   fil
24710 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d  e_control_vfsnam
24720 65 20 44 42 20 3f 41 55 58 44 42 3f 0a 2a 2a 0a  e DB ?AUXDB?.**.
24730 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 72 69  ** Return a stri
24740 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ng that describe
24750 73 20 74 68 65 20 73 74 61 63 6b 20 6f 66 20 56  s the stack of V
24760 46 53 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  FSes..*/.static 
24770 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  int file_control
24780 5f 76 66 73 6e 61 6d 65 28 0a 20 20 43 6c 69 65  _vfsname(.  Clie
24790 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
247a0 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
247b0 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
247c0 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
247d0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
247e0 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
247f0 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
24800 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
24810 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
24820 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
24830 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
24840 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
24850 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
24860 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
24870 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
24880 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
24890 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
248a0 2a 7a 44 62 4e 61 6d 65 20 3d 20 22 6d 61 69 6e  *zDbName = "main
248b0 22 3b 0a 20 20 63 68 61 72 20 2a 7a 56 66 73 4e  ";.  char *zVfsN
248c0 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  ame = 0;..  if( 
248d0 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21  objc!=2 && objc!
248e0 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
248f0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
24900 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
24910 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
24920 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
24930 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
24940 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20  jv[0], 0), " DB 
24950 3f 41 55 58 44 42 3f 22 2c 20 30 29 3b 0a 20 20  ?AUXDB?", 0);.  
24960 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
24970 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
24980 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
24990 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
249a0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
249b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
249c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
249d0 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20  f( objc==3 ){.  
249e0 20 20 7a 44 62 4e 61 6d 65 20 3d 20 54 63 6c 5f    zDbName = Tcl_
249f0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
24a00 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ]);.  }.  sqlite
24a10 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
24a20 62 2c 20 7a 44 62 4e 61 6d 65 2c 20 53 51 4c 49  b, zDbName, SQLI
24a30 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45  TE_FCNTL_VFSNAME
24a40 2c 28 76 6f 69 64 2a 29 26 7a 56 66 73 4e 61 6d  ,(void*)&zVfsNam
24a50 65 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  e);.  Tcl_Append
24a60 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
24a70 56 66 73 4e 61 6d 65 2c 20 28 63 68 61 72 2a 29  VfsName, (char*)
24a80 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
24a90 65 65 28 7a 56 66 73 4e 61 6d 65 29 3b 0a 20 20  ee(zVfsName);.  
24aa0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20  return TCL_OK;  
24ab0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
24ac0 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  :   file_control
24ad0 5f 74 65 6d 70 66 69 6c 65 6e 61 6d 65 20 44 42  _tempfilename DB
24ae0 20 3f 41 55 58 44 42 3f 0a 2a 2a 0a 2a 2a 20 52   ?AUXDB?.**.** R
24af0 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74  eturn a string t
24b00 68 61 74 20 69 73 20 61 20 74 65 6d 70 6f 72 61  hat is a tempora
24b10 72 79 20 66 69 6c 65 6e 61 6d 65 0a 2a 2f 0a 73  ry filename.*/.s
24b20 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63  tatic int file_c
24b30 6f 6e 74 72 6f 6c 5f 74 65 6d 70 66 69 6c 65 6e  ontrol_tempfilen
24b40 61 6d 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  ame(.  ClientDat
24b50 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
24b60 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
24b70 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
24b80 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
24b90 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
24ba0 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
24bb0 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
24bc0 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
24bd0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
24be0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
24bf0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
24c00 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
24c10 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
24c20 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
24c30 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
24c40 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
24c50 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e  const char *zDbN
24c60 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20  ame = "main";.  
24c70 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30  char *zTName = 0
24c80 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
24c90 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20   && objc!=3 ){. 
24ca0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
24cb0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
24cc0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
24cd0 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
24ce0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
24cf0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
24d00 30 29 2c 20 22 20 44 42 20 3f 41 55 58 44 42 3f  0), " DB ?AUXDB?
24d10 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
24d20 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
24d30 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
24d40 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
24d50 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
24d60 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20  ]), &db) ){.    
24d70 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
24d80 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63  ;.  }.  if( objc
24d90 3d 3d 33 20 29 7b 0a 20 20 20 20 7a 44 62 4e 61  ==3 ){.    zDbNa
24da0 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  me = Tcl_GetStri
24db0 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7d  ng(objv[2]);.  }
24dc0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  .  sqlite3_file_
24dd0 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62 4e  control(db, zDbN
24de0 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  ame, SQLITE_FCNT
24df0 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 2c 20  L_TEMPFILENAME, 
24e00 28 76 6f 69 64 2a 29 26 7a 54 4e 61 6d 65 29 3b  (void*)&zTName);
24e10 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
24e20 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 54 4e 61  ult(interp, zTNa
24e30 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  me, (char*)0);. 
24e40 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
24e50 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Name);.  return 
24e60 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 0a 2f 2a  TCL_OK;  .}.../*
24e70 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 73 71  .** tclcmd:   sq
24e80 6c 69 74 65 33 5f 76 66 73 5f 6c 69 73 74 0a 2a  lite3_vfs_list.*
24e90 2a 0a 2a 2a 20 20 20 52 65 74 75 72 6e 20 61 20  *.**   Return a 
24ea0 74 63 6c 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e  tcl list contain
24eb0 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ing the names of
24ec0 20 61 6c 6c 20 72 65 67 69 73 74 65 72 65 64 20   all registered 
24ed0 76 66 73 27 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  vfs's..*/.static
24ee0 20 69 6e 74 20 76 66 73 5f 6c 69 73 74 28 0a 20   int vfs_list(. 
24ef0 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
24f00 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
24f10 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
24f20 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
24f30 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
24f40 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
24f50 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
24f60 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
24f70 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
24f80 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
24f90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
24fa0 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
24fb0 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
24fc0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
24fd0 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
24fe0 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
24ff0 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20 20  e3_vfs *pVfs;.  
25000 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 20 3d 20  Tcl_Obj *pRet = 
25010 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20  Tcl_NewObj();.  
25020 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20  if( objc!=1 ){. 
25030 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
25040 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
25050 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 72 65  bjv, "");.    re
25060 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
25070 20 20 7d 0a 20 20 66 6f 72 28 70 56 66 73 3d 73    }.  for(pVfs=s
25080 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
25090 30 29 3b 20 70 56 66 73 3b 20 70 56 66 73 3d 70  0); pVfs; pVfs=p
250a0 56 66 73 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Vfs->pNext){.   
250b0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
250c0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
250d0 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53  , pRet, Tcl_NewS
250e0 74 72 69 6e 67 4f 62 6a 28 70 56 66 73 2d 3e 7a  tringObj(pVfs->z
250f0 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a  Name, -1));.  }.
25100 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
25110 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29  lt(interp, pRet)
25120 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
25130 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63  K;  .}../*.** tc
25140 6c 63 6d 64 3a 20 20 20 73 71 6c 69 74 65 33 5f  lcmd:   sqlite3_
25150 6c 69 6d 69 74 20 44 42 20 49 44 20 56 41 4c 55  limit DB ID VALU
25160 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c  E.**.** This TCL
25170 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68   command runs th
25180 65 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 20  e sqlite3_limit 
25190 69 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a  interface and.**
251a0 20 76 65 72 69 66 69 65 73 20 63 6f 72 72 65 63   verifies correc
251b0 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74  t operation of t
251c0 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  he same..*/.stat
251d0 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 69 6d 69  ic int test_limi
251e0 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
251f0 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
25200 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
25210 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
25220 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
25230 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
25240 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
25250 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
25260 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
25270 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
25280 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
25290 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
252a0 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
252b0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
252c0 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
252d0 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73  uments */.){.  s
252e0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
252f0 74 20 72 63 3b 0a 20 20 73 74 61 74 69 63 20 63  t rc;.  static c
25300 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
25310 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a     char *zName;.
25320 20 20 20 20 20 69 6e 74 20 69 64 3b 0a 20 20 7d       int id;.  }
25330 20 61 49 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b   aId[] = {.    {
25340 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c   "SQLITE_LIMIT_L
25350 45 4e 47 54 48 22 2c 20 20 20 20 20 20 20 20 20  ENGTH",         
25360 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
25370 54 5f 4c 45 4e 47 54 48 20 20 20 20 20 20 20 20  T_LENGTH        
25380 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
25390 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51  "SQLITE_LIMIT_SQ
253a0 4c 5f 4c 45 4e 47 54 48 22 2c 20 20 20 20 20 20  L_LENGTH",      
253b0 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
253c0 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 20 20 20 20  _SQL_LENGTH     
253d0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
253e0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
253f0 55 4d 4e 22 2c 20 20 20 20 20 20 20 20 20 20 20  UMN",           
25400 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
25410 43 4f 4c 55 4d 4e 20 20 20 20 20 20 20 20 20 20  COLUMN          
25420 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53       },.    { "S
25430 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52  QLITE_LIMIT_EXPR
25440 5f 44 45 50 54 48 22 2c 20 20 20 20 20 20 20 20  _DEPTH",        
25450 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45    SQLITE_LIMIT_E
25460 58 50 52 5f 44 45 50 54 48 20 20 20 20 20 20 20  XPR_DEPTH       
25470 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
25480 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f  LITE_LIMIT_COMPO
25490 55 4e 44 5f 53 45 4c 45 43 54 22 2c 20 20 20 20  UND_SELECT",    
254a0 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f   SQLITE_LIMIT_CO
254b0 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 20 20  MPOUND_SELECT   
254c0 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c     },.    { "SQL
254d0 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f  ITE_LIMIT_VDBE_O
254e0 50 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  P",             
254f0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42  SQLITE_LIMIT_VDB
25500 45 5f 4f 50 20 20 20 20 20 20 20 20 20 20 20 20  E_OP            
25510 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
25520 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f  TE_LIMIT_FUNCTIO
25530 4e 5f 41 52 47 22 2c 20 20 20 20 20 20 20 20 53  N_ARG",        S
25540 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43  QLITE_LIMIT_FUNC
25550 54 49 4f 4e 5f 41 52 47 20 20 20 20 20 20 20 20  TION_ARG        
25560 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
25570 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44  E_LIMIT_ATTACHED
25580 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 53 51  ",            SQ
25590 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43  LITE_LIMIT_ATTAC
255a0 48 45 44 20 20 20 20 20 20 20 20 20 20 20 20 20  HED             
255b0 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  },.    { "SQLITE
255c0 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54  _LIMIT_LIKE_PATT
255d0 45 52 4e 5f 4c 45 4e 47 54 48 22 2c 20 53 51 4c  ERN_LENGTH", SQL
255e0 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50  ITE_LIMIT_LIKE_P
255f0 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 20 7d  ATTERN_LENGTH  }
25600 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f  ,.    { "SQLITE_
25610 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
25620 55 4d 42 45 52 22 2c 20 20 20 20 20 53 51 4c 49  UMBER",     SQLI
25630 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
25640 45 5f 4e 55 4d 42 45 52 20 20 20 20 20 20 7d 2c  E_NUMBER      },
25650 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c  .    { "SQLITE_L
25660 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50  IMIT_TRIGGER_DEP
25670 54 48 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54  TH",       SQLIT
25680 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f  E_LIMIT_TRIGGER_
25690 44 45 50 54 48 20 20 20 20 20 20 20 20 7d 2c 0a  DEPTH        },.
256a0 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49      { "SQLITE_LI
256b0 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MIT_WORKER_THREA
256c0 44 53 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45  DS",      SQLITE
256d0 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48  _LIMIT_WORKER_TH
256e0 52 45 41 44 53 20 20 20 20 20 20 20 7d 2c 0a 20  READS       },. 
256f0 20 20 20 0a 20 20 20 20 2f 2a 20 4f 75 74 20 6f     .    /* Out o
25700 66 20 72 61 6e 67 65 20 74 65 73 74 20 63 61 73  f range test cas
25710 65 73 20 2a 2f 0a 20 20 20 20 7b 20 22 53 51 4c  es */.    { "SQL
25720 49 54 45 5f 4c 49 4d 49 54 5f 54 4f 4f 53 4d 41  ITE_LIMIT_TOOSMA
25730 4c 4c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  LL",            
25740 2d 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  -1,             
25750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25760 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
25770 54 45 5f 4c 49 4d 49 54 5f 54 4f 4f 42 49 47 22  TE_LIMIT_TOOBIG"
25780 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  ,              S
25790 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b  QLITE_LIMIT_WORK
257a0 45 52 5f 54 48 52 45 41 44 53 2b 31 20 20 20 20  ER_THREADS+1    
257b0 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69   },.  };.  int i
257c0 2c 20 69 64 3b 0a 20 20 69 6e 74 20 76 61 6c 3b  , id;.  int val;
257d0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
257e0 49 64 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  Id;..  if( objc!
257f0 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =4 ){.    Tcl_Ap
25800 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
25810 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
25820 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
25830 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
25840 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
25850 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20  jv[0], 0), " DB 
25860 49 44 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20  ID VALUE", 0);. 
25870 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
25880 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
25890 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
258a0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
258b0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
258c0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
258d0 52 4f 52 3b 0a 20 20 7a 49 64 20 3d 20 54 63 6c  ROR;.  zId = Tcl
258e0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
258f0 32 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  2]);.  for(i=0; 
25900 69 3c 73 69 7a 65 6f 66 28 61 49 64 29 2f 73 69  i<sizeof(aId)/si
25910 7a 65 6f 66 28 61 49 64 5b 30 5d 29 3b 20 69 2b  zeof(aId[0]); i+
25920 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63  +){.    if( strc
25930 6d 70 28 7a 49 64 2c 20 61 49 64 5b 69 5d 2e 7a  mp(zId, aId[i].z
25940 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
25950 20 20 69 64 20 3d 20 61 49 64 5b 69 5d 2e 69 64    id = aId[i].id
25960 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
25970 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69     }.  }.  if( i
25980 3e 3d 73 69 7a 65 6f 66 28 61 49 64 29 2f 73 69  >=sizeof(aId)/si
25990 7a 65 6f 66 28 61 49 64 5b 30 5d 29 20 29 7b 0a  zeof(aId[0]) ){.
259a0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
259b0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e  sult(interp, "un
259c0 6b 6e 6f 77 6e 20 6c 69 6d 69 74 20 74 79 70 65  known limit type
259d0 3a 20 22 2c 20 7a 49 64 2c 20 28 63 68 61 72 2a  : ", zId, (char*
259e0 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )0);.    return 
259f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
25a00 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
25a10 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
25a20 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20  bjv[3], &val) ) 
25a30 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
25a40 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
25a50 5f 6c 69 6d 69 74 28 64 62 2c 20 69 64 2c 20 76  _limit(db, id, v
25a60 61 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  al);.  Tcl_SetOb
25a70 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
25a80 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63  Tcl_NewIntObj(rc
25a90 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
25aa0 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _OK;  .}../*.** 
25ab0 74 63 6c 63 6d 64 3a 20 20 73 61 76 65 5f 70 72  tclcmd:  save_pr
25ac0 6e 67 5f 73 74 61 74 65 0a 2a 2a 0a 2a 2a 20 53  ng_state.**.** S
25ad0 61 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66  ave the state of
25ae0 20 74 68 65 20 70 73 65 75 64 6f 2d 72 61 6e 64   the pseudo-rand
25af0 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61  om number genera
25b00 74 6f 72 2e 0a 2a 2a 20 41 74 20 74 68 65 20 73  tor..** At the s
25b10 61 6d 65 20 74 69 6d 65 2c 20 76 65 72 69 66 79  ame time, verify
25b20 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f 74 65   that sqlite3_te
25b30 73 74 5f 63 6f 6e 74 72 6f 6c 20 77 6f 72 6b 73  st_control works
25b40 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 63 61   even when.** ca
25b50 6c 6c 65 64 20 77 69 74 68 20 61 6e 20 6f 75 74  lled with an out
25b60 2d 6f 66 2d 72 61 6e 67 65 20 6f 70 63 6f 64 65  -of-range opcode
25b70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25b80 73 61 76 65 5f 70 72 6e 67 5f 73 74 61 74 65 28  save_prng_state(
25b90 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
25ba0 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
25bb0 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
25bc0 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
25bd0 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
25be0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
25bf0 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
25c00 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
25c10 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
25c20 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
25c30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25c40 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
25c50 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
25c60 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
25c70 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
25c80 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ents */.){.  int
25c90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 65   rc = sqlite3_te
25ca0 73 74 5f 63 6f 6e 74 72 6f 6c 28 39 39 39 39 29  st_control(9999)
25cb0 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
25cc0 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0 );.  rc = sqli
25cd0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
25ce0 28 2d 31 29 3b 0a 20 20 61 73 73 65 72 74 28 20  (-1);.  assert( 
25cf0 72 63 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  rc==0 );.  sqlit
25d00 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
25d10 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
25d20 50 52 4e 47 5f 53 41 56 45 29 3b 0a 20 20 72 65  PRNG_SAVE);.  re
25d30 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f  turn TCL_OK;.}./
25d40 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 72 65  *.** tclcmd:  re
25d50 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65  store_prng_state
25d60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
25d70 65 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74  estore_prng_stat
25d80 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  e(.  ClientData 
25d90 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
25da0 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
25db0 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
25dc0 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
25dd0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
25de0 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
25df0 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
25e00 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
25e10 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
25e20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
25e30 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
25e40 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
25e50 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
25e60 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
25e70 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73  uments */.){.  s
25e80 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
25e90 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
25ea0 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45  TRL_PRNG_RESTORE
25eb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
25ec0 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  OK;.}./*.** tclc
25ed0 6d 64 3a 20 20 72 65 73 65 74 5f 70 72 6e 67 5f  md:  reset_prng_
25ee0 73 74 61 74 65 0a 2a 2f 0a 73 74 61 74 69 63 20  state.*/.static 
25ef0 69 6e 74 20 72 65 73 65 74 5f 70 72 6e 67 5f 73  int reset_prng_s
25f00 74 61 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61  tate(.  ClientDa
25f10 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
25f20 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
25f30 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
25f40 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
25f50 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
25f60 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
25f70 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
25f80 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
25f90 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
25fa0 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
25fb0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
25fc0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
25fd0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
25fe0 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
25ff0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
26000 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
26010 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
26020 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45  STCTRL_PRNG_RESE
26030 54 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  T);.  return TCL
26040 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63  _OK;.}../*.** tc
26050 6c 63 6d 64 3a 20 20 64 61 74 61 62 61 73 65 5f  lcmd:  database_
26060 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70 74 0a 2a  may_be_corrupt.*
26070 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68  *.** Indicate th
26080 61 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  at database file
26090 73 20 6d 69 67 68 74 20 62 65 20 63 6f 72 72 75  s might be corru
260a0 70 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  pt.  In other wo
260b0 72 64 73 2c 20 73 65 74 20 74 68 65 20 6e 6f 72  rds, set the nor
260c0 6d 61 6c 0a 2a 2a 20 73 74 61 74 65 20 6f 66 20  mal.** state of 
260d0 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  operation..*/.st
260e0 61 74 69 63 20 69 6e 74 20 64 61 74 61 62 61 73  atic int databas
260f0 65 5f 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70 74  e_may_be_corrupt
26100 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
26110 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
26120 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
26130 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
26140 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
26150 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
26160 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
26170 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
26180 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
26190 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
261a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
261b0 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
261c0 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
261d0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
261e0 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
261f0 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
26200 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
26210 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
26220 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54  RL_NEVER_CORRUPT
26230 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
26240 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74  CL_OK;.}./*.** t
26250 63 6c 63 6d 64 3a 20 20 64 61 74 61 62 61 73 65  clcmd:  database
26260 5f 6e 65 76 65 72 5f 63 6f 72 72 75 70 74 0a 2a  _never_corrupt.*
26270 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68  *.** Indicate th
26280 61 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  at database file
26290 73 20 61 72 65 20 61 6c 77 61 79 73 20 77 65 6c  s are always wel
262a0 6c 2d 66 6f 72 6d 65 64 2e 20 20 54 68 69 73 20  l-formed.  This 
262b0 65 6e 61 62 6c 65 73 20 65 78 74 72 61 20 61 73  enables extra as
262c0 73 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d  sert().** statem
262d0 65 6e 74 73 20 74 68 61 74 20 74 65 73 74 20 63  ents that test c
262e0 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 61  onditions that a
262f0 72 65 20 61 6c 77 61 79 73 20 74 72 75 65 20 66  re always true f
26300 6f 72 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64  or well-formed d
26310 61 74 61 62 61 73 65 73 2e 0a 2a 2f 0a 73 74 61  atabases..*/.sta
26320 74 69 63 20 69 6e 74 20 64 61 74 61 62 61 73 65  tic int database
26330 5f 6e 65 76 65 72 5f 63 6f 72 72 75 70 74 28 0a  _never_corrupt(.
26340 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
26350 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
26360 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
26370 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
26380 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
26390 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
263a0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
263b0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
263c0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
263d0 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
263e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
263f0 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
26400 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
26410 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
26420 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
26430 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
26440 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
26450 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
26460 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 2c 20  _NEVER_CORRUPT, 
26470 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  1);.  return TCL
26480 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63  _OK;.}../*.** tc
26490 6c 63 6d 64 3a 20 20 70 63 61 63 68 65 5f 73 74  lcmd:  pcache_st
264a0 61 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ats.*/.static in
264b0 74 20 74 65 73 74 5f 70 63 61 63 68 65 5f 73 74  t test_pcache_st
264c0 61 74 73 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  ats(.  ClientDat
264d0 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
264e0 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
264f0 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
26500 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
26510 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
26520 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
26530 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
26540 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
26550 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
26560 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
26570 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
26580 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
26590 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
265a0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
265b0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
265c0 20 69 6e 74 20 6e 4d 69 6e 3b 0a 20 20 69 6e 74   int nMin;.  int
265d0 20 6e 4d 61 78 3b 0a 20 20 69 6e 74 20 6e 43 75   nMax;.  int nCu
265e0 72 72 65 6e 74 3b 0a 20 20 69 6e 74 20 6e 52 65  rrent;.  int nRe
265f0 63 79 63 6c 61 62 6c 65 3b 0a 20 20 54 63 6c 5f  cyclable;.  Tcl_
26600 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a 20 20 73 71  Obj *pRet;..  sq
26610 6c 69 74 65 33 50 63 61 63 68 65 53 74 61 74 73  lite3PcacheStats
26620 28 26 6e 43 75 72 72 65 6e 74 2c 20 26 6e 4d 61  (&nCurrent, &nMa
26630 78 2c 20 26 6e 4d 69 6e 2c 20 26 6e 52 65 63 79  x, &nMin, &nRecy
26640 63 6c 61 62 6c 65 29 3b 0a 0a 20 20 70 52 65 74  clable);..  pRet
26650 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b   = Tcl_NewObj();
26660 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
26670 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
26680 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  rp, pRet, Tcl_Ne
26690 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 75 72 72  wStringObj("curr
266a0 65 6e 74 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63  ent", -1));.  Tc
266b0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
266c0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
266d0 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  Ret, Tcl_NewIntO
266e0 62 6a 28 6e 43 75 72 72 65 6e 74 29 29 3b 0a 20  bj(nCurrent));. 
266f0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
26700 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
26710 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53  , pRet, Tcl_NewS
26720 74 72 69 6e 67 4f 62 6a 28 22 6d 61 78 22 2c 20  tringObj("max", 
26730 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  -1));.  Tcl_List
26740 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
26750 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54  (interp, pRet, T
26760 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 4d 61  cl_NewIntObj(nMa
26770 78 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  x));.  Tcl_ListO
26780 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
26790 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63  interp, pRet, Tc
267a0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
267b0 6d 69 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63  min", -1));.  Tc
267c0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
267d0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
267e0 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  Ret, Tcl_NewIntO
267f0 62 6a 28 6e 4d 69 6e 29 29 3b 0a 20 20 54 63 6c  bj(nMin));.  Tcl
26800 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
26810 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
26820 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  et, Tcl_NewStrin
26830 67 4f 62 6a 28 22 72 65 63 79 63 6c 61 62 6c 65  gObj("recyclable
26840 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  ", -1));.  Tcl_L
26850 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
26860 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ent(interp, pRet
26870 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
26880 6e 52 65 63 79 63 6c 61 62 6c 65 29 29 3b 0a 0a  nRecyclable));..
26890 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
268a0 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29  lt(interp, pRet)
268b0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  ;..  return TCL_
268c0 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  OK;.}..#ifdef SQ
268d0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f  LITE_ENABLE_UNLO
268e0 43 4b 5f 4e 4f 54 49 46 59 0a 73 74 61 74 69 63  CK_NOTIFY.static
268f0 20 76 6f 69 64 20 74 65 73 74 5f 75 6e 6c 6f 63   void test_unloc
26900 6b 5f 6e 6f 74 69 66 79 5f 63 62 28 76 6f 69 64  k_notify_cb(void
26910 20 2a 2a 61 41 72 67 2c 20 69 6e 74 20 6e 41 72   **aArg, int nAr
26920 67 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20  g){.  int ii;.  
26930 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 41 72  for(ii=0; ii<nAr
26940 67 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 54 63  g; ii++){.    Tc
26950 6c 5f 45 76 61 6c 45 78 28 28 54 63 6c 5f 49 6e  l_EvalEx((Tcl_In
26960 74 65 72 70 20 2a 29 61 41 72 67 5b 69 69 5d 2c  terp *)aArg[ii],
26970 20 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22   "unlock_notify"
26980 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47  , -1, TCL_EVAL_G
26990 4c 4f 42 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65  LOBAL);.  }.}.#e
269a0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
269b0 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54  NABLE_UNLOCK_NOT
269c0 49 46 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 74 63  IFY */../*.** tc
269d0 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 75  lcmd:  sqlite3_u
269e0 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 20 64 62 0a  nlock_notify db.
269f0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
26a00 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e  _ENABLE_UNLOCK_N
26a10 4f 54 49 46 59 0a 73 74 61 74 69 63 20 69 6e 74  OTIFY.static int
26a20 20 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74   test_unlock_not
26a30 69 66 79 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  ify(.  ClientDat
26a40 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
26a50 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c   Unused */.  Tcl
26a60 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
26a70 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
26a80 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
26a90 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
26aa0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
26ab0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
26ac0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
26ad0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
26ae0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
26af0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
26b00 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
26b10 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
26b20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
26b30 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
26b40 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
26b50 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
26b60 22 44 42 22 29 3b 0a 20 20 20 20 72 65 74 75 72  "DB");.    retur
26b70 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
26b80 0a 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  ..  if( getDbPoi
26b90 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
26ba0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
26bb0 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20  1]), &db) ){.   
26bc0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
26bd0 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  R;.  }.  rc = sq
26be0 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74  lite3_unlock_not
26bf0 69 66 79 28 64 62 2c 20 74 65 73 74 5f 75 6e 6c  ify(db, test_unl
26c00 6f 63 6b 5f 6e 6f 74 69 66 79 5f 63 62 2c 20 28  ock_notify_cb, (
26c10 76 6f 69 64 20 2a 29 69 6e 74 65 72 70 29 3b 0a  void *)interp);.
26c20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
26c30 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
26c40 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  t1ErrorName(rc),
26c50 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20   TCL_STATIC);.  
26c60 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
26c70 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 74  .#endif../*.** t
26c80 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f  clcmd:  sqlite3_
26c90 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64  wal_checkpoint d
26ca0 62 20 3f 4e 41 4d 45 3f 0a 2a 2f 0a 73 74 61 74  b ?NAME?.*/.stat
26cb0 69 63 20 69 6e 74 20 74 65 73 74 5f 77 61 6c 5f  ic int test_wal_
26cc0 63 68 65 63 6b 70 6f 69 6e 74 28 0a 20 20 43 6c  checkpoint(.  Cl
26cd0 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
26ce0 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a  ata, /* Unused *
26cf0 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
26d00 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
26d10 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
26d20 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
26d30 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
26d40 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
26d50 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
26d60 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
26d70 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
26d80 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
26d90 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
26da0 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44  */.){.  char *zD
26db0 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  b = 0;.  sqlite3
26dc0 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
26dd0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26  .  if( objc!=3 &
26de0 26 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  & objc!=2 ){.   
26df0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
26e00 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
26e10 76 2c 20 22 44 42 20 3f 4e 41 4d 45 3f 22 29 3b  v, "DB ?NAME?");
26e20 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
26e30 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
26e40 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
26e50 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
26e60 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
26e70 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
26e80 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
26e90 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29  .  if( objc==3 )
26ea0 7b 0a 20 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f  {.    zDb = Tcl_
26eb0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
26ec0 5d 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  ]);.  }.  rc = s
26ed0 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
26ee0 70 6f 69 6e 74 28 64 62 2c 20 7a 44 62 29 3b 0a  point(db, zDb);.
26ef0 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
26f00 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
26f10 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  t1ErrorName(rc),
26f20 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20   TCL_STATIC);.  
26f30 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
26f40 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
26f50 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
26f60 63 6b 70 6f 69 6e 74 5f 76 32 20 64 62 20 4d 4f  ckpoint_v2 db MO
26f70 44 45 20 3f 4e 41 4d 45 3f 0a 2a 2a 0a 2a 2a 20  DE ?NAME?.**.** 
26f80 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63 61 6c  This command cal
26f90 6c 73 20 74 68 65 20 77 61 6c 5f 63 68 65 63 6b  ls the wal_check
26fa0 70 6f 69 6e 74 5f 76 32 28 29 20 66 75 6e 63 74  point_v2() funct
26fb0 69 6f 6e 20 77 69 74 68 20 74 68 65 20 73 70 65  ion with the spe
26fc0 63 69 66 69 65 64 0a 2a 2a 20 6d 6f 64 65 20 61  cified.** mode a
26fd0 72 67 75 6d 65 6e 74 20 28 70 61 73 73 69 76 65  rgument (passive
26fe0 2c 20 66 75 6c 6c 20 6f 72 20 72 65 73 74 61 72  , full or restar
26ff0 74 29 2e 20 49 66 20 70 72 65 73 65 6e 74 2c 20  t). If present, 
27000 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
27010 65 0a 2a 2a 20 4e 41 4d 45 20 69 73 20 70 61 73  e.** NAME is pas
27020 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
27030 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 77 61  d argument to wa
27040 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28  l_checkpoint_v2(
27050 29 2e 20 49 66 20 69 74 20 74 68 65 0a 2a 2a 20  ). If it the.** 
27060 4e 41 4d 45 20 61 72 67 75 6d 65 6e 74 20 69 73  NAME argument is
27070 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 61 20   not present, a 
27080 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 69 73 20  NULL pointer is 
27090 70 61 73 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  passed instead..
270a0 2a 2a 0a 2a 2a 20 49 66 20 77 61 6c 5f 63 68 65  **.** If wal_che
270b0 63 6b 70 6f 69 6e 74 5f 76 32 28 29 20 72 65 74  ckpoint_v2() ret
270c0 75 72 6e 73 20 61 6e 79 20 76 61 6c 75 65 20 6f  urns any value o
270d0 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
270e0 5f 42 55 53 59 20 6f 72 0a 2a 2a 20 53 51 4c 49  _BUSY or.** SQLI
270f0 54 45 5f 4f 4b 2c 20 74 68 65 6e 20 74 68 69 73  TE_OK, then this
27100 20 63 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 73   command returns
27110 20 54 43 4c 5f 45 52 52 4f 52 2e 20 54 68 65 20   TCL_ERROR. The 
27120 54 63 6c 20 72 65 73 75 6c 74 20 69 73 20 73 65  Tcl result is se
27130 74 0a 2a 2a 20 74 6f 20 74 68 65 20 65 72 72 6f  t.** to the erro
27140 72 20 6d 65 73 73 61 67 65 20 6f 62 74 61 69 6e  r message obtain
27150 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
27160 65 72 72 6d 73 67 28 29 2e 0a 2a 2a 0a 2a 2a 20  errmsg()..**.** 
27170 4f 74 68 65 72 77 69 73 65 2c 20 74 68 69 73 20  Otherwise, this 
27180 63 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 73 20  command returns 
27190 61 20 6c 69 73 74 20 6f 66 20 74 68 72 65 65 20  a list of three 
271a0 69 6e 74 65 67 65 72 73 2e 20 54 68 65 20 66 69  integers. The fi
271b0 72 73 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69  rst integer.** i
271c0 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f 42 55  s 1 if SQLITE_BU
271d0 53 59 20 77 61 73 20 72 65 74 75 72 6e 65 64 2c  SY was returned,
271e0 20 6f 72 20 30 20 6f 74 68 65 72 77 69 73 65 2e   or 0 otherwise.
271f0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
27200 77 6f 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61  wo integers.** a
27210 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 72 65  re the values re
27220 74 75 72 6e 65 64 20 76 69 61 20 74 68 65 20 6f  turned via the o
27230 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73  utput parameters
27240 20 62 79 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69   by wal_checkpoi
27250 6e 74 5f 76 32 28 29 20 2d 0a 2a 2a 20 74 68 65  nt_v2() -.** the
27260 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65   number of frame
27270 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 61 6e 64  s in the log and
27280 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
27290 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67  rames in the log
272a0 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20 62 65  .** that have be
272b0 65 6e 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e  en checkpointed.
272c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
272d0 65 73 74 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  est_wal_checkpoi
272e0 6e 74 5f 76 32 28 0a 20 20 43 6c 69 65 6e 74 44  nt_v2(.  ClientD
272f0 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
27300 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54  /* Unused */.  T
27310 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
27320 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
27330 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
27340 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
27350 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
27360 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
27370 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
27380 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
27390 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
273a0 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
273b0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
273c0 0a 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30  .  char *zDb = 0
273d0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
273e0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 6e  .  int rc;..  in
273f0 74 20 65 4d 6f 64 65 3b 0a 20 20 69 6e 74 20 6e  t eMode;.  int n
27400 4c 6f 67 20 3d 20 2d 35 35 35 3b 0a 20 20 69 6e  Log = -555;.  in
27410 74 20 6e 43 6b 70 74 20 3d 20 2d 35 35 35 3b 0a  t nCkpt = -555;.
27420 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b    Tcl_Obj *pRet;
27430 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ..  const char *
27440 20 61 4d 6f 64 65 5b 5d 20 3d 20 7b 20 22 70 61   aMode[] = { "pa
27450 73 73 69 76 65 22 2c 20 22 66 75 6c 6c 22 2c 20  ssive", "full", 
27460 22 72 65 73 74 61 72 74 22 2c 20 22 74 72 75 6e  "restart", "trun
27470 63 61 74 65 22 2c 20 30 20 7d 3b 0a 20 20 61 73  cate", 0 };.  as
27480 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45  sert( SQLITE_CHE
27490 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 3d  CKPOINT_PASSIVE=
274a0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
274b0 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
274c0 54 5f 46 55 4c 4c 3d 3d 31 20 29 3b 0a 20 20 61  T_FULL==1 );.  a
274d0 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48  ssert( SQLITE_CH
274e0 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54  ECKPOINT_RESTART
274f0 3d 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==2 );.  assert(
27500 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
27510 4e 54 5f 54 52 55 4e 43 41 54 45 3d 3d 33 20 29  NT_TRUNCATE==3 )
27520 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
27530 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20   && objc!=4 ){. 
27540 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
27550 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
27560 62 6a 76 2c 20 22 44 42 20 4d 4f 44 45 20 3f 4e  bjv, "DB MODE ?N
27570 41 4d 45 3f 22 29 3b 0a 20 20 20 20 72 65 74 75  AME?");.    retu
27580 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
27590 7d 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 34  }..  if( objc==4
275a0 20 29 7b 0a 20 20 20 20 7a 44 62 20 3d 20 54 63   ){.    zDb = Tc
275b0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
275c0 5b 33 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  [3]);.  }.  if( 
275d0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
275e0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
275f0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
27600 29 20 7c 7c 20 28 0a 20 20 20 20 20 20 54 43 4c  ) || (.      TCL
27610 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46  _OK!=Tcl_GetIntF
27620 72 6f 6d 4f 62 6a 28 30 2c 20 6f 62 6a 76 5b 32  romObj(0, objv[2
27630 5d 2c 20 26 65 4d 6f 64 65 29 0a 20 20 20 26 26  ], &eMode).   &&
27640 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74   TCL_OK!=Tcl_Get
27650 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74  IndexFromObj(int
27660 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 61 4d  erp, objv[2], aM
27670 6f 64 65 2c 20 22 6d 6f 64 65 22 2c 20 30 2c 20  ode, "mode", 0, 
27680 26 65 4d 6f 64 65 29 20 0a 20 20 29 29 7b 0a 20  &eMode) .  )){. 
27690 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
276a0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  ROR;.  }..  rc =
276b0 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
276c0 63 6b 70 6f 69 6e 74 5f 76 32 28 64 62 2c 20 7a  ckpoint_v2(db, z
276d0 44 62 2c 20 65 4d 6f 64 65 2c 20 26 6e 4c 6f 67  Db, eMode, &nLog
276e0 2c 20 26 6e 43 6b 70 74 29 3b 0a 20 20 69 66 28  , &nCkpt);.  if(
276f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
27700 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53  & rc!=SQLITE_BUS
27710 59 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  Y ){.    const c
27720 68 61 72 20 2a 7a 45 72 72 43 6f 64 65 20 3d 20  har *zErrCode = 
27730 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
27740 63 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 73 65  c);.    Tcl_Rese
27750 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  tResult(interp);
27760 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
27770 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45  esult(interp, zE
27780 72 72 43 6f 64 65 2c 20 22 20 2d 20 22 2c 20 28  rrCode, " - ", (
27790 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65  char *)sqlite3_e
277a0 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20  rrmsg(db), 0);. 
277b0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
277c0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 52 65 74  ROR;.  }..  pRet
277d0 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b   = Tcl_NewObj();
277e0 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
277f0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
27800 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  rp, pRet, Tcl_Ne
27810 77 49 6e 74 4f 62 6a 28 72 63 3d 3d 53 51 4c 49  wIntObj(rc==SQLI
27820 54 45 5f 42 55 53 59 3f 31 3a 30 29 29 3b 0a 20  TE_BUSY?1:0));. 
27830 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
27840 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
27850 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49  , pRet, Tcl_NewI
27860 6e 74 4f 62 6a 28 6e 4c 6f 67 29 29 3b 0a 20 20  ntObj(nLog));.  
27870 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
27880 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
27890 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e   pRet, Tcl_NewIn
278a0 74 4f 62 6a 28 6e 43 6b 70 74 29 29 3b 0a 20 20  tObj(nCkpt));.  
278b0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
278c0 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a  (interp, pRet);.
278d0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
278e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  ;.}../*.** tclcm
278f0 64 3a 20 20 74 65 73 74 5f 73 71 6c 69 74 65 33  d:  test_sqlite3
27900 5f 6c 6f 67 20 3f 53 43 52 49 50 54 3f 0a 2a 2f  _log ?SCRIPT?.*/
27910 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 4c  .static struct L
27920 6f 67 43 61 6c 6c 62 61 63 6b 20 7b 0a 20 20 54  ogCallback {.  T
27930 63 6c 5f 49 6e 74 65 72 70 20 2a 70 49 6e 74 65  cl_Interp *pInte
27940 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  rp;.  Tcl_Obj *p
27950 4f 62 6a 3b 0a 7d 20 6c 6f 67 63 61 6c 6c 62 61  Obj;.} logcallba
27960 63 6b 20 3d 20 7b 30 2c 20 30 7d 3b 0a 73 74 61  ck = {0, 0};.sta
27970 74 69 63 20 76 6f 69 64 20 78 4c 6f 67 63 61 6c  tic void xLogcal
27980 6c 62 61 63 6b 28 76 6f 69 64 20 2a 75 6e 75 73  lback(void *unus
27990 65 64 2c 20 69 6e 74 20 65 72 72 2c 20 63 68 61  ed, int err, cha
279a0 72 20 2a 7a 4d 73 67 29 7b 0a 20 20 54 63 6c 5f  r *zMsg){.  Tcl_
279b0 4f 62 6a 20 2a 70 4e 65 77 20 3d 20 54 63 6c 5f  Obj *pNew = Tcl_
279c0 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 6c 6f 67  DuplicateObj(log
279d0 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 29 3b 0a  callback.pObj);.
279e0 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
279f0 6e 74 28 70 4e 65 77 29 3b 0a 20 20 54 63 6c 5f  nt(pNew);.  Tcl_
27a00 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
27a10 6d 65 6e 74 28 0a 20 20 20 20 20 20 30 2c 20 70  ment(.      0, p
27a20 4e 65 77 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  New, Tcl_NewStri
27a30 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 45 72 72  ngObj(sqlite3Err
27a40 4e 61 6d 65 28 65 72 72 29 2c 20 2d 31 29 0a 20  Name(err), -1). 
27a50 20 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62   );.  Tcl_ListOb
27a60 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
27a70 2c 20 70 4e 65 77 2c 20 54 63 6c 5f 4e 65 77 53  , pNew, Tcl_NewS
27a80 74 72 69 6e 67 4f 62 6a 28 7a 4d 73 67 2c 20 2d  tringObj(zMsg, -
27a90 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f  1));.  Tcl_EvalO
27aa0 62 6a 45 78 28 6c 6f 67 63 61 6c 6c 62 61 63 6b  bjEx(logcallback
27ab0 2e 70 49 6e 74 65 72 70 2c 20 70 4e 65 77 2c 20  .pInterp, pNew, 
27ac0 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 7c  TCL_EVAL_GLOBAL|
27ad0 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29  TCL_EVAL_DIRECT)
27ae0 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
27af0 6f 75 6e 74 28 70 4e 65 77 29 3b 0a 7d 0a 73 74  ount(pNew);.}.st
27b00 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 71  atic int test_sq
27b10 6c 69 74 65 33 5f 6c 6f 67 28 0a 20 20 43 6c 69  lite3_log(.  Cli
27b20 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
27b30 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
27b40 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
27b50 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
27b60 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
27b70 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
27b80 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
27b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
27ba0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
27bb0 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
27bc0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
27bd0 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
27be0 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6f 62  s */.){.  if( ob
27bf0 6a 63 3e 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  jc>2 ){.    Tcl_
27c00 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
27c10 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
27c20 43 52 49 50 54 22 29 3b 0a 20 20 20 20 72 65 74  CRIPT");.    ret
27c30 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
27c40 20 7d 0a 20 20 69 66 28 20 6c 6f 67 63 61 6c 6c   }.  if( logcall
27c50 62 61 63 6b 2e 70 4f 62 6a 20 29 7b 0a 20 20 20  back.pObj ){.   
27c60 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
27c70 74 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f  t(logcallback.pO
27c80 62 6a 29 3b 0a 20 20 20 20 6c 6f 67 63 61 6c 6c  bj);.    logcall
27c90 62 61 63 6b 2e 70 4f 62 6a 20 3d 20 30 3b 0a 20  back.pObj = 0;. 
27ca0 20 20 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70     logcallback.p
27cb0 49 6e 74 65 72 70 20 3d 20 30 3b 0a 20 20 20 20  Interp = 0;.    
27cc0 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53  sqlite3_config(S
27cd0 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47  QLITE_CONFIG_LOG
27ce0 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  , 0, 0);.  }.  i
27cf0 66 28 20 6f 62 6a 63 3e 31 20 29 7b 0a 20 20 20  f( objc>1 ){.   
27d00 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62   logcallback.pOb
27d10 6a 20 3d 20 6f 62 6a 76 5b 31 5d 3b 0a 20 20 20  j = objv[1];.   
27d20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
27d30 74 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f  t(logcallback.pO
27d40 62 6a 29 3b 0a 20 20 20 20 6c 6f 67 63 61 6c 6c  bj);.    logcall
27d50 62 61 63 6b 2e 70 49 6e 74 65 72 70 20 3d 20 69  back.pInterp = i
27d60 6e 74 65 72 70 3b 0a 20 20 20 20 73 71 6c 69 74  nterp;.    sqlit
27d70 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45  e3_config(SQLITE
27d80 5f 43 4f 4e 46 49 47 5f 4c 4f 47 2c 20 78 4c 6f  _CONFIG_LOG, xLo
27d90 67 63 61 6c 6c 62 61 63 6b 2c 20 30 29 3b 0a 20  gcallback, 0);. 
27da0 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
27db0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20  OK;.}../*.**    
27dc0 20 74 63 6c 5f 6f 62 6a 70 72 6f 63 20 43 4f 4d   tcl_objproc COM
27dd0 4d 41 4e 44 4e 41 4d 45 20 41 52 47 53 2e 2e 2e  MANDNAME ARGS...
27de0 0a 2a 2a 0a 2a 2a 20 52 75 6e 20 61 20 54 43 4c  .**.** Run a TCL
27df0 20 63 6f 6d 6d 61 6e 64 20 75 73 69 6e 67 20 69   command using i
27e00 74 73 20 6f 62 6a 50 72 6f 63 20 69 6e 74 65 72  ts objProc inter
27e10 66 61 63 65 2e 20 20 54 68 72 6f 77 20 61 6e 20  face.  Throw an 
27e20 65 72 72 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20  error if.** the 
27e30 63 6f 6d 6d 61 6e 64 20 68 61 73 20 6e 6f 20 6f  command has no o
27e40 62 6a 50 72 6f 63 20 69 6e 74 65 72 66 61 63 65  bjProc interface
27e50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27e60 72 75 6e 41 73 4f 62 6a 50 72 6f 63 28 0a 20 20  runAsObjProc(.  
27e70 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
27e80 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
27e90 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
27ea0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
27eb0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
27ec0 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d    Tcl_CmdInfo cm
27ed0 64 49 6e 66 6f 3b 0a 20 20 69 66 28 20 6f 62 6a  dInfo;.  if( obj
27ee0 63 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  c<2 ){.    Tcl_W
27ef0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
27f00 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 43 4f  rp, 1, objv, "CO
27f10 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20  MMAND ...");.   
27f20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
27f30 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 54 63  R;.  }.  if( !Tc
27f40 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f  l_GetCommandInfo
27f50 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
27f60 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
27f70 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20   &cmdInfo) ){.  
27f80 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
27f90 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d  lt(interp, "comm
27fa0 61 6e 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20 22  and not found: "
27fb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 54 63 6c  ,.           Tcl
27fc0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
27fd0 31 5d 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  1]), (char*)0);.
27fe0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
27ff0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
28000 63 6d 64 49 6e 66 6f 2e 6f 62 6a 50 72 6f 63 3d  cmdInfo.objProc=
28010 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =0 ){.    Tcl_Ap
28020 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
28030 70 2c 20 22 63 6f 6d 6d 61 6e 64 20 68 61 73 20  p, "command has 
28040 6e 6f 20 6f 62 6a 50 72 6f 63 3a 20 22 2c 0a 20  no objProc: ",. 
28050 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65            Tcl_Ge
28060 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
28070 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
28080 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
28090 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
280a0 63 6d 64 49 6e 66 6f 2e 6f 62 6a 50 72 6f 63 28  cmdInfo.objProc(
280b0 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e  cmdInfo.objClien
280c0 74 44 61 74 61 2c 20 69 6e 74 65 72 70 2c 20 6f  tData, interp, o
280d0 62 6a 63 2d 31 2c 20 6f 62 6a 76 2b 31 29 3b 0a  bjc-1, objv+1);.
280e0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
280f0 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f  E_OMIT_EXPLAIN./
28100 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 54 68  *.** WARNING: Th
28110 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63  e following func
28120 74 69 6f 6e 2c 20 70 72 69 6e 74 45 78 70 6c 61  tion, printExpla
28130 69 6e 51 75 65 72 79 50 6c 61 6e 28 29 20 69 73  inQueryPlan() is
28140 20 61 6e 20 65 78 61 63 74 0a 2a 2a 20 63 6f 70   an exact.** cop
28150 79 20 6f 66 20 65 78 61 6d 70 6c 65 20 63 6f 64  y of example cod
28160 65 20 66 72 6f 6d 20 65 71 70 2e 69 6e 20 28 65  e from eqp.in (e
28170 71 70 2e 68 74 6d 6c 29 2e 20 49 66 20 74 68 69  qp.html). If thi
28180 73 20 63 6f 64 65 20 69 73 20 6d 6f 64 69 66 69  s code is modifi
28190 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  ed,.** then the 
281a0 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 63 6f  documentation co
281b0 70 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6d  py needs to be m
281c0 6f 64 69 66 69 65 64 20 61 73 20 77 65 6c 6c 2e  odified as well.
281d0 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .*/./*.** Argume
281e0 6e 74 20 70 53 74 6d 74 20 69 73 20 61 20 70 72  nt pStmt is a pr
281f0 65 70 61 72 65 64 20 53 51 4c 20 73 74 61 74 65  epared SQL state
28200 6d 65 6e 74 2e 20 54 68 69 73 20 66 75 6e 63 74  ment. This funct
28210 69 6f 6e 20 63 6f 6d 70 69 6c 65 73 0a 2a 2a 20  ion compiles.** 
28220 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  an EXPLAIN QUERY
28230 20 50 4c 41 4e 20 63 6f 6d 6d 61 6e 64 20 74 6f   PLAN command to
28240 20 72 65 70 6f 72 74 20 6f 6e 20 74 68 65 20 70   report on the p
28250 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
28260 74 2c 0a 2a 2a 20 61 6e 64 20 70 72 69 6e 74 73  t,.** and prints
28270 20 74 68 65 20 72 65 70 6f 72 74 20 74 6f 20 73   the report to s
28280 74 64 6f 75 74 20 75 73 69 6e 67 20 70 72 69 6e  tdout using prin
28290 74 66 28 29 2e 0a 2a 2f 0a 69 6e 74 20 70 72 69  tf()..*/.int pri
282a0 6e 74 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c  ntExplainQueryPl
282b0 61 6e 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  an(sqlite3_stmt 
282c0 2a 70 53 74 6d 74 29 7b 0a 20 20 63 6f 6e 73 74  *pStmt){.  const
282d0 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20   char *zSql;    
282e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
282f0 70 75 74 20 53 51 4c 20 2a 2f 0a 20 20 63 68 61  put SQL */.  cha
28300 72 20 2a 7a 45 78 70 6c 61 69 6e 3b 20 20 20 20  r *zExplain;    
28310 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28320 53 51 4c 20 77 69 74 68 20 45 58 50 4c 41 49 4e  SQL with EXPLAIN
28330 20 51 55 45 52 59 20 50 4c 41 4e 20 70 72 65 70   QUERY PLAN prep
28340 65 6e 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  ended */.  sqlit
28350 65 33 5f 73 74 6d 74 20 2a 70 45 78 70 6c 61 69  e3_stmt *pExplai
28360 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  n;         /* Co
28370 6d 70 69 6c 65 64 20 45 58 50 4c 41 49 4e 20 51  mpiled EXPLAIN Q
28380 55 45 52 59 20 50 4c 41 4e 20 63 6f 6d 6d 61 6e  UERY PLAN comman
28390 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  d */.  int rc;  
283a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283b0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
283c0 20 63 6f 64 65 20 66 72 6f 6d 20 73 71 6c 69 74   code from sqlit
283d0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 20  e3_prepare_v2() 
283e0 2a 2f 0a 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c  */..  zSql = sql
283f0 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29 3b  ite3_sql(pStmt);
28400 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29  .  if( zSql==0 )
28410 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
28420 52 52 4f 52 3b 0a 0a 20 20 7a 45 78 70 6c 61 69  RROR;..  zExplai
28430 6e 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  n = sqlite3_mpri
28440 6e 74 66 28 22 45 58 50 4c 41 49 4e 20 51 55 45  ntf("EXPLAIN QUE
28450 52 59 20 50 4c 41 4e 20 25 73 22 2c 20 7a 53 71  RY PLAN %s", zSq
28460 6c 29 3b 0a 20 20 69 66 28 20 7a 45 78 70 6c 61  l);.  if( zExpla
28470 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  in==0 ) return S
28480 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20  QLITE_NOMEM;..  
28490 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
284a0 70 61 72 65 5f 76 32 28 73 71 6c 69 74 65 33 5f  pare_v2(sqlite3_
284b0 64 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74 29  db_handle(pStmt)
284c0 2c 20 7a 45 78 70 6c 61 69 6e 2c 20 2d 31 2c 20  , zExplain, -1, 
284d0 26 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20  &pExplain, 0);. 
284e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
284f0 78 70 6c 61 69 6e 29 3b 0a 20 20 69 66 28 20 72  xplain);.  if( r
28500 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
28510 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 77 68 69  eturn rc;..  whi
28520 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  le( SQLITE_ROW==
28530 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 45 78  sqlite3_step(pEx
28540 70 6c 61 69 6e 29 20 29 7b 0a 20 20 20 20 69 6e  plain) ){.    in
28550 74 20 69 53 65 6c 65 63 74 69 64 20 3d 20 73 71  t iSelectid = sq
28560 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
28570 28 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20  (pExplain, 0);. 
28580 20 20 20 69 6e 74 20 69 4f 72 64 65 72 20 3d 20     int iOrder = 
28590 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
285a0 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 31 29 3b  nt(pExplain, 1);
285b0 0a 20 20 20 20 69 6e 74 20 69 46 72 6f 6d 20 3d  .    int iFrom =
285c0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
285d0 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 32 29  int(pExplain, 2)
285e0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
285f0 20 2a 7a 44 65 74 61 69 6c 20 3d 20 28 63 6f 6e   *zDetail = (con
28600 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65  st char *)sqlite
28610 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 45  3_column_text(pE
28620 78 70 6c 61 69 6e 2c 20 33 29 3b 0a 0a 20 20 20  xplain, 3);..   
28630 20 70 72 69 6e 74 66 28 22 25 64 20 25 64 20 25   printf("%d %d %
28640 64 20 25 73 5c 6e 22 2c 20 69 53 65 6c 65 63 74  d %s\n", iSelect
28650 69 64 2c 20 69 4f 72 64 65 72 2c 20 69 46 72 6f  id, iOrder, iFro
28660 6d 2c 20 7a 44 65 74 61 69 6c 29 3b 0a 20 20 7d  m, zDetail);.  }
28670 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ..  return sqlit
28680 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78 70  e3_finalize(pExp
28690 6c 61 69 6e 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  lain);.}..static
286a0 20 69 6e 74 20 74 65 73 74 5f 70 72 69 6e 74 5f   int test_print_
286b0 65 71 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  eqp(.  void * cl
286c0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
286d0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
286e0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
286f0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
28700 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  v[].){.  int rc;
28710 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
28720 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f  *pStmt;..  if( o
28730 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
28740 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
28750 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
28760 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74  "STMT");.    ret
28770 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
28780 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74   }.  if( getStmt
28790 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
287a0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
287b0 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
287c0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
287d0 4f 52 3b 0a 20 20 72 63 20 3d 20 70 72 69 6e 74  OR;.  rc = print
287e0 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
287f0 28 70 53 74 6d 74 29 3b 0a 20 20 2f 2a 20 54 68  (pStmt);.  /* Th
28800 69 73 20 69 73 20 6e 65 65 64 65 64 20 6f 6e 20  is is needed on 
28810 57 69 6e 64 6f 77 73 20 73 6f 20 74 68 61 74 20  Windows so that 
28820 61 20 74 65 73 74 20 63 61 73 65 20 75 73 69 6e  a test case usin
28830 67 20 74 68 69 73 20 0a 20 20 2a 2a 20 66 75 6e  g this .  ** fun
28840 63 74 69 6f 6e 20 63 61 6e 20 6f 70 65 6e 20 61  ction can open a
28850 20 72 65 61 64 20 70 69 70 65 20 61 6e 64 20 67   read pipe and g
28860 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66  et the output of
28870 0a 20 20 2a 2a 20 70 72 69 6e 74 45 78 70 6c 61  .  ** printExpla
28880 69 6e 51 75 65 72 79 50 6c 61 6e 28 29 20 69 6d  inQueryPlan() im
28890 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a  mediately..  */.
288a0 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29    fflush(stdout)
288b0 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ;.  Tcl_SetResul
288c0 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
288d0 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
288e0 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  ), 0);.  return 
288f0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
28900 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
28910 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a 0a 2a  EXPLAIN */../*.*
28920 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  * sqlite3_test_c
28930 6f 6e 74 72 6f 6c 20 56 45 52 42 20 41 52 47 53  ontrol VERB ARGS
28940 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ....*/.static in
28950 74 20 74 65 73 74 5f 74 65 73 74 5f 63 6f 6e 74  t test_test_cont
28960 72 6f 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  rol(.  void * cl
28970 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
28980 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
28990 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
289a0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
289b0 76 5b 5d 0a 29 7b 0a 20 20 73 74 72 75 63 74 20  v[].){.  struct 
289c0 56 65 72 62 20 7b 0a 20 20 20 20 63 6f 6e 73 74  Verb {.    const
289d0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
289e0 20 20 69 6e 74 20 69 3b 0a 20 20 7d 20 61 56 65    int i;.  } aVe
289f0 72 62 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  rb[] = {.    { "
28a00 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
28a10 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 22  LOCALTIME_FAULT"
28a20 2c 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  , SQLITE_TESTCTR
28a30 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c  L_LOCALTIME_FAUL
28a40 54 20 7d 2c 20 0a 20 20 20 20 7b 20 22 53 51 4c  T }, .    { "SQL
28a50 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52  ITE_TESTCTRL_SOR
28a60 54 45 52 5f 4d 4d 41 50 22 2c 20 53 51 4c 49 54  TER_MMAP", SQLIT
28a70 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54 45  E_TESTCTRL_SORTE
28a80 52 5f 4d 4d 41 50 20 7d 2c 20 0a 20 20 7d 3b 0a  R_MMAP }, .  };.
28a90 20 20 69 6e 74 20 69 56 65 72 62 3b 0a 20 20 69    int iVerb;.  i
28aa0 6e 74 20 69 46 6c 61 67 3b 0a 20 20 69 6e 74 20  nt iFlag;.  int 
28ab0 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3c  rc;..  if( objc<
28ac0 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
28ad0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
28ae0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 56 45 52 42  , 1, objv, "VERB
28af0 20 41 52 47 53 2e 2e 2e 22 29 3b 0a 20 20 20 20   ARGS...");.    
28b00 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
28b10 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 54 63  ;.  }..  rc = Tc
28b20 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62  l_GetIndexFromOb
28b30 6a 53 74 72 75 63 74 28 0a 20 20 20 20 20 20 69  jStruct(.      i
28b40 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
28b50 61 56 65 72 62 2c 20 73 69 7a 65 6f 66 28 61 56  aVerb, sizeof(aV
28b60 65 72 62 5b 30 5d 29 2c 20 22 56 45 52 42 22 2c  erb[0]), "VERB",
28b70 20 30 2c 20 26 69 56 65 72 62 0a 20 20 29 3b 0a   0, &iVerb.  );.
28b80 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b    if( rc!=TCL_OK
28b90 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
28ba0 20 69 46 6c 61 67 20 3d 20 61 56 65 72 62 5b 69   iFlag = aVerb[i
28bb0 56 65 72 62 5d 2e 69 3b 0a 20 20 73 77 69 74 63  Verb].i;.  switc
28bc0 68 28 20 69 46 6c 61 67 20 29 7b 0a 20 20 20 20  h( iFlag ){.    
28bd0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
28be0 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46  CTRL_LOCALTIME_F
28bf0 41 55 4c 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e  AULT: {.      in
28c00 74 20 76 61 6c 3b 0a 20 20 20 20 20 20 69 66 28  t val;.      if(
28c10 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
28c20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
28c30 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
28c40 6f 62 6a 76 2c 20 22 4f 4e 4f 46 46 22 29 3b 0a  objv, "ONOFF");.
28c50 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
28c60 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
28c70 7d 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f  }.      if( Tcl_
28c80 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
28c90 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
28ca0 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75 72  ], &val) ) retur
28cb0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
28cc0 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
28cd0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
28ce0 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d  ESTCTRL_LOCALTIM
28cf0 45 5f 46 41 55 4c 54 2c 20 76 61 6c 29 3b 0a 20  E_FAULT, val);. 
28d00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
28d10 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  }..    case SQLI
28d20 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54  TE_TESTCTRL_SORT
28d30 45 52 5f 4d 4d 41 50 3a 20 7b 0a 20 20 20 20 20  ER_MMAP: {.     
28d40 20 69 6e 74 20 76 61 6c 3b 0a 20 20 20 20 20 20   int val;.      
28d50 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 20  sqlite3 *db;.   
28d60 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29     if( objc!=4 )
28d70 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72  {.        Tcl_Wr
28d80 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
28d90 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 2, objv, "DB 
28da0 4c 49 4d 49 54 22 29 3b 0a 20 20 20 20 20 20 20  LIMIT");.       
28db0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
28dc0 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
28dd0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
28de0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
28df0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
28e00 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
28e10 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
28e20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
28e30 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
28e40 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20  bjv[3], &val) ) 
28e50 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
28e60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
28e70 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
28e80 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52  ITE_TESTCTRL_SOR
28e90 54 45 52 5f 4d 4d 41 50 2c 20 64 62 2c 20 76 61  TER_MMAP, db, va
28ea0 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
28eb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 54 63  .    }.  }..  Tc
28ec0 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
28ed0 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  terp);.  return 
28ee0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53  TCL_OK;.}..#if S
28ef0 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 0a 23 69  QLITE_OS_UNIX.#i
28f00 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65  nclude <sys/time
28f10 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
28f20 73 2f 72 65 73 6f 75 72 63 65 2e 68 3e 0a 0a 73  s/resource.h>..s
28f30 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 67  tatic int test_g
28f40 65 74 72 75 73 61 67 65 28 0a 20 20 76 6f 69 64  etrusage(.  void
28f50 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
28f60 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
28f70 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
28f80 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
28f90 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 68  T objv[].){.  ch
28fa0 61 72 20 62 75 66 5b 31 30 32 34 5d 3b 0a 20 20  ar buf[1024];.  
28fb0 73 74 72 75 63 74 20 72 75 73 61 67 65 20 72 3b  struct rusage r;
28fc0 0a 20 20 6d 65 6d 73 65 74 28 26 72 2c 20 30 2c  .  memset(&r, 0,
28fd0 20 73 69 7a 65 6f 66 28 72 29 29 3b 0a 20 20 67   sizeof(r));.  g
28fe0 65 74 72 75 73 61 67 65 28 52 55 53 41 47 45 5f  etrusage(RUSAGE_
28ff0 53 45 4c 46 2c 20 26 72 29 3b 0a 0a 20 20 73 70  SELF, &r);..  sp
29000 72 69 6e 74 66 28 62 75 66 2c 20 22 72 75 5f 75  rintf(buf, "ru_u
29010 74 69 6d 65 3d 25 64 2e 25 30 36 64 20 72 75 5f  time=%d.%06d ru_
29020 73 74 69 6d 65 3d 25 64 2e 25 30 36 64 20 72 75  stime=%d.%06d ru
29030 5f 6d 69 6e 66 6c 74 3d 25 64 20 72 75 5f 6d 61  _minflt=%d ru_ma
29040 6a 66 6c 74 3d 25 64 22 2c 20 0a 20 20 20 20 28  jflt=%d", .    (
29050 69 6e 74 29 72 2e 72 75 5f 75 74 69 6d 65 2e 74  int)r.ru_utime.t
29060 76 5f 73 65 63 2c 20 28 69 6e 74 29 72 2e 72 75  v_sec, (int)r.ru
29070 5f 75 74 69 6d 65 2e 74 76 5f 75 73 65 63 2c 20  _utime.tv_usec, 
29080 0a 20 20 20 20 28 69 6e 74 29 72 2e 72 75 5f 73  .    (int)r.ru_s
29090 74 69 6d 65 2e 74 76 5f 73 65 63 2c 20 28 69 6e  time.tv_sec, (in
290a0 74 29 72 2e 72 75 5f 73 74 69 6d 65 2e 74 76 5f  t)r.ru_stime.tv_
290b0 75 73 65 63 2c 20 0a 20 20 20 20 28 69 6e 74 29  usec, .    (int)
290c0 72 2e 72 75 5f 6d 69 6e 66 6c 74 2c 20 28 69 6e  r.ru_minflt, (in
290d0 74 29 72 2e 72 75 5f 6d 61 6a 66 6c 74 0a 20 20  t)r.ru_majflt.  
290e0 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
290f0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
29100 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 62  l_NewStringObj(b
29110 75 66 2c 20 2d 31 29 29 3b 0a 20 20 72 65 74 75  uf, -1));.  retu
29120 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e  rn TCL_OK;.}.#en
29130 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  dif..#if SQLITE_
29140 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20 49 6e 66  OS_WIN./*.** Inf
29150 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73 65 64 20  ormation passed 
29160 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 74 68  from the main th
29170 72 65 61 64 20 69 6e 74 6f 20 74 68 65 20 77 69  read into the wi
29180 6e 64 6f 77 73 20 66 69 6c 65 20 6c 6f 63 6b 65  ndows file locke
29190 72 0a 2a 2a 20 62 61 63 6b 67 72 6f 75 6e 64 20  r.** background 
291a0 74 68 72 65 61 64 2e 0a 2a 2f 0a 73 74 72 75 63  thread..*/.struc
291b0 74 20 77 69 6e 33 32 46 69 6c 65 4c 6f 63 6b 65  t win32FileLocke
291c0 72 20 7b 0a 20 20 63 68 61 72 20 2a 65 76 4e 61  r {.  char *evNa
291d0 6d 65 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  me;       /* Nam
291e0 65 20 6f 66 20 65 76 65 6e 74 20 74 6f 20 73 69  e of event to si
291f0 67 6e 61 6c 20 74 68 72 65 61 64 20 73 74 61 72  gnal thread star
29200 74 75 70 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20  tup */.  HANDLE 
29210 68 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  h;           /* 
29220 48 61 6e 64 6c 65 20 6f 66 20 74 68 65 20 66 69  Handle of the fi
29230 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
29240 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 61 79 31 3b  */.  int delay1;
29250 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 61           /* Dela
29260 79 20 62 65 66 6f 72 65 20 6c 6f 63 6b 69 6e 67  y before locking
29270 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 61 79 32   */.  int delay2
29280 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c  ;         /* Del
29290 61 79 20 62 65 66 6f 72 65 20 75 6e 6c 6f 63 6b  ay before unlock
292a0 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6f 6b 3b  ing */.  int ok;
292b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
292c0 46 69 6e 69 73 68 65 64 20 6f 6b 20 2a 2f 0a 20  Finished ok */. 
292d0 20 69 6e 74 20 65 72 72 3b 20 20 20 20 20 20 20   int err;       
292e0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
292f0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
29300 2a 2f 0a 7d 3b 0a 23 65 6e 64 69 66 0a 0a 0a 23  */.};.#endif...#
29310 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
29320 0a 23 69 6e 63 6c 75 64 65 20 3c 70 72 6f 63 65  .#include <proce
29330 73 73 2e 68 3e 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ss.h>./*.** The 
29340 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72 65 61  background threa
29350 64 20 74 68 61 74 20 64 6f 65 73 20 66 69 6c 65  d that does file
29360 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61   locking..*/.sta
29370 74 69 63 20 76 6f 69 64 20 77 69 6e 33 32 5f 66  tic void win32_f
29380 69 6c 65 5f 6c 6f 63 6b 65 72 28 76 6f 69 64 20  ile_locker(void 
29390 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20 73 74  *pAppData){.  st
293a0 72 75 63 74 20 77 69 6e 33 32 46 69 6c 65 4c 6f  ruct win32FileLo
293b0 63 6b 65 72 20 2a 70 20 3d 20 28 73 74 72 75 63  cker *p = (struc
293c0 74 20 77 69 6e 33 32 46 69 6c 65 4c 6f 63 6b 65  t win32FileLocke
293d0 72 2a 29 70 41 70 70 44 61 74 61 3b 0a 20 20 69  r*)pAppData;.  i
293e0 66 28 20 70 2d 3e 65 76 4e 61 6d 65 20 29 7b 0a  f( p->evName ){.
293f0 20 20 20 20 48 41 4e 44 4c 45 20 65 76 20 3d 20      HANDLE ev = 
29400 4f 70 65 6e 45 76 65 6e 74 28 45 56 45 4e 54 5f  OpenEvent(EVENT_
29410 4d 4f 44 49 46 59 5f 53 54 41 54 45 2c 20 46 41  MODIFY_STATE, FA
29420 4c 53 45 2c 20 70 2d 3e 65 76 4e 61 6d 65 29 3b  LSE, p->evName);
29430 0a 20 20 20 20 69 66 20 28 20 65 76 20 29 7b 0a  .    if ( ev ){.
29440 20 20 20 20 20 20 53 65 74 45 76 65 6e 74 28 65        SetEvent(e
29450 76 29 3b 0a 20 20 20 20 20 20 43 6c 6f 73 65 48  v);.      CloseH
29460 61 6e 64 6c 65 28 65 76 29 3b 0a 20 20 20 20 7d  andle(ev);.    }
29470 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 64 65  .  }.  if( p->de
29480 6c 61 79 31 20 29 20 53 6c 65 65 70 28 70 2d 3e  lay1 ) Sleep(p->
29490 64 65 6c 61 79 31 29 3b 0a 20 20 69 66 28 20 4c  delay1);.  if( L
294a0 6f 63 6b 46 69 6c 65 28 70 2d 3e 68 2c 20 30 2c  ockFile(p->h, 0,
294b0 20 30 2c 20 31 30 30 30 30 30 30 30 30 2c 20 30   0, 100000000, 0
294c0 29 20 29 7b 0a 20 20 20 20 53 6c 65 65 70 28 70  ) ){.    Sleep(p
294d0 2d 3e 64 65 6c 61 79 32 29 3b 0a 20 20 20 20 55  ->delay2);.    U
294e0 6e 6c 6f 63 6b 46 69 6c 65 28 70 2d 3e 68 2c 20  nlockFile(p->h, 
294f0 30 2c 20 30 2c 20 31 30 30 30 30 30 30 30 30 2c  0, 0, 100000000,
29500 20 30 29 3b 0a 20 20 20 20 70 2d 3e 6f 6b 20 3d   0);.    p->ok =
29510 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
29520 20 70 2d 3e 65 72 72 20 3d 20 31 3b 0a 20 20 7d   p->err = 1;.  }
29530 0a 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70  .  CloseHandle(p
29540 2d 3e 68 29 3b 0a 20 20 70 2d 3e 68 20 3d 20 30  ->h);.  p->h = 0
29550 3b 0a 20 20 70 2d 3e 64 65 6c 61 79 31 20 3d 20  ;.  p->delay1 = 
29560 30 3b 0a 20 20 70 2d 3e 64 65 6c 61 79 32 20 3d  0;.  p->delay2 =
29570 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69   0;.}.#endif..#i
29580 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a  f SQLITE_OS_WIN.
29590 2f 2a 0a 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 5f  /*.**      lock_
295a0 77 69 6e 33 32 5f 66 69 6c 65 20 46 49 4c 45 4e  win32_file FILEN
295b0 41 4d 45 20 44 45 4c 41 59 31 20 44 45 4c 41 59  AME DELAY1 DELAY
295c0 32 0a 2a 2a 0a 2a 2a 20 47 65 74 20 61 6e 20 65  2.**.** Get an e
295d0 78 63 6c 75 73 69 76 65 20 6d 61 6e 64 69 74 6f  xclusive mandito
295e0 72 79 20 6c 6f 63 6b 20 6f 6e 20 66 69 6c 65 20  ry lock on file 
295f0 66 6f 72 20 44 45 4c 41 59 32 20 6d 69 6c 6c 69  for DELAY2 milli
29600 73 65 63 6f 6e 64 73 2e 0a 2a 2a 20 57 61 69 74  seconds..** Wait
29610 20 44 45 4c 41 59 31 20 6d 69 6c 6c 69 73 65 63   DELAY1 millisec
29620 6f 6e 64 73 20 62 65 66 6f 72 65 20 61 63 71 75  onds before acqu
29630 69 72 69 6e 67 20 74 68 65 20 6c 6f 63 6b 2e 0a  iring the lock..
29640 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
29650 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b 28 0a 20  n32_file_lock(. 
29660 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
29670 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
29680 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
29690 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
296a0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
296b0 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74  .  static struct
296c0 20 77 69 6e 33 32 46 69 6c 65 4c 6f 63 6b 65 72   win32FileLocker
296d0 20 78 20 3d 20 7b 20 22 77 69 6e 33 32 5f 66 69   x = { "win32_fi
296e0 6c 65 5f 6c 6f 63 6b 22 2c 20 30 2c 20 30 2c 20  le_lock", 0, 0, 
296f0 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 63 6f 6e  0, 0, 0 };.  con
29700 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
29710 6d 65 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b  me;.  char zBuf[
29720 32 30 30 5d 3b 0a 20 20 69 6e 74 20 72 65 74 72  200];.  int retr
29730 79 20 3d 20 30 3b 0a 20 20 48 41 4e 44 4c 45 20  y = 0;.  HANDLE 
29740 65 76 3b 0a 20 20 44 57 4f 52 44 20 77 52 65 73  ev;.  DWORD wRes
29750 75 6c 74 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62  ult;.  .  if( ob
29760 6a 63 21 3d 34 20 26 26 20 6f 62 6a 63 21 3d 31  jc!=4 && objc!=1
29770 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
29780 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
29790 20 31 2c 20 6f 62 6a 76 2c 20 22 46 49 4c 45 4e   1, objv, "FILEN
297a0 41 4d 45 20 44 45 4c 41 59 31 20 44 45 4c 41 59  AME DELAY1 DELAY
297b0 32 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  2");.    return 
297c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
297d0 20 69 66 28 20 6f 62 6a 63 3d 3d 31 20 29 7b 0a   if( objc==1 ){.
297e0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
297f0 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
29800 29 2c 20 7a 42 75 66 2c 20 22 25 64 20 25 64 20  ), zBuf, "%d %d 
29810 25 64 20 25 64 20 25 64 22 2c 0a 20 20 20 20 20  %d %d %d",.     
29820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29830 78 2e 6f 6b 2c 20 78 2e 65 72 72 2c 20 78 2e 64  x.ok, x.err, x.d
29840 65 6c 61 79 31 2c 20 78 2e 64 65 6c 61 79 32 2c  elay1, x.delay2,
29850 20 78 2e 68 29 3b 0a 20 20 20 20 54 63 6c 5f 41   x.h);.    Tcl_A
29860 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
29870 72 70 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a  rp, zBuf, (char*
29880 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )0);.    return 
29890 54 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 77 68  TCL_OK;.  }.  wh
298a0 69 6c 65 28 20 78 2e 68 20 26 26 20 72 65 74 72  ile( x.h && retr
298b0 79 3c 33 30 20 29 7b 0a 20 20 20 20 72 65 74 72  y<30 ){.    retr
298c0 79 2b 2b 3b 0a 20 20 20 20 53 6c 65 65 70 28 31  y++;.    Sleep(1
298d0 30 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78  00);.  }.  if( x
298e0 2e 68 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  .h ){.    Tcl_Ap
298f0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
29900 70 2c 20 22 62 75 73 79 22 2c 20 28 63 68 61 72  p, "busy", (char
29910 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  *)0);.    return
29920 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
29930 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
29940 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
29950 6f 62 6a 76 5b 32 5d 2c 20 26 78 2e 64 65 6c 61  objv[2], &x.dela
29960 79 31 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  y1) ) return TCL
29970 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
29980 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
29990 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
299a0 20 26 78 2e 64 65 6c 61 79 32 29 20 29 20 72 65   &x.delay2) ) re
299b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
299c0 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 54 63    zFilename = Tc
299d0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
299e0 5b 31 5d 29 3b 0a 20 20 78 2e 68 20 3d 20 43 72  [1]);.  x.h = Cr
299f0 65 61 74 65 46 69 6c 65 28 7a 46 69 6c 65 6e 61  eateFile(zFilena
29a00 6d 65 2c 20 47 45 4e 45 52 49 43 5f 52 45 41 44  me, GENERIC_READ
29a10 7c 47 45 4e 45 52 49 43 5f 57 52 49 54 45 2c 0a  |GENERIC_WRITE,.
29a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46 49                FI
29a30 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 7c 46 49  LE_SHARE_READ|FI
29a40 4c 45 5f 53 48 41 52 45 5f 57 52 49 54 45 2c 20  LE_SHARE_WRITE, 
29a50 30 2c 20 4f 50 45 4e 5f 41 4c 57 41 59 53 2c 0a  0, OPEN_ALWAYS,.
29a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46 49                FI
29a70 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52  LE_ATTRIBUTE_NOR
29a80 4d 41 4c 2c 20 30 29 3b 0a 20 20 69 66 28 20 21  MAL, 0);.  if( !
29a90 78 2e 68 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  x.h ){.    Tcl_A
29aa0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
29ab0 72 70 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e  rp, "cannot open
29ac0 20 66 69 6c 65 3a 20 22 2c 20 7a 46 69 6c 65 6e   file: ", zFilen
29ad0 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ame, (char*)0);.
29ae0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
29af0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 65 76 20 3d  RROR;.  }.  ev =
29b00 20 43 72 65 61 74 65 45 76 65 6e 74 28 4e 55 4c   CreateEvent(NUL
29b10 4c 2c 20 54 52 55 45 2c 20 46 41 4c 53 45 2c 20  L, TRUE, FALSE, 
29b20 78 2e 65 76 4e 61 6d 65 29 3b 0a 20 20 69 66 20  x.evName);.  if 
29b30 28 20 21 65 76 20 29 7b 0a 20 20 20 20 54 63 6c  ( !ev ){.    Tcl
29b40 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
29b50 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 63 72  terp, "cannot cr
29b60 65 61 74 65 20 65 76 65 6e 74 3a 20 22 2c 20 78  eate event: ", x
29b70 2e 65 76 4e 61 6d 65 2c 20 28 63 68 61 72 2a 29  .evName, (char*)
29b80 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
29b90 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
29ba0 5f 62 65 67 69 6e 74 68 72 65 61 64 28 77 69 6e  _beginthread(win
29bb0 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b 65 72 2c 20  32_file_locker, 
29bc0 30 2c 20 28 76 6f 69 64 2a 29 26 78 29 3b 0a 20  0, (void*)&x);. 
29bd0 20 53 6c 65 65 70 28 30 29 3b 0a 20 20 69 66 20   Sleep(0);.  if 
29be0 28 20 28 77 52 65 73 75 6c 74 20 3d 20 57 61 69  ( (wResult = Wai
29bf0 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
29c00 28 65 76 2c 20 31 30 30 30 30 29 29 21 3d 57 41  (ev, 10000))!=WA
29c10 49 54 5f 4f 42 4a 45 43 54 5f 30 20 29 7b 0a 20  IT_OBJECT_0 ){. 
29c20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
29c30 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29  ntf(sizeof(zBuf)
29c40 2c 20 7a 42 75 66 2c 20 22 30 78 25 78 22 2c 20  , zBuf, "0x%x", 
29c50 77 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 54 63  wResult);.    Tc
29c60 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
29c70 6e 74 65 72 70 2c 20 22 77 61 69 74 20 66 61 69  nterp, "wait fai
29c80 6c 65 64 3a 20 22 2c 20 7a 42 75 66 2c 20 28 63  led: ", zBuf, (c
29c90 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 43 6c 6f  har*)0);.    Clo
29ca0 73 65 48 61 6e 64 6c 65 28 65 76 29 3b 0a 20 20  seHandle(ev);.  
29cb0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
29cc0 4f 52 3b 0a 20 20 7d 0a 20 20 43 6c 6f 73 65 48  OR;.  }.  CloseH
29cd0 61 6e 64 6c 65 28 65 76 29 3b 0a 20 20 72 65 74  andle(ev);.  ret
29ce0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
29cf0 2a 0a 2a 2a 20 20 20 20 20 20 65 78 69 73 74 73  *.**      exists
29d00 5f 77 69 6e 33 32 5f 70 61 74 68 20 50 41 54 48  _win32_path PATH
29d10 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e  .**.** Returns n
29d20 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73  on-zero if the s
29d30 70 65 63 69 66 69 65 64 20 70 61 74 68 20 65 78  pecified path ex
29d40 69 73 74 73 2c 20 77 68 6f 73 65 20 66 75 6c 6c  ists, whose full
29d50 79 20 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  y qualified name
29d60 0a 2a 2a 20 6d 61 79 20 65 78 63 65 65 64 20 32  .** may exceed 2
29d70 36 30 20 63 68 61 72 61 63 74 65 72 73 20 69 66  60 characters if
29d80 20 69 74 20 69 73 20 70 72 65 66 69 78 65 64 20   it is prefixed 
29d90 77 69 74 68 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a  with "\\?\"..*/.
29da0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32  static int win32
29db0 5f 65 78 69 73 74 73 5f 70 61 74 68 28 0a 20 20  _exists_path(.  
29dc0 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61  void *clientData
29dd0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
29de0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
29df0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
29e00 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
29e10 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
29e20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
29e30 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
29e40 6f 62 6a 76 2c 20 22 50 41 54 48 22 29 3b 0a 20  objv, "PATH");. 
29e50 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
29e60 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53  ROR;.  }.  Tcl_S
29e70 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
29e80 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65  rp, Tcl_NewBoole
29e90 61 6e 4f 62 6a 28 0a 20 20 20 20 20 20 47 65 74  anObj(.      Get
29ea0 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 28  FileAttributesW(
29eb0 20 54 63 6c 5f 47 65 74 55 6e 69 63 6f 64 65 28   Tcl_GetUnicode(
29ec0 6f 62 6a 76 5b 31 5d 29 29 21 3d 49 4e 56 41 4c  objv[1]))!=INVAL
29ed0 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
29ee0 45 53 20 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ES ));.  return 
29ef0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
29f00 20 20 20 20 20 20 66 69 6e 64 5f 77 69 6e 33 32        find_win32
29f10 5f 66 69 6c 65 20 50 41 54 54 45 52 4e 0a 2a 2a  _file PATTERN.**
29f20 0a 2a 2a 20 52 65 74 75 72 6e 73 20 61 20 6c 69  .** Returns a li
29f30 73 74 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  st of entries in
29f40 20 61 20 64 69 72 65 63 74 6f 72 79 20 74 68 61   a directory tha
29f50 74 20 6d 61 74 63 68 20 74 68 65 20 73 70 65 63  t match the spec
29f60 69 66 69 65 64 20 70 61 74 74 65 72 6e 2c 0a 2a  ified pattern,.*
29f70 2a 20 77 68 6f 73 65 20 66 75 6c 6c 79 20 71 75  * whose fully qu
29f80 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6d 61 79  alified name may
29f90 20 65 78 63 65 65 64 20 32 34 38 20 63 68 61 72   exceed 248 char
29fa0 61 63 74 65 72 73 20 69 66 20 69 74 20 69 73 20  acters if it is 
29fb0 70 72 65 66 69 78 65 64 20 77 69 74 68 0a 2a 2a  prefixed with.**
29fc0 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74   "\\?\"..*/.stat
29fd0 69 63 20 69 6e 74 20 77 69 6e 33 32 5f 66 69 6e  ic int win32_fin
29fe0 64 5f 66 69 6c 65 28 0a 20 20 76 6f 69 64 20 2a  d_file(.  void *
29ff0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
2a000 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2a010 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
2a020 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
2a030 62 6a 76 5b 5d 0a 29 7b 0a 20 20 48 41 4e 44 4c  bjv[].){.  HANDL
2a040 45 20 68 46 69 6e 64 46 69 6c 65 20 3d 20 49 4e  E hFindFile = IN
2a050 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
2a060 55 45 3b 0a 20 20 57 49 4e 33 32 5f 46 49 4e 44  UE;.  WIN32_FIND
2a070 5f 44 41 54 41 57 20 66 69 6e 64 44 61 74 61 3b  _DATAW findData;
2a080 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74  .  Tcl_Obj *list
2a090 4f 62 6a 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  Obj;.  DWORD las
2a0a0 74 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 62  tErrno;.  if( ob
2a0b0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
2a0c0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
2a0d0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
2a0e0 50 41 54 54 45 52 4e 22 29 3b 0a 20 20 20 20 72  PATTERN");.    r
2a0f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2a100 0a 20 20 7d 0a 20 20 68 46 69 6e 64 46 69 6c 65  .  }.  hFindFile
2a110 20 3d 20 46 69 6e 64 46 69 72 73 74 46 69 6c 65   = FindFirstFile
2a120 57 28 54 63 6c 5f 47 65 74 55 6e 69 63 6f 64 65  W(Tcl_GetUnicode
2a130 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 66 69 6e 64  (objv[1]), &find
2a140 44 61 74 61 29 3b 0a 20 20 69 66 28 20 68 46 69  Data);.  if( hFi
2a150 6e 64 46 69 6c 65 3d 3d 49 4e 56 41 4c 49 44 5f  ndFile==INVALID_
2a160 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a  HANDLE_VALUE ){.
2a170 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
2a180 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
2a190 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 47  _NewWideIntObj(G
2a1a0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 29 3b  etLastError()));
2a1b0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2a1c0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6c 69 73  ERROR;.  }.  lis
2a1d0 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f 62  tObj = Tcl_NewOb
2a1e0 6a 28 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52  j();.  Tcl_IncrR
2a1f0 65 66 43 6f 75 6e 74 28 6c 69 73 74 4f 62 6a 29  efCount(listObj)
2a200 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 54 63 6c  ;.  do {.    Tcl
2a210 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2a220 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69  ement(interp, li
2a230 73 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 55 6e  stObj, Tcl_NewUn
2a240 69 63 6f 64 65 4f 62 6a 28 0a 20 20 20 20 20 20  icodeObj(.      
2a250 20 20 66 69 6e 64 44 61 74 61 2e 63 46 69 6c 65    findData.cFile
2a260 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20  Name, -1));.    
2a270 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2a280 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2a290 20 6c 69 73 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65   listObj, Tcl_Ne
2a2a0 77 57 69 64 65 49 6e 74 4f 62 6a 28 0a 20 20 20  wWideIntObj(.   
2a2b0 20 20 20 20 20 66 69 6e 64 44 61 74 61 2e 64 77       findData.dw
2a2c0 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 29 29  FileAttributes))
2a2d0 3b 0a 20 20 7d 20 77 68 69 6c 65 28 20 46 69 6e  ;.  } while( Fin
2a2e0 64 4e 65 78 74 46 69 6c 65 57 28 68 46 69 6e 64  dNextFileW(hFind
2a2f0 46 69 6c 65 2c 20 26 66 69 6e 64 44 61 74 61 29  File, &findData)
2a300 20 29 3b 0a 20 20 6c 61 73 74 45 72 72 6e 6f 20   );.  lastErrno 
2a310 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  = GetLastError()
2a320 3b 0a 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e  ;.  if( lastErrn
2a330 6f 21 3d 4e 4f 5f 45 52 52 4f 52 20 26 26 20 6c  o!=NO_ERROR && l
2a340 61 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f  astErrno!=ERROR_
2a350 4e 4f 5f 4d 4f 52 45 5f 46 49 4c 45 53 20 29 7b  NO_MORE_FILES ){
2a360 0a 20 20 20 20 46 69 6e 64 43 6c 6f 73 65 28 68  .    FindClose(h
2a370 46 69 6e 64 46 69 6c 65 29 3b 0a 20 20 20 20 54  FindFile);.    T
2a380 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
2a390 6c 69 73 74 4f 62 6a 29 3b 0a 20 20 20 20 54 63  listObj);.    Tc
2a3a0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
2a3b0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69  nterp, Tcl_NewWi
2a3c0 64 65 49 6e 74 4f 62 6a 28 47 65 74 4c 61 73 74  deIntObj(GetLast
2a3d0 45 72 72 6f 72 28 29 29 29 3b 0a 20 20 20 20 72  Error()));.    r
2a3e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2a3f0 0a 20 20 7d 0a 20 20 46 69 6e 64 43 6c 6f 73 65  .  }.  FindClose
2a400 28 68 46 69 6e 64 46 69 6c 65 29 3b 0a 20 20 54  (hFindFile);.  T
2a410 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
2a420 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 29  interp, listObj)
2a430 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
2a440 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20  K;.}../*.**     
2a450 20 64 65 6c 65 74 65 5f 77 69 6e 33 32 5f 66 69   delete_win32_fi
2a460 6c 65 20 46 49 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a  le FILENAME.**.*
2a470 2a 20 44 65 6c 65 74 65 73 20 74 68 65 20 73 70  * Deletes the sp
2a480 65 63 69 66 69 65 64 20 66 69 6c 65 2c 20 77 68  ecified file, wh
2a490 6f 73 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  ose fully qualif
2a4a0 69 65 64 20 6e 61 6d 65 20 6d 61 79 20 65 78 63  ied name may exc
2a4b0 65 65 64 20 32 36 30 0a 2a 2a 20 63 68 61 72 61  eed 260.** chara
2a4c0 63 74 65 72 73 20 69 66 20 69 74 20 69 73 20 70  cters if it is p
2a4d0 72 65 66 69 78 65 64 20 77 69 74 68 20 22 5c 5c  refixed with "\\
2a4e0 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ?\"..*/.static i
2a4f0 6e 74 20 77 69 6e 33 32 5f 64 65 6c 65 74 65 5f  nt win32_delete_
2a500 66 69 6c 65 28 0a 20 20 76 6f 69 64 20 2a 63 6c  file(.  void *cl
2a510 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
2a520 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
2a530 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
2a540 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
2a550 76 5b 5d 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a  v[].){.  if( obj
2a560 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
2a570 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
2a580 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 46  erp, 1, objv, "F
2a590 49 4c 45 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72  ILENAME");.    r
2a5a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2a5b0 0a 20 20 7d 0a 20 20 69 66 28 20 21 44 65 6c 65  .  }.  if( !Dele
2a5c0 74 65 46 69 6c 65 57 28 54 63 6c 5f 47 65 74 55  teFileW(Tcl_GetU
2a5d0 6e 69 63 6f 64 65 28 6f 62 6a 76 5b 31 5d 29 29  nicode(objv[1]))
2a5e0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f   ){.    Tcl_SetO
2a5f0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
2a600 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
2a610 62 6a 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28  bj(GetLastError(
2a620 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )));.    return 
2a630 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2a640 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
2a650 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65 74 75  (interp);.  retu
2a660 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
2a670 0a 2a 2a 20 20 20 20 20 20 6d 61 6b 65 5f 77 69  .**      make_wi
2a680 6e 33 32 5f 64 69 72 20 44 49 52 45 43 54 4f 52  n32_dir DIRECTOR
2a690 59 0a 2a 2a 0a 2a 2a 20 43 72 65 61 74 65 73 20  Y.**.** Creates 
2a6a0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 64 69  the specified di
2a6b0 72 65 63 74 6f 72 79 2c 20 77 68 6f 73 65 20 66  rectory, whose f
2a6c0 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 6e  ully qualified n
2a6d0 61 6d 65 20 6d 61 79 20 65 78 63 65 65 64 20 32  ame may exceed 2
2a6e0 34 38 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73  48.** characters
2a6f0 20 69 66 20 69 74 20 69 73 20 70 72 65 66 69 78   if it is prefix
2a700 65 64 20 77 69 74 68 20 22 5c 5c 3f 5c 22 2e 0a  ed with "\\?\"..
2a710 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
2a720 6e 33 32 5f 6d 6b 64 69 72 28 0a 20 20 76 6f 69  n32_mkdir(.  voi
2a730 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20  d *clientData,. 
2a740 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
2a750 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
2a760 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
2a770 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66  T objv[].){.  if
2a780 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
2a790 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
2a7a0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
2a7b0 76 2c 20 22 44 49 52 45 43 54 4f 52 59 22 29 3b  v, "DIRECTORY");
2a7c0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2a7d0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
2a7e0 20 21 43 72 65 61 74 65 44 69 72 65 63 74 6f 72   !CreateDirector
2a7f0 79 57 28 54 63 6c 5f 47 65 74 55 6e 69 63 6f 64  yW(Tcl_GetUnicod
2a800 65 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c  e(objv[1]), NULL
2a810 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  ) ){.    Tcl_Set
2a820 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
2a830 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
2a840 4f 62 6a 28 47 65 74 4c 61 73 74 45 72 72 6f 72  Obj(GetLastError
2a850 28 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ()));.    return
2a860 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2a870 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
2a880 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65 74  t(interp);.  ret
2a890 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
2a8a0 2a 0a 2a 2a 20 20 20 20 20 20 72 65 6d 6f 76 65  *.**      remove
2a8b0 5f 77 69 6e 33 32 5f 64 69 72 20 44 49 52 45 43  _win32_dir DIREC
2a8c0 54 4f 52 59 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76  TORY.**.** Remov
2a8d0 65 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64  es the specified
2a8e0 20 64 69 72 65 63 74 6f 72 79 2c 20 77 68 6f 73   directory, whos
2a8f0 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  e fully qualifie
2a900 64 20 6e 61 6d 65 20 6d 61 79 20 65 78 63 65 65  d name may excee
2a910 64 20 32 34 38 0a 2a 2a 20 63 68 61 72 61 63 74  d 248.** charact
2a920 65 72 73 20 69 66 20 69 74 20 69 73 20 70 72 65  ers if it is pre
2a930 66 69 78 65 64 20 77 69 74 68 20 22 5c 5c 3f 5c  fixed with "\\?\
2a940 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  "..*/.static int
2a950 20 77 69 6e 33 32 5f 72 6d 64 69 72 28 0a 20 20   win32_rmdir(.  
2a960 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61  void *clientData
2a970 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
2a980 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
2a990 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
2a9a0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
2a9b0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
2a9c0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
2a9d0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
2a9e0 6f 62 6a 76 2c 20 22 44 49 52 45 43 54 4f 52 59  objv, "DIRECTORY
2a9f0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
2aa00 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2aa10 69 66 28 20 21 52 65 6d 6f 76 65 44 69 72 65 63  if( !RemoveDirec
2aa20 74 6f 72 79 57 28 54 63 6c 5f 47 65 74 55 6e 69  toryW(Tcl_GetUni
2aa30 63 6f 64 65 28 6f 62 6a 76 5b 31 5d 29 29 20 29  code(objv[1])) )
2aa40 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  {.    Tcl_SetObj
2aa50 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
2aa60 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
2aa70 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29  (GetLastError())
2aa80 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2aa90 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54  L_ERROR;.  }.  T
2aaa0 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
2aab0 6e 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e  nterp);.  return
2aac0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69   TCL_OK;.}.#endi
2aad0 66 0a 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 6f  f.../*.**      o
2aae0 70 74 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74  ptimization_cont
2aaf0 72 6f 6c 20 44 42 20 4f 50 54 20 42 4f 4f 4c 45  rol DB OPT BOOLE
2ab00 41 4e 0a 2a 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20  AN.**.** Enable 
2ab10 6f 72 20 64 69 73 61 62 6c 65 20 71 75 65 72 79  or disable query
2ab20 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 75   optimizations u
2ab30 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  sing the sqlite3
2ab40 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 29 0a  _test_control().
2ab50 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 20 20 44  ** interface.  D
2ab60 69 73 61 62 6c 65 20 69 66 20 42 4f 4f 4c 45 41  isable if BOOLEA
2ab70 4e 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20 65  N is false and e
2ab80 6e 61 62 6c 65 20 69 66 20 42 4f 4f 4c 45 41 4e  nable if BOOLEAN
2ab90 20 69 73 20 74 72 75 65 2e 0a 2a 2a 20 4f 50 54   is true..** OPT
2aba0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
2abb0 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
2abc0 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64 2e   to be disabled.
2abd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
2abe0 70 74 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74  ptimization_cont
2abf0 72 6f 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  rol(.  void * cl
2ac00 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
2ac10 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
2ac20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
2ac30 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
2ac40 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  v[].){.  int i;.
2ac50 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
2ac60 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
2ac70 74 3b 0a 20 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a  t;.  int onoff;.
2ac80 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a    int mask = 0;.
2ac90 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
2aca0 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73  truct {.    cons
2acb0 74 20 63 68 61 72 20 2a 7a 4f 70 74 4e 61 6d 65  t char *zOptName
2acc0 3b 0a 20 20 20 20 69 6e 74 20 6d 61 73 6b 3b 0a  ;.    int mask;.
2acd0 20 20 7d 20 61 4f 70 74 5b 5d 20 3d 20 7b 0a 20    } aOpt[] = {. 
2ace0 20 20 20 7b 20 22 61 6c 6c 22 2c 20 20 20 20 20     { "all",     
2acf0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
2ad00 54 45 5f 41 6c 6c 4f 70 74 73 20 20 20 20 20 20  TE_AllOpts      
2ad10 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6e 6f 6e 65    },.    { "none
2ad20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2ad30 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
2ad40 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
2ad50 20 22 71 75 65 72 79 2d 66 6c 61 74 74 65 6e 65   "query-flattene
2ad60 72 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 51  r",     SQLITE_Q
2ad70 75 65 72 79 46 6c 61 74 74 65 6e 65 72 20 7d 2c  ueryFlattener },
2ad80 0a 20 20 20 20 7b 20 22 63 6f 6c 75 6d 6e 2d 63  .    { "column-c
2ad90 61 63 68 65 22 2c 20 20 20 20 20 20 20 20 53 51  ache",        SQ
2ada0 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65  LITE_ColumnCache
2adb0 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 67 72      },.    { "gr
2adc0 6f 75 70 62 79 2d 6f 72 64 65 72 22 2c 20 20 20  oupby-order",   
2add0 20 20 20 20 53 51 4c 49 54 45 5f 47 72 6f 75 70      SQLITE_Group
2ade0 42 79 4f 72 64 65 72 20 20 20 7d 2c 0a 20 20 20  ByOrder   },.   
2adf0 20 7b 20 22 66 61 63 74 6f 72 2d 63 6f 6e 73 74   { "factor-const
2ae00 61 6e 74 73 22 2c 20 20 20 20 53 51 4c 49 54 45  ants",    SQLITE
2ae10 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 20  _FactorOutConst 
2ae20 7d 2c 0a 20 20 20 20 7b 20 22 64 69 73 74 69 6e  },.    { "distin
2ae30 63 74 2d 6f 70 74 22 2c 20 20 20 20 20 20 20 20  ct-opt",        
2ae40 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f  SQLITE_DistinctO
2ae50 70 74 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22  pt    },.    { "
2ae60 63 6f 76 65 72 2d 69 64 78 2d 73 63 61 6e 22 2c  cover-idx-scan",
2ae70 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43 6f 76        SQLITE_Cov
2ae80 65 72 49 64 78 53 63 61 6e 20 20 20 7d 2c 0a 20  erIdxScan   },. 
2ae90 20 20 20 7b 20 22 6f 72 64 65 72 2d 62 79 2d 69     { "order-by-i
2aea0 64 78 2d 6a 6f 69 6e 22 2c 20 20 20 53 51 4c 49  dx-join",   SQLI
2aeb0 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f 69  TE_OrderByIdxJoi
2aec0 6e 20 7d 2c 0a 20 20 20 20 7b 20 22 74 72 61 6e  n },.    { "tran
2aed0 73 69 74 69 76 65 22 2c 20 20 20 20 20 20 20 20  sitive",        
2aee0 20 20 53 51 4c 49 54 45 5f 54 72 61 6e 73 69 74    SQLITE_Transit
2aef0 69 76 65 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b  ive     },.    {
2af00 20 22 73 75 62 71 75 65 72 79 2d 63 6f 72 6f 75   "subquery-corou
2af10 74 69 6e 65 22 2c 20 20 53 51 4c 49 54 45 5f 53  tine",  SQLITE_S
2af20 75 62 71 43 6f 72 6f 75 74 69 6e 65 20 20 7d 2c  ubqCoroutine  },
2af30 0a 20 20 20 20 7b 20 22 6f 6d 69 74 2d 6e 6f 6f  .    { "omit-noo
2af40 70 2d 6a 6f 69 6e 22 2c 20 20 20 20 20 20 53 51  p-join",      SQ
2af50 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69  LITE_OmitNoopJoi
2af60 6e 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 74  n   },.    { "st
2af70 61 74 33 22 2c 20 20 20 20 20 20 20 20 20 20 20  at3",           
2af80 20 20 20 20 53 51 4c 49 54 45 5f 53 74 61 74 33      SQLITE_Stat3
2af90 34 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  4         },.   
2afa0 20 7b 20 22 73 74 61 74 34 22 2c 20 20 20 20 20   { "stat4",     
2afb0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
2afc0 5f 53 74 61 74 33 34 20 20 20 20 20 20 20 20 20  _Stat34         
2afd0 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f  },.  };..  if( o
2afe0 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
2aff0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
2b000 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
2b010 22 44 42 20 4f 50 54 20 42 4f 4f 4c 45 41 4e 22  "DB OPT BOOLEAN"
2b020 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2b030 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
2b040 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
2b050 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
2b060 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
2b070 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
2b080 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
2b090 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
2b0a0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
2b0b0 76 5b 33 5d 2c 20 26 6f 6e 6f 66 66 29 20 29 20  v[3], &onoff) ) 
2b0c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2b0d0 3b 0a 20 20 7a 4f 70 74 20 3d 20 54 63 6c 5f 47  ;.  zOpt = Tcl_G
2b0e0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
2b0f0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
2b100 73 69 7a 65 6f 66 28 61 4f 70 74 29 2f 73 69 7a  sizeof(aOpt)/siz
2b110 65 6f 66 28 61 4f 70 74 5b 30 5d 29 3b 20 69 2b  eof(aOpt[0]); i+
2b120 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63  +){.    if( strc
2b130 6d 70 28 7a 4f 70 74 2c 20 61 4f 70 74 5b 69 5d  mp(zOpt, aOpt[i]
2b140 2e 7a 4f 70 74 4e 61 6d 65 29 3d 3d 30 20 29 7b  .zOptName)==0 ){
2b150 0a 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 61 4f  .      mask = aO
2b160 70 74 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20  pt[i].mask;.    
2b170 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2b180 20 7d 0a 20 20 69 66 28 20 6f 6e 6f 66 66 20 29   }.  if( onoff )
2b190 20 6d 61 73 6b 20 3d 20 7e 6d 61 73 6b 3b 0a 20   mask = ~mask;. 
2b1a0 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28 61   if( i>=sizeof(a
2b1b0 4f 70 74 29 2f 73 69 7a 65 6f 66 28 61 4f 70 74  Opt)/sizeof(aOpt
2b1c0 5b 30 5d 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f  [0]) ){.    Tcl_
2b1d0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
2b1e0 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70  erp, "unknown op
2b1f0 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 73 68 6f  timization - sho
2b200 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a 22 2c  uld be one of:",
2b210 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b220 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b        (char*)0);
2b230 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2b240 73 69 7a 65 6f 66 28 61 4f 70 74 29 2f 73 69 7a  sizeof(aOpt)/siz
2b250 65 6f 66 28 61 4f 70 74 5b 30 5d 29 3b 20 69 2b  eof(aOpt[0]); i+
2b260 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  +){.      Tcl_Ap
2b270 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
2b280 70 2c 20 22 20 22 2c 20 61 4f 70 74 5b 69 5d 2e  p, " ", aOpt[i].
2b290 7a 4f 70 74 4e 61 6d 65 2c 20 28 63 68 61 72 2a  zOptName, (char*
2b2a0 29 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  )0);.    }.    r
2b2b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2b2c0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 74  .  }.  sqlite3_t
2b2d0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
2b2e0 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
2b2f0 4d 49 5a 41 54 49 4f 4e 53 2c 20 64 62 2c 20 6d  MIZATIONS, db, m
2b300 61 73 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ask);.  return T
2b310 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 74 79 70 65 64 65  CL_OK;.}..typede
2b320 66 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  f struct sqlite3
2b330 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 20 73 71  _api_routines sq
2b340 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e  lite3_api_routin
2b350 65 73 3b 0a 2f 2a 0a 2a 2a 20 20 20 20 20 6c 6f  es;./*.**     lo
2b360 61 64 5f 73 74 61 74 69 63 5f 65 78 74 65 6e 73  ad_static_extens
2b370 69 6f 6e 20 44 42 20 4e 41 4d 45 20 2e 2e 2e 0a  ion DB NAME ....
2b380 2a 2a 0a 2a 2a 20 4c 6f 61 64 20 6f 6e 65 20 6f  **.** Load one o
2b390 72 20 6d 6f 72 65 20 73 74 61 74 69 63 61 6c 6c  r more staticall
2b3a0 79 20 6c 69 6e 6b 65 64 20 65 78 74 65 6e 73 69  y linked extensi
2b3b0 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ons..*/.static i
2b3c0 6e 74 20 74 63 6c 4c 6f 61 64 53 74 61 74 69 63  nt tclLoadStatic
2b3d0 45 78 74 65 6e 73 69 6f 6e 43 6d 64 28 0a 20 20  ExtensionCmd(.  
2b3e0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
2b3f0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
2b400 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
2b410 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
2b420 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
2b430 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
2b440 69 74 65 33 5f 61 6d 61 74 63 68 5f 69 6e 69 74  ite3_amatch_init
2b450 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a  (sqlite3*,char**
2b460 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61  ,const sqlite3_a
2b470 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20  pi_routines*);. 
2b480 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
2b490 74 65 33 5f 63 6c 6f 73 75 72 65 5f 69 6e 69 74  te3_closure_init
2b4a0 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a  (sqlite3*,char**
2b4b0 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61  ,const sqlite3_a
2b4c0 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20  pi_routines*);. 
2b4d0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
2b4e0 74 65 33 5f 65 76 61 6c 5f 69 6e 69 74 28 73 71  te3_eval_init(sq
2b4f0 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f  lite3*,char**,co
2b500 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f  nst sqlite3_api_
2b510 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78  routines*);.  ex
2b520 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
2b530 5f 66 69 6c 65 69 6f 5f 69 6e 69 74 28 73 71 6c  _fileio_init(sql
2b540 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e  ite3*,char**,con
2b550 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
2b560 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74  outines*);.  ext
2b570 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
2b580 66 75 7a 7a 65 72 5f 69 6e 69 74 28 73 71 6c 69  fuzzer_init(sqli
2b590 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73  te3*,char**,cons
2b5a0 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
2b5b0 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65  utines*);.  exte
2b5c0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
2b5d0 65 65 65 5f 69 6e 69 74 28 73 71 6c 69 74 65 33  eee_init(sqlite3
2b5e0 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73  *,char**,const s
2b5f0 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69  qlite3_api_routi
2b600 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20  nes*);.  extern 
2b610 69 6e 74 20 73 71 6c 69 74 65 33 5f 6e 65 78 74  int sqlite3_next
2b620 63 68 61 72 5f 69 6e 69 74 28 73 71 6c 69 74 65  char_init(sqlite
2b630 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20  3*,char**,const 
2b640 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
2b650 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e  ines*);.  extern
2b660 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 65 72   int sqlite3_per
2b670 63 65 6e 74 69 6c 65 5f 69 6e 69 74 28 73 71 6c  centile_init(sql
2b680 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e  ite3*,char**,con
2b690 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
2b6a0 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74  outines*);.  ext
2b6b0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
2b6c0 72 65 67 65 78 70 5f 69 6e 69 74 28 73 71 6c 69  regexp_init(sqli
2b6d0 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73  te3*,char**,cons
2b6e0 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
2b6f0 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65  utines*);.  exte
2b700 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  rn int sqlite3_s
2b710 70 65 6c 6c 66 69 78 5f 69 6e 69 74 28 73 71 6c  pellfix_init(sql
2b720 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e  ite3*,char**,con
2b730 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
2b740 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74  outines*);.  ext
2b750 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
2b760 74 6f 74 79 70 65 5f 69 6e 69 74 28 73 71 6c 69  totype_init(sqli
2b770 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73  te3*,char**,cons
2b780 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
2b790 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65  utines*);.  exte
2b7a0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 77  rn int sqlite3_w
2b7b0 68 6f 6c 65 6e 75 6d 62 65 72 5f 69 6e 69 74 28  holenumber_init(
2b7c0 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c  sqlite3*,char**,
2b7d0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70  const sqlite3_ap
2b7e0 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20  i_routines*);.  
2b7f0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
2b800 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  uct {.    const 
2b810 63 68 61 72 20 2a 7a 45 78 74 4e 61 6d 65 3b 0a  char *zExtName;.
2b820 20 20 20 20 69 6e 74 20 28 2a 70 49 6e 69 74 29      int (*pInit)
2b830 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a  (sqlite3*,char**
2b840 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61  ,const sqlite3_a
2b850 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20  pi_routines*);. 
2b860 20 7d 20 61 45 78 74 65 6e 73 69 6f 6e 5b 5d 20   } aExtension[] 
2b870 3d 20 7b 0a 20 20 20 20 7b 20 22 61 6d 61 74 63  = {.    { "amatc
2b880 68 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  h",             
2b890 20 20 20 73 71 6c 69 74 65 33 5f 61 6d 61 74 63     sqlite3_amatc
2b8a0 68 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20  h_init          
2b8b0 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63       },.    { "c
2b8c0 6c 6f 73 75 72 65 22 2c 20 20 20 20 20 20 20 20  losure",        
2b8d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
2b8e0 6c 6f 73 75 72 65 5f 69 6e 69 74 20 20 20 20 20  losure_init     
2b8f0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2b900 7b 20 22 65 76 61 6c 22 2c 20 20 20 20 20 20 20  { "eval",       
2b910 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2b920 65 33 5f 65 76 61 6c 5f 69 6e 69 74 20 20 20 20  e3_eval_init    
2b930 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
2b940 20 20 20 20 7b 20 22 66 69 6c 65 69 6f 22 2c 20      { "fileio", 
2b950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2b960 71 6c 69 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e  qlite3_fileio_in
2b970 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  it              
2b980 20 7d 2c 0a 20 20 20 20 7b 20 22 66 75 7a 7a 65   },.    { "fuzze
2b990 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  r",             
2b9a0 20 20 20 73 71 6c 69 74 65 33 5f 66 75 7a 7a 65     sqlite3_fuzze
2b9b0 72 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20  r_init          
2b9c0 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69       },.    { "i
2b9d0 65 65 65 37 35 34 22 2c 20 20 20 20 20 20 20 20  eee754",        
2b9e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69         sqlite3_i
2b9f0 65 65 65 5f 69 6e 69 74 20 20 20 20 20 20 20 20  eee_init        
2ba00 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2ba10 7b 20 22 6e 65 78 74 63 68 61 72 22 2c 20 20 20  { "nextchar",   
2ba20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2ba30 65 33 5f 6e 65 78 74 63 68 61 72 5f 69 6e 69 74  e3_nextchar_init
2ba40 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
2ba50 20 20 20 20 7b 20 22 70 65 72 63 65 6e 74 69 6c      { "percentil
2ba60 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 73  e",            s
2ba70 71 6c 69 74 65 33 5f 70 65 72 63 65 6e 74 69 6c  qlite3_percentil
2ba80 65 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20  e_init          
2ba90 20 7d 2c 0a 20 20 20 20 7b 20 22 72 65 67 65 78   },.    { "regex
2baa0 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p",             
2bab0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 67 65 78     sqlite3_regex
2bac0 70 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20  p_init          
2bad0 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73       },.    { "s
2bae0 70 65 6c 6c 66 69 78 22 2c 20 20 20 20 20 20 20  pellfix",       
2baf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
2bb00 70 65 6c 6c 66 69 78 5f 69 6e 69 74 20 20 20 20  pellfix_init    
2bb10 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2bb20 7b 20 22 74 6f 74 79 70 65 22 2c 20 20 20 20 20  { "totype",     
2bb30 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2bb40 65 33 5f 74 6f 74 79 70 65 5f 69 6e 69 74 20 20  e3_totype_init  
2bb50 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
2bb60 20 20 20 20 7b 20 22 77 68 6f 6c 65 6e 75 6d 62      { "wholenumb
2bb70 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 73  er",           s
2bb80 71 6c 69 74 65 33 5f 77 68 6f 6c 65 6e 75 6d 62  qlite3_wholenumb
2bb90 65 72 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20  er_init         
2bba0 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73 71 6c 69 74   },.  };.  sqlit
2bbb0 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
2bbc0 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69  char *zName;.  i
2bbd0 6e 74 20 69 2c 20 6a 2c 20 72 63 3b 0a 20 20 63  nt i, j, rc;.  c
2bbe0 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
2bbf0 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3c 33 20 29  ;.  if( objc<3 )
2bc00 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
2bc10 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
2bc20 2c 20 6f 62 6a 76 2c 20 22 44 42 20 4e 41 4d 45  , objv, "DB NAME
2bc30 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74 75   ...");.    retu
2bc40 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2bc50 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
2bc60 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
2bc70 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
2bc80 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
2bc90 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2bca0 66 6f 72 28 6a 3d 32 3b 20 6a 3c 6f 62 6a 63 3b  for(j=2; j<objc;
2bcb0 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 4e 61 6d 65   j++){.    zName
2bcc0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
2bcd0 28 6f 62 6a 76 5b 6a 5d 29 3b 0a 20 20 20 20 66  (objv[j]);.    f
2bce0 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
2bcf0 69 7a 65 28 61 45 78 74 65 6e 73 69 6f 6e 29 3b  ize(aExtension);
2bd00 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
2bd10 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
2bd20 45 78 74 65 6e 73 69 6f 6e 5b 69 5d 2e 7a 45 78  Extension[i].zEx
2bd30 74 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61  tName)==0 ) brea
2bd40 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
2bd50 20 69 3e 3d 41 72 72 61 79 53 69 7a 65 28 61 45   i>=ArraySize(aE
2bd60 78 74 65 6e 73 69 6f 6e 29 20 29 7b 0a 20 20 20  xtension) ){.   
2bd70 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
2bd80 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20  ult(interp, "no 
2bd90 73 75 63 68 20 65 78 74 65 6e 73 69 6f 6e 3a 20  such extension: 
2bda0 22 2c 20 7a 4e 61 6d 65 2c 20 28 63 68 61 72 2a  ", zName, (char*
2bdb0 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  )0);.      retur
2bdc0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
2bdd0 20 7d 0a 20 20 20 20 72 63 20 3d 20 61 45 78 74   }.    rc = aExt
2bde0 65 6e 73 69 6f 6e 5b 69 5d 2e 70 49 6e 69 74 28  ension[i].pInit(
2bdf0 64 62 2c 20 26 7a 45 72 72 4d 73 67 2c 20 30 29  db, &zErrMsg, 0)
2be00 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2be10 4c 49 54 45 5f 4f 4b 20 7c 7c 20 7a 45 72 72 4d  LITE_OK || zErrM
2be20 73 67 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  sg ){.      Tcl_
2be30 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
2be40 65 72 70 2c 20 22 69 6e 69 74 69 61 6c 69 7a 61  erp, "initializa
2be50 74 69 6f 6e 20 6f 66 20 22 2c 20 7a 4e 61 6d 65  tion of ", zName
2be60 2c 20 22 20 66 61 69 6c 65 64 3a 20 22 2c 20 7a  , " failed: ", z
2be70 45 72 72 4d 73 67 2c 0a 20 20 20 20 20 20 20 20  ErrMsg,.        
2be80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2be90 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
2bea0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
2beb0 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 65 74  rMsg);.      ret
2bec0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2bed0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2bee0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
2bef0 2a 2a 20 20 20 20 20 73 6f 72 74 65 72 5f 74 65  **     sorter_te
2bf00 73 74 5f 66 61 6b 65 68 65 61 70 20 42 4f 4f 4c  st_fakeheap BOOL
2bf10 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
2bf20 74 20 73 6f 72 74 65 72 5f 74 65 73 74 5f 66 61  t sorter_test_fa
2bf30 6b 65 68 65 61 70 28 0a 20 20 76 6f 69 64 20 2a  keheap(.  void *
2bf40 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
2bf50 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2bf60 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
2bf70 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
2bf80 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20  objv[].){.  int 
2bf90 62 41 72 67 3b 0a 20 20 69 66 28 20 6f 62 6a 63  bArg;.  if( objc
2bfa0 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
2bfb0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
2bfc0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 42 4f  rp, 1, objv, "BO
2bfd0 4f 4c 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  OL");.    return
2bfe0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2bff0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f  .  if( Tcl_GetBo
2c000 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
2c010 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 62  erp, objv[1], &b
2c020 41 72 67 29 20 29 7b 0a 20 20 20 20 72 65 74 75  Arg) ){.    retu
2c030 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2c040 7d 0a 0a 20 20 69 66 28 20 62 41 72 67 20 29 7b  }..  if( bArg ){
2c050 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2c060 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65  GlobalConfig.pHe
2c070 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ap==0 ){.      s
2c080 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2c090 69 67 2e 70 48 65 61 70 20 3d 20 53 51 4c 49 54  ig.pHeap = SQLIT
2c0a0 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 2d 31 29  E_INT_TO_PTR(-1)
2c0b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
2c0c0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2c0d0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65  GlobalConfig.pHe
2c0e0 61 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 5f 54  ap==SQLITE_INT_T
2c0f0 4f 5f 50 54 52 28 2d 31 29 20 29 7b 0a 20 20 20  O_PTR(-1) ){.   
2c100 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
2c110 43 6f 6e 66 69 67 2e 70 48 65 61 70 20 3d 20 30  Config.pHeap = 0
2c120 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 54  ;.    }.  }..  T
2c130 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
2c140 6e 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e  nterp);.  return
2c150 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
2c160 2a 20 20 20 20 20 73 6f 72 74 65 72 5f 74 65 73  *     sorter_tes
2c170 74 5f 73 6f 72 74 34 5f 68 65 6c 70 65 72 20 44  t_sort4_helper D
2c180 42 20 53 51 4c 31 20 4e 53 54 45 50 20 53 51 4c  B SQL1 NSTEP SQL
2c190 32 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20  2.**.** Compile 
2c1a0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 24 53  SQL statement $S
2c1b0 51 4c 31 20 61 6e 64 20 73 74 65 70 20 69 74 20  QL1 and step it 
2c1c0 24 4e 53 54 45 50 20 74 69 6d 65 73 2e 20 46 6f  $NSTEP times. Fo
2c1d0 72 20 65 61 63 68 20 72 6f 77 2c 20 0a 2a 2a 20  r each row, .** 
2c1e0 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6c  check that the l
2c1f0 65 66 74 6d 6f 73 74 20 61 6e 64 20 72 69 67 68  eftmost and righ
2c200 74 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 72 65  tmost columns re
2c210 74 75 72 6e 65 64 20 61 72 65 20 62 6f 74 68 20  turned are both 
2c220 69 6e 74 65 67 65 72 73 2c 0a 2a 2a 20 61 6e 64  integers,.** and
2c230 20 74 68 61 74 20 62 6f 74 68 20 63 6f 6e 74 61   that both conta
2c240 69 6e 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75  in the same valu
2c250 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 65 78  e..**.** Then ex
2c260 65 63 75 74 65 20 73 74 61 74 65 6d 65 6e 74 20  ecute statement 
2c270 24 53 51 4c 32 2e 20 43 68 65 63 6b 20 74 68 61  $SQL2. Check tha
2c280 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
2c290 72 65 74 75 72 6e 73 20 74 68 65 20 73 61 6d 65  returns the same
2c2a0 0a 2a 2a 20 73 65 74 20 6f 66 20 69 6e 74 65 67  .** set of integ
2c2b0 65 72 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ers in the same 
2c2c0 6f 72 64 65 72 20 61 73 20 69 6e 20 74 68 65 20  order as in the 
2c2d0 70 72 65 76 69 6f 75 73 20 73 74 65 70 20 28 75  previous step (u
2c2e0 73 69 6e 67 20 24 53 51 4c 31 29 2e 0a 2a 2f 0a  sing $SQL1)..*/.
2c2f0 73 74 61 74 69 63 20 69 6e 74 20 73 6f 72 74 65  static int sorte
2c300 72 5f 74 65 73 74 5f 73 6f 72 74 34 5f 68 65 6c  r_test_sort4_hel
2c310 70 65 72 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  per(.  void * cl
2c320 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
2c330 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
2c340 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
2c350 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
2c360 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63  v[].){.  const c
2c370 68 61 72 20 2a 7a 53 71 6c 31 3b 0a 20 20 63 6f  har *zSql1;.  co
2c380 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 32 3b  nst char *zSql2;
2c390 0a 20 20 69 6e 74 20 6e 53 74 65 70 3b 20 0a 20  .  int nStep; . 
2c3a0 20 69 6e 74 20 69 53 74 65 70 3b 20 0a 20 20 69   int iStep; .  i
2c3b0 6e 74 20 69 43 6b 73 75 6d 31 20 3d 20 30 3b 20  nt iCksum1 = 0; 
2c3c0 0a 20 20 69 6e 74 20 69 43 6b 73 75 6d 32 20 3d  .  int iCksum2 =
2c3d0 20 30 3b 20 0a 20 20 69 6e 74 20 72 63 3b 0a 20   0; .  int rc;. 
2c3e0 20 69 6e 74 20 69 42 3b 0a 20 20 73 71 6c 69 74   int iB;.  sqlit
2c3f0 65 33 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65  e3 *db;.  sqlite
2c400 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
2c410 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20   .  if( objc!=5 
2c420 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
2c430 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
2c440 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 53 51 4c  1, objv, "DB SQL
2c450 31 20 4e 53 54 45 50 20 53 51 4c 32 22 29 3b 0a  1 NSTEP SQL2");.
2c460 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2c470 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
2c480 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
2c490 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
2c4a0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
2c4b0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
2c4c0 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 31 20 3d  ERROR;.  zSql1 =
2c4d0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
2c4e0 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54  bjv[2]);.  if( T
2c4f0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
2c500 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
2c510 2c 20 26 6e 53 74 65 70 29 20 29 20 72 65 74 75  , &nStep) ) retu
2c520 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2c530 7a 53 71 6c 32 20 3d 20 54 63 6c 5f 47 65 74 53  zSql2 = Tcl_GetS
2c540 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a  tring(objv[4]);.
2c550 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
2c560 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a  prepare_v2(db, z
2c570 53 71 6c 31 2c 20 2d 31 2c 20 26 70 53 74 6d 74  Sql1, -1, &pStmt
2c580 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
2c590 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
2c5a0 20 73 71 6c 5f 65 72 72 6f 72 3b 0a 0a 20 20 69   sql_error;..  i
2c5b0 42 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  B = sqlite3_colu
2c5c0 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 2d  mn_count(pStmt)-
2c5d0 31 3b 0a 20 20 66 6f 72 28 69 53 74 65 70 3d 30  1;.  for(iStep=0
2c5e0 3b 20 69 53 74 65 70 3c 6e 53 74 65 70 20 26 26  ; iStep<nStep &&
2c5f0 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
2c600 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
2c610 3b 20 69 53 74 65 70 2b 2b 29 7b 0a 20 20 20 20  ; iStep++){.    
2c620 69 6e 74 20 61 20 3d 20 73 71 6c 69 74 65 33 5f  int a = sqlite3_
2c630 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
2c640 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 61 21  , 0);.    if( a!
2c650 3d 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  =sqlite3_column_
2c660 69 6e 74 28 70 53 74 6d 74 2c 20 69 42 29 20 29  int(pStmt, iB) )
2c670 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
2c680 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2c690 20 22 64 61 74 61 20 65 72 72 6f 72 3a 20 28 61   "data error: (a
2c6a0 21 3d 62 29 22 2c 20 30 29 3b 0a 20 20 20 20 20  !=b)", 0);.     
2c6b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2c6c0 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 43  R;.    }..    iC
2c6d0 6b 73 75 6d 31 20 2b 3d 20 28 69 43 6b 73 75 6d  ksum1 += (iCksum
2c6e0 31 20 3c 3c 20 33 29 20 2b 20 61 3b 0a 20 20 7d  1 << 3) + a;.  }
2c6f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
2c700 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
2c710 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2c720 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 71 6c 5f  E_OK ) goto sql_
2c730 65 72 72 6f 72 3b 0a 0a 20 20 72 63 20 3d 20 73  error;..  rc = s
2c740 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
2c750 32 28 64 62 2c 20 7a 53 71 6c 32 2c 20 2d 31 2c  2(db, zSql2, -1,
2c760 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69   &pStmt, 0);.  i
2c770 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2c780 20 29 20 67 6f 74 6f 20 73 71 6c 5f 65 72 72 6f   ) goto sql_erro
2c790 72 3b 0a 20 20 66 6f 72 28 69 53 74 65 70 3d 30  r;.  for(iStep=0
2c7a0 3b 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ; SQLITE_ROW==sq
2c7b0 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
2c7c0 29 3b 20 69 53 74 65 70 2b 2b 29 7b 0a 20 20 20  ); iStep++){.   
2c7d0 20 69 6e 74 20 61 20 3d 20 73 71 6c 69 74 65 33   int a = sqlite3
2c7e0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
2c7f0 74 2c 20 30 29 3b 0a 20 20 20 20 69 43 6b 73 75  t, 0);.    iCksu
2c800 6d 32 20 2b 3d 20 28 69 43 6b 73 75 6d 32 20 3c  m2 += (iCksum2 <
2c810 3c 20 33 29 20 2b 20 61 3b 0a 20 20 7d 0a 20 20  < 3) + a;.  }.  
2c820 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  rc = sqlite3_fin
2c830 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
2c840 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2c850 4b 20 29 20 67 6f 74 6f 20 73 71 6c 5f 65 72 72  K ) goto sql_err
2c860 6f 72 3b 0a 0a 20 20 69 66 28 20 69 43 6b 73 75  or;..  if( iCksu
2c870 6d 31 21 3d 69 43 6b 73 75 6d 32 20 29 7b 0a 20  m1!=iCksum2 ){. 
2c880 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
2c890 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 68 65  ult(interp, "che
2c8a0 63 6b 73 75 6d 20 6d 69 73 6d 61 74 63 68 22 2c  cksum mismatch",
2c8b0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
2c8c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
2c8d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2c8e0 0a 20 73 71 6c 5f 65 72 72 6f 72 3a 0a 20 20 54  . sql_error:.  T
2c8f0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2c900 69 6e 74 65 72 70 2c 20 22 73 71 6c 20 65 72 72  interp, "sql err
2c910 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65  or: ", sqlite3_e
2c920 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20  rrmsg(db), 0);. 
2c930 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2c940 52 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51  R;.}...#ifdef SQ
2c950 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
2c960 54 49 43 41 54 49 4f 4e 0a 23 69 6e 63 6c 75 64  TICATION.#includ
2c970 65 20 22 73 71 6c 69 74 65 33 75 73 65 72 61 75  e "sqlite3userau
2c980 74 68 2e 68 22 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  th.h"./*.** tclc
2c990 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 73 65  md:  sqlite3_use
2c9a0 72 5f 61 75 74 68 65 6e 74 69 63 61 74 65 20 44  r_authenticate D
2c9b0 42 20 55 53 45 52 4e 41 4d 45 20 50 41 53 53 57  B USERNAME PASSW
2c9c0 4f 52 44 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ORD.*/.static in
2c9d0 74 20 74 65 73 74 5f 75 73 65 72 5f 61 75 74 68  t test_user_auth
2c9e0 65 6e 74 69 63 61 74 65 28 0a 20 20 43 6c 69 65  enticate(.  Clie
2c9f0 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
2ca00 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a  a, /* Unused */.
2ca10 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2ca20 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
2ca30 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
2ca40 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
2ca50 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
2ca60 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
2ca70 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2ca80 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
2ca90 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
2caa0 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
2cab0 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
2cac0 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 55 73 65  .){.  char *zUse
2cad0 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  r = 0;.  char *z
2cae0 50 61 73 73 77 64 20 3d 20 30 3b 0a 20 20 69 6e  Passwd = 0;.  in
2caf0 74 20 6e 50 61 73 73 77 64 20 3d 20 30 3b 0a 20  t nPasswd = 0;. 
2cb00 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
2cb10 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
2cb20 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
2cb30 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
2cb40 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
2cb50 22 44 42 20 55 53 45 52 4e 41 4d 45 20 50 41 53  "DB USERNAME PAS
2cb60 53 57 4f 52 44 22 29 3b 0a 20 20 20 20 72 65 74  SWORD");.    ret
2cb70 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2cb80 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
2cb90 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
2cba0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
2cbb0 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20  [1]), &db) ){.  
2cbc0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2cbd0 4f 52 3b 0a 20 20 7d 0a 20 20 7a 55 73 65 72 20  OR;.  }.  zUser 
2cbe0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
2cbf0 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7a 50 61 73  objv[2]);.  zPas
2cc00 73 77 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  swd = Tcl_GetStr
2cc10 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
2cc20 33 5d 2c 20 26 6e 50 61 73 73 77 64 29 3b 0a 20  3], &nPasswd);. 
2cc30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 75 73   rc = sqlite3_us
2cc40 65 72 5f 61 75 74 68 65 6e 74 69 63 61 74 65 28  er_authenticate(
2cc50 64 62 2c 20 7a 55 73 65 72 2c 20 7a 50 61 73 73  db, zUser, zPass
2cc60 77 64 2c 20 6e 50 61 73 73 77 64 29 3b 0a 20 20  wd, nPasswd);.  
2cc70 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
2cc80 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
2cc90 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
2cca0 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65  CL_STATIC);.  re
2ccb0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23  turn TCL_OK;.}.#
2ccc0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2ccd0 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54  USER_AUTHENTICAT
2cce0 49 4f 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  ION */..#ifdef S
2ccf0 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45  QLITE_USER_AUTHE
2cd00 4e 54 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20  NTICATION./*.** 
2cd10 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65 33  tclcmd:  sqlite3
2cd20 5f 75 73 65 72 5f 61 64 64 20 44 42 20 55 53 45  _user_add DB USE
2cd30 52 4e 41 4d 45 20 50 41 53 53 57 4f 52 44 20 49  RNAME PASSWORD I
2cd40 53 41 44 4d 49 4e 0a 2a 2f 0a 73 74 61 74 69 63  SADMIN.*/.static
2cd50 20 69 6e 74 20 74 65 73 74 5f 75 73 65 72 5f 61   int test_user_a
2cd60 64 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  dd(.  ClientData
2cd70 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
2cd80 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  Unused */.  Tcl_
2cd90 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
2cda0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
2cdb0 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
2cdc0 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
2cdd0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
2cde0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2cdf0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
2ce00 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
2ce10 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
2ce20 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
2ce30 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
2ce40 63 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 30 3b  char *zUser = 0;
2ce50 0a 20 20 63 68 61 72 20 2a 7a 50 61 73 73 77 64  .  char *zPasswd
2ce60 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50 61 73   = 0;.  int nPas
2ce70 73 77 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  swd = 0;.  int i
2ce80 73 41 64 6d 69 6e 20 3d 20 30 3b 0a 20 20 73 71  sAdmin = 0;.  sq
2ce90 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
2cea0 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
2ceb0 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=5 ){.    Tcl_W
2cec0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
2ced0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
2cee0 20 55 53 45 52 4e 41 4d 45 20 50 41 53 53 57 4f   USERNAME PASSWO
2cef0 52 44 20 49 53 41 44 4d 49 4e 22 29 3b 0a 20 20  RD ISADMIN");.  
2cf00 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2cf10 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
2cf20 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
2cf30 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
2cf40 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
2cf50 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
2cf60 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
2cf70 55 73 65 72 20 3d 20 54 63 6c 5f 47 65 74 53 74  User = Tcl_GetSt
2cf80 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
2cf90 20 7a 50 61 73 73 77 64 20 3d 20 54 63 6c 5f 47   zPasswd = Tcl_G
2cfa0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
2cfb0 6f 62 6a 76 5b 33 5d 2c 20 26 6e 50 61 73 73 77  objv[3], &nPassw
2cfc0 64 29 3b 0a 20 20 54 63 6c 5f 47 65 74 42 6f 6f  d);.  Tcl_GetBoo
2cfd0 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
2cfe0 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 69 73  rp, objv[4], &is
2cff0 41 64 6d 69 6e 29 3b 0a 20 20 72 63 20 3d 20 73  Admin);.  rc = s
2d000 71 6c 69 74 65 33 5f 75 73 65 72 5f 61 64 64 28  qlite3_user_add(
2d010 64 62 2c 20 7a 55 73 65 72 2c 20 7a 50 61 73 73  db, zUser, zPass
2d020 77 64 2c 20 6e 50 61 73 73 77 64 2c 20 69 73 41  wd, nPasswd, isA
2d030 64 6d 69 6e 29 3b 0a 20 20 54 63 6c 5f 53 65 74  dmin);.  Tcl_Set
2d040 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
2d050 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
2d060 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
2d070 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  IC);.  return TC
2d080 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  L_OK;.}.#endif /
2d090 2a 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55  * SQLITE_USER_AU
2d0a0 54 48 45 4e 54 49 43 41 54 49 4f 4e 20 2a 2f 0a  THENTICATION */.
2d0b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55  .#ifdef SQLITE_U
2d0c0 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49  SER_AUTHENTICATI
2d0d0 4f 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  ON./*.** tclcmd:
2d0e0 20 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 63    sqlite3_user_c
2d0f0 68 61 6e 67 65 20 44 42 20 55 53 45 52 4e 41 4d  hange DB USERNAM
2d100 45 20 50 41 53 53 57 4f 52 44 20 49 53 41 44 4d  E PASSWORD ISADM
2d110 49 4e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  IN.*/.static int
2d120 20 74 65 73 74 5f 75 73 65 72 5f 63 68 61 6e 67   test_user_chang
2d130 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  e(.  ClientData 
2d140 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55  clientData, /* U
2d150 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49  nused */.  Tcl_I
2d160 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
2d170 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
2d180 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
2d190 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
2d1a0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
2d1b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2d1c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
2d1d0 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
2d1e0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
2d1f0 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
2d200 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63  uments */.){.  c
2d210 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 30 3b 0a  har *zUser = 0;.
2d220 20 20 63 68 61 72 20 2a 7a 50 61 73 73 77 64 20    char *zPasswd 
2d230 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50 61 73 73  = 0;.  int nPass
2d240 77 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73  wd = 0;.  int is
2d250 41 64 6d 69 6e 20 3d 20 30 3b 0a 20 20 73 71 6c  Admin = 0;.  sql
2d260 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
2d270 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
2d280 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =5 ){.    Tcl_Wr
2d290 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
2d2a0 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
2d2b0 55 53 45 52 4e 41 4d 45 20 50 41 53 53 57 4f 52  USERNAME PASSWOR
2d2c0 44 20 49 53 41 44 4d 49 4e 22 29 3b 0a 20 20 20  D ISADMIN");.   
2d2d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2d2e0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
2d2f0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
2d300 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
2d310 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
2d320 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
2d330 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 55  _ERROR;.  }.  zU
2d340 73 65 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ser = Tcl_GetStr
2d350 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
2d360 7a 50 61 73 73 77 64 20 3d 20 54 63 6c 5f 47 65  zPasswd = Tcl_Ge
2d370 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
2d380 62 6a 76 5b 33 5d 2c 20 26 6e 50 61 73 73 77 64  bjv[3], &nPasswd
2d390 29 3b 0a 20 20 54 63 6c 5f 47 65 74 42 6f 6f 6c  );.  Tcl_GetBool
2d3a0 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
2d3b0 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 69 73 41  p, objv[4], &isA
2d3c0 64 6d 69 6e 29 3b 0a 20 20 72 63 20 3d 20 73 71  dmin);.  rc = sq
2d3d0 6c 69 74 65 33 5f 75 73 65 72 5f 63 68 61 6e 67  lite3_user_chang
2d3e0 65 28 64 62 2c 20 7a 55 73 65 72 2c 20 7a 50 61  e(db, zUser, zPa
2d3f0 73 73 77 64 2c 20 6e 50 61 73 73 77 64 2c 20 69  sswd, nPasswd, i
2d400 73 41 64 6d 69 6e 29 3b 0a 20 20 54 63 6c 5f 53  sAdmin);.  Tcl_S
2d410 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
2d420 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
2d430 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54  Name(rc), TCL_ST
2d440 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20  ATIC);.  return 
2d450 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
2d460 20 2f 2a 20 53 51 4c 49 54 45 5f 55 53 45 52 5f   /* SQLITE_USER_
2d470 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 20 2a  AUTHENTICATION *
2d480 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
2d490 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41  _USER_AUTHENTICA
2d4a0 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  TION./*.** tclcm
2d4b0 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 73 65 72  d:  sqlite3_user
2d4c0 5f 64 65 6c 65 74 65 20 44 42 20 55 53 45 52 4e  _delete DB USERN
2d4d0 41 4d 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  AME.*/.static in
2d4e0 74 20 74 65 73 74 5f 75 73 65 72 5f 64 65 6c 65  t test_user_dele
2d4f0 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  te(.  ClientData
2d500 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
2d510 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  Unused */.  Tcl_
2d520 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
2d530 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
2d540 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
2d550 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
2d560 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
2d570 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2d580 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
2d590 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
2d5a0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
2d5b0 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
2d5c0 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
2d5d0 63 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 30 3b  char *zUser = 0;
2d5e0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
2d5f0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
2d600 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
2d610 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
2d620 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
2d630 2c 20 22 44 42 20 55 53 45 52 4e 41 4d 45 22 29  , "DB USERNAME")
2d640 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2d650 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
2d660 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
2d670 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
2d680 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
2d690 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
2d6a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2d6b0 0a 20 20 7a 55 73 65 72 20 3d 20 54 63 6c 5f 47  .  zUser = Tcl_G
2d6c0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
2d6d0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
2d6e0 33 5f 75 73 65 72 5f 64 65 6c 65 74 65 28 64 62  3_user_delete(db
2d6f0 2c 20 7a 55 73 65 72 29 3b 0a 20 20 54 63 6c 5f  , zUser);.  Tcl_
2d700 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
2d710 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
2d720 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53  rName(rc), TCL_S
2d730 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e  TATIC);.  return
2d740 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69   TCL_OK;.}.#endi
2d750 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55 53 45 52  f /* SQLITE_USER
2d760 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 20  _AUTHENTICATION 
2d770 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  */../*.** Regist
2d780 65 72 20 63 6f 6d 6d 61 6e 64 73 20 77 69 74 68  er commands with
2d790 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   the TCL interpr
2d7a0 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 53 71 6c  eter..*/.int Sql
2d7b0 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28 54 63  itetest1_Init(Tc
2d7c0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2d7d0 29 7b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  ){.  extern int 
2d7e0 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
2d7f0 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69  ount;.  extern i
2d800 6e 74 20 73 71 6c 69 74 65 33 5f 66 6f 75 6e 64  nt sqlite3_found
2d810 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e  _count;.  extern
2d820 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6e 74   int sqlite3_int
2d830 65 72 72 75 70 74 5f 63 6f 75 6e 74 3b 0a 20 20  errupt_count;.  
2d840 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
2d850 65 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75  e3_open_file_cou
2d860 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  nt;.  extern int
2d870 20 73 71 6c 69 74 65 33 5f 73 6f 72 74 5f 63 6f   sqlite3_sort_co
2d880 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  unt;.  extern in
2d890 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  t sqlite3_curren
2d8a0 74 5f 74 69 6d 65 3b 0a 23 69 66 20 53 51 4c 49  t_time;.#if SQLI
2d8b0 54 45 5f 4f 53 5f 55 4e 49 58 20 26 26 20 64 65  TE_OS_UNIX && de
2d8c0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2d8d0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
2d8e0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2d8f0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
2d900 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 3b  ite3_hostid_num;
2d910 0a 23 65 6e 64 69 66 0a 20 20 65 78 74 65 72 6e  .#endif.  extern
2d920 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 61 78   int sqlite3_max
2d930 5f 62 6c 6f 62 73 69 7a 65 3b 0a 20 20 65 78 74  _blobsize;.  ext
2d940 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 42  ern int sqlite3B
2d950 74 72 65 65 53 68 61 72 65 64 43 61 63 68 65 52  treeSharedCacheR
2d960 65 70 6f 72 74 28 76 6f 69 64 2a 2c 0a 20 20 20  eport(void*,.   
2d970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d990 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 74 65 72         Tcl_Inter
2d9a0 70 2a 2c 69 6e 74 2c 54 63 6c 5f 4f 62 6a 2a 43  p*,int,Tcl_Obj*C
2d9b0 4f 4e 53 54 2a 29 3b 0a 20 20 73 74 61 74 69 63  ONST*);.  static
2d9c0 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63   struct {.     c
2d9d0 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
2d9e0 20 54 63 6c 5f 43 6d 64 50 72 6f 63 20 2a 78 50   Tcl_CmdProc *xP
2d9f0 72 6f 63 3b 0a 20 20 7d 20 61 43 6d 64 5b 5d 20  roc;.  } aCmd[] 
2da00 3d 20 7b 0a 20 20 20 20 20 7b 20 22 64 62 5f 65  = {.     { "db_e
2da10 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20 20 20  nter",          
2da20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
2da30 5f 43 6d 64 50 72 6f 63 2a 29 64 62 5f 65 6e 74  _CmdProc*)db_ent
2da40 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  er              
2da50 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 62 5f 6c   },.     { "db_l
2da60 65 61 76 65 22 2c 20 20 20 20 20 20 20 20 20 20  eave",          
2da70 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
2da80 5f 43 6d 64 50 72 6f 63 2a 29 64 62 5f 6c 65 61  _CmdProc*)db_lea
2da90 76 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ve              
2daa0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2dab0 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 22  te3_mprintf_int"
2dac0 2c 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c  ,           (Tcl
2dad0 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65  _CmdProc*)sqlite
2dae0 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 20 20 20  3_mprintf_int   
2daf0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2db00 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36  te3_mprintf_int6
2db10 34 22 2c 20 20 20 20 20 20 20 20 20 28 54 63 6c  4",         (Tcl
2db20 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65  _CmdProc*)sqlite
2db30 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 20  3_mprintf_int64 
2db40 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2db50 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67  te3_mprintf_long
2db60 22 2c 20 20 20 20 20 20 20 20 20 20 28 54 63 6c  ",          (Tcl
2db70 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65  _CmdProc*)sqlite
2db80 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67 20 20  3_mprintf_long  
2db90 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2dba0 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 22  te3_mprintf_str"
2dbb0 2c 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c  ,           (Tcl
2dbc0 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65  _CmdProc*)sqlite
2dbd0 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 20 20 20  3_mprintf_str   
2dbe0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2dbf0 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72  te3_snprintf_str
2dc00 22 2c 20 20 20 20 20 20 20 20 20 20 28 54 63 6c  ",          (Tcl
2dc10 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65  _CmdProc*)sqlite
2dc20 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72 20 20  3_snprintf_str  
2dc30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2dc40 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f  te3_mprintf_stro
2dc50 6e 6c 79 22 2c 20 20 20 20 20 20 20 28 54 63 6c  nly",       (Tcl
2dc60 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65  _CmdProc*)sqlite
2dc70 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c  3_mprintf_stronl
2dc80 79 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  y},.     { "sqli
2dc90 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62  te3_mprintf_doub
2dca0 6c 65 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c  le",        (Tcl
2dcb0 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65  _CmdProc*)sqlite
2dcc0 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65  3_mprintf_double
2dcd0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2dce0 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c  te3_mprintf_scal
2dcf0 65 64 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c  ed",        (Tcl
2dd00 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65  _CmdProc*)sqlite
2dd10 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65 64  3_mprintf_scaled
2dd20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2dd30 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64  te3_mprintf_hexd
2dd40 6f 75 62 6c 65 22 2c 20 20 20 28 54 63 6c 5f 43  ouble",   (Tcl_C
2dd50 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
2dd60 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c  mprintf_hexdoubl
2dd70 65 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  e},.     { "sqli
2dd80 74 65 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f 74 65  te3_mprintf_z_te
2dd90 73 74 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c  st",        (Tcl
2dda0 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6d  _CmdProc*)test_m
2ddb0 70 72 69 6e 74 66 5f 7a 20 20 20 20 20 20 20 20  printf_z        
2ddc0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2ddd0 65 33 5f 6d 70 72 69 6e 74 66 5f 6e 5f 74 65 73  e3_mprintf_n_tes
2dde0 74 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f  t",        (Tcl_
2ddf0 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6d 70  CmdProc*)test_mp
2de00 72 69 6e 74 66 5f 6e 20 20 20 20 20 20 20 20 7d  rintf_n        }
2de10 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2de20 33 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74 22 2c  3_snprintf_int",
2de30 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
2de40 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 73 6e 70  mdProc*)test_snp
2de50 72 69 6e 74 66 5f 69 6e 74 20 20 20 20 20 7d 2c  rintf_int     },
2de60 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2de70 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
2de80 69 64 22 2c 20 20 20 20 20 28 54 63 6c 5f 43 6d  id",     (Tcl_Cm
2de90 64 50 72 6f 63 2a 29 74 65 73 74 5f 6c 61 73 74  dProc*)test_last
2dea0 5f 72 6f 77 69 64 20 20 20 20 20 20 20 7d 2c 0a  _rowid       },.
2deb0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2dec0 65 78 65 63 5f 70 72 69 6e 74 66 22 2c 20 20 20  exec_printf",   
2ded0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
2dee0 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 5f  Proc*)test_exec_
2def0 70 72 69 6e 74 66 20 20 20 20 20 20 7d 2c 0a 20  printf      },. 
2df00 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
2df10 78 65 63 5f 68 65 78 22 2c 20 20 20 20 20 20 20  xec_hex",       
2df20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
2df30 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 5f 68  roc*)test_exec_h
2df40 65 78 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  ex         },.  
2df50 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78     { "sqlite3_ex
2df60 65 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ec",            
2df70 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
2df80 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 20 20 20  oc*)test_exec   
2df90 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2dfa0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 65    { "sqlite3_exe
2dfb0 63 5f 6e 72 22 2c 20 20 20 20 20 20 20 20 20 20  c_nr",          
2dfc0 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
2dfd0 63 2a 29 74 65 73 74 5f 65 78 65 63 5f 6e 72 20  c*)test_exec_nr 
2dfe0 20 20 20 20 20 20 20 20 20 7d 2c 0a 23 69 66 6e           },.#ifn
2dff0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2e000 47 45 54 5f 54 41 42 4c 45 0a 20 20 20 20 20 7b  GET_TABLE.     {
2e010 20 22 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61   "sqlite3_get_ta
2e020 62 6c 65 5f 70 72 69 6e 74 66 22 2c 20 20 20 20  ble_printf",    
2e030 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
2e040 74 65 73 74 5f 67 65 74 5f 74 61 62 6c 65 5f 70  test_get_table_p
2e050 72 69 6e 74 66 20 7d 2c 0a 23 65 6e 64 69 66 0a  rintf },.#endif.
2e060 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2e070 63 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20 20  close",         
2e080 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
2e090 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 74 65 73  Proc*)sqlite_tes
2e0a0 74 5f 63 6c 6f 73 65 20 20 20 20 20 7d 2c 0a 20  t_close     },. 
2e0b0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
2e0c0 6c 6f 73 65 5f 76 32 22 2c 20 20 20 20 20 20 20  lose_v2",       
2e0d0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
2e0e0 72 6f 63 2a 29 73 71 6c 69 74 65 5f 74 65 73 74  roc*)sqlite_test
2e0f0 5f 63 6c 6f 73 65 5f 76 32 20 20 7d 2c 0a 20 20  _close_v2  },.  
2e100 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72     { "sqlite3_cr
2e110 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 22 2c 20  eate_function", 
2e120 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
2e130 6f 63 2a 29 74 65 73 74 5f 63 72 65 61 74 65 5f  oc*)test_create_
2e140 66 75 6e 63 74 69 6f 6e 20 20 7d 2c 0a 20 20 20  function  },.   
2e150 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65    { "sqlite3_cre
2e160 61 74 65 5f 61 67 67 72 65 67 61 74 65 22 2c 20  ate_aggregate", 
2e170 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
2e180 63 2a 29 74 65 73 74 5f 63 72 65 61 74 65 5f 61  c*)test_create_a
2e190 67 67 72 65 67 61 74 65 20 7d 2c 0a 20 20 20 20  ggregate },.    
2e1a0 20 7b 20 22 73 71 6c 69 74 65 5f 72 65 67 69 73   { "sqlite_regis
2e1b0 74 65 72 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f  ter_test_functio
2e1c0 6e 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63  n", (Tcl_CmdProc
2e1d0 2a 29 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f  *)test_register_
2e1e0 66 75 6e 63 20 20 20 20 7d 2c 0a 20 20 20 20 20  func    },.     
2e1f0 7b 20 22 73 71 6c 69 74 65 5f 61 62 6f 72 74 22  { "sqlite_abort"
2e200 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2e210 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
2e220 29 73 71 6c 69 74 65 5f 61 62 6f 72 74 20 20 20  )sqlite_abort   
2e230 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
2e240 20 22 73 71 6c 69 74 65 5f 62 69 6e 64 22 2c 20   "sqlite_bind", 
2e250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e260 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
2e270 74 65 73 74 5f 62 69 6e 64 20 20 20 20 20 20 20  test_bind       
2e280 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
2e290 22 62 72 65 61 6b 70 6f 69 6e 74 22 2c 20 20 20  "breakpoint",   
2e2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e2b0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
2e2c0 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 20 20  est_breakpoint  
2e2d0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
2e2e0 73 71 6c 69 74 65 33 5f 6b 65 79 22 2c 20 20 20  sqlite3_key",   
2e2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e300 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
2e310 73 74 5f 6b 65 79 20 20 20 20 20 20 20 20 20 20  st_key          
2e320 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
2e330 71 6c 69 74 65 33 5f 72 65 6b 65 79 22 2c 20 20  qlite3_rekey",  
2e340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2e350 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
2e360 74 5f 72 65 6b 65 79 20 20 20 20 20 20 20 20 20  t_rekey         
2e370 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
2e380 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 22 2c  lite_set_magic",
2e390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
2e3a0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
2e3b0 74 65 5f 73 65 74 5f 6d 61 67 69 63 20 20 20 20  te_set_magic    
2e3c0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2e3d0 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 22 2c  ite3_interrupt",
2e3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
2e3f0 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
2e400 69 6e 74 65 72 72 75 70 74 20 20 20 20 20 20 20  interrupt       
2e410 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2e420 74 65 5f 64 65 6c 65 74 65 5f 66 75 6e 63 74 69  te_delete_functi
2e430 6f 6e 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c  on",        (Tcl
2e440 5f 43 6d 64 50 72 6f 63 2a 29 64 65 6c 65 74 65  _CmdProc*)delete
2e450 5f 66 75 6e 63 74 69 6f 6e 20 20 20 20 20 20 20  _function       
2e460 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2e470 65 5f 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69  e_delete_collati
2e480 6f 6e 22 2c 20 20 20 20 20 20 20 28 54 63 6c 5f  on",       (Tcl_
2e490 43 6d 64 50 72 6f 63 2a 29 64 65 6c 65 74 65 5f  CmdProc*)delete_
2e4a0 63 6f 6c 6c 61 74 69 6f 6e 20 20 20 20 20 20 7d  collation      }
2e4b0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2e4c0 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74  3_get_autocommit
2e4d0 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43  ",        (Tcl_C
2e4e0 6d 64 50 72 6f 63 2a 29 67 65 74 5f 61 75 74 6f  mdProc*)get_auto
2e4f0 63 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 7d 2c  commit        },
2e500 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2e510 5f 73 74 61 63 6b 5f 75 73 65 64 22 2c 20 20 20  _stack_used",   
2e520 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
2e530 64 50 72 6f 63 2a 29 74 65 73 74 5f 73 74 61 63  dProc*)test_stac
2e540 6b 5f 75 73 65 64 20 20 20 20 20 20 20 7d 2c 0a  k_used       },.
2e550 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2e560 62 75 73 79 5f 74 69 6d 65 6f 75 74 22 2c 20 20  busy_timeout",  
2e570 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
2e580 50 72 6f 63 2a 29 74 65 73 74 5f 62 75 73 79 5f  Proc*)test_busy_
2e590 74 69 6d 65 6f 75 74 20 20 20 20 20 7d 2c 0a 20  timeout     },. 
2e5a0 20 20 20 20 7b 20 22 70 72 69 6e 74 66 22 2c 20      { "printf", 
2e5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e5c0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
2e5d0 72 6f 63 2a 29 74 65 73 74 5f 70 72 69 6e 74 66  roc*)test_printf
2e5e0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2e5f0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 49 6f 54     { "sqlite3IoT
2e600 72 61 63 65 22 2c 20 20 20 20 20 20 20 20 20 20  race",          
2e610 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2e620 2a 29 74 65 73 74 5f 69 6f 5f 74 72 61 63 65 20  *)test_io_trace 
2e630 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
2e640 7b 20 22 63 6c 61 6e 67 5f 73 61 6e 69 74 69 7a  { "clang_sanitiz
2e650 65 5f 61 64 64 72 65 73 73 22 2c 20 20 20 20 20  e_address",     
2e660 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
2e670 29 63 6c 61 6e 67 5f 73 61 6e 69 74 69 7a 65 5f  )clang_sanitize_
2e680 61 64 64 72 65 73 73 20 7d 2c 0a 20 20 7d 3b 0a  address },.  };.
2e690 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20    static struct 
2e6a0 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  {.     char *zNa
2e6b0 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f 4f 62 6a  me;.     Tcl_Obj
2e6c0 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b 0a  CmdProc *xProc;.
2e6d0 20 20 20 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e       void *clien
2e6e0 74 44 61 74 61 3b 0a 20 20 7d 20 61 4f 62 6a 43  tData;.  } aObjC
2e6f0 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20  md[] = {.     { 
2e700 22 73 71 6c 69 74 65 33 5f 63 6f 6e 6e 65 63 74  "sqlite3_connect
2e710 69 6f 6e 5f 70 6f 69 6e 74 65 72 22 2c 20 20 20  ion_pointer",   
2e720 20 67 65 74 5f 73 71 6c 69 74 65 5f 70 6f 69 6e   get_sqlite_poin
2e730 74 65 72 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b  ter, 0 },.     {
2e740 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69   "sqlite3_bind_i
2e750 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  nt",            
2e760 20 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74 2c    test_bind_int,
2e770 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20        0 },.     
2e780 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  { "sqlite3_bind_
2e790 7a 65 72 6f 62 6c 6f 62 22 2c 20 20 20 20 20 20  zeroblob",      
2e7a0 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 7a 65 72     test_bind_zer
2e7b0 6f 62 6c 6f 62 2c 20 30 20 7d 2c 0a 20 20 20 20  oblob, 0 },.    
2e7c0 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
2e7d0 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20  _int64",        
2e7e0 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e      test_bind_in
2e7f0 74 36 34 2c 20 20 20 20 30 20 7d 2c 0a 20 20 20  t64,    0 },.   
2e800 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
2e810 64 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20 20 20  d_double",      
2e820 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 64       test_bind_d
2e830 6f 75 62 6c 65 2c 20 20 20 30 20 7d 2c 0a 20 20  ouble,   0 },.  
2e840 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
2e850 6e 64 5f 6e 75 6c 6c 22 2c 20 20 20 20 20 20 20  nd_null",       
2e860 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f        test_bind_
2e870 6e 75 6c 6c 20 20 20 20 20 2c 30 20 7d 2c 0a 20  null     ,0 },. 
2e880 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
2e890 69 6e 64 5f 74 65 78 74 22 2c 20 20 20 20 20 20  ind_text",      
2e8a0 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64         test_bind
2e8b0 5f 74 65 78 74 20 20 20 20 20 2c 30 20 7d 2c 0a  _text     ,0 },.
2e8c0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2e8d0 62 69 6e 64 5f 74 65 78 74 31 36 22 2c 20 20 20  bind_text16",   
2e8e0 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e          test_bin
2e8f0 64 5f 74 65 78 74 31 36 20 20 20 2c 30 20 7d 2c  d_text16   ,0 },
2e900 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2e910 5f 62 69 6e 64 5f 62 6c 6f 62 22 2c 20 20 20 20  _bind_blob",    
2e920 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69           test_bi
2e930 6e 64 5f 62 6c 6f 62 20 20 20 20 20 2c 30 20 7d  nd_blob     ,0 }
2e940 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2e950 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
2e960 5f 63 6f 75 6e 74 22 2c 20 20 74 65 73 74 5f 62  _count",  test_b
2e970 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f  ind_parameter_co
2e980 75 6e 74 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20  unt, 0},.     { 
2e990 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61  "sqlite3_bind_pa
2e9a0 72 61 6d 65 74 65 72 5f 6e 61 6d 65 22 2c 20 20  rameter_name",  
2e9b0 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d   test_bind_param
2e9c0 65 74 65 72 5f 6e 61 6d 65 2c 20 20 30 7d 2c 0a  eter_name,  0},.
2e9d0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2e9e0 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69  bind_parameter_i
2e9f0 6e 64 65 78 22 2c 20 20 74 65 73 74 5f 62 69 6e  ndex",  test_bin
2ea00 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65  d_parameter_inde
2ea10 78 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73  x, 0},.     { "s
2ea20 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e  qlite3_clear_bin
2ea30 64 69 6e 67 73 22 2c 20 20 20 20 20 20 20 20 74  dings",        t
2ea40 65 73 74 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e  est_clear_bindin
2ea50 67 73 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22  gs, 0},.     { "
2ea60 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 22 2c 20  sqlite3_sleep", 
2ea70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea80 74 65 73 74 5f 73 6c 65 65 70 2c 20 20 20 20 20  test_sleep,     
2ea90 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20       0},.     { 
2eaa0 22 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65  "sqlite3_errcode
2eab0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2eac0 20 74 65 73 74 5f 65 72 72 63 6f 64 65 20 20 20   test_errcode   
2ead0 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
2eae0 20 22 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64   "sqlite3_extend
2eaf0 65 64 5f 65 72 72 63 6f 64 65 22 2c 20 20 20 20  ed_errcode",    
2eb00 20 20 74 65 73 74 5f 65 78 5f 65 72 72 63 6f 64    test_ex_errcod
2eb10 65 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20  e    ,0 },.     
2eb20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  { "sqlite3_errms
2eb30 67 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  g",             
2eb40 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67 20 20     test_errmsg  
2eb50 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
2eb60 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72 6d   { "sqlite3_errm
2eb70 73 67 31 36 22 2c 20 20 20 20 20 20 20 20 20 20  sg16",          
2eb80 20 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67 31      test_errmsg1
2eb90 36 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20  6      ,0 },.   
2eba0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70 65    { "sqlite3_ope
2ebb0 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  n",             
2ebc0 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e 20 20       test_open  
2ebd0 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20          ,0 },.  
2ebe0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70     { "sqlite3_op
2ebf0 65 6e 31 36 22 2c 20 20 20 20 20 20 20 20 20 20  en16",          
2ec00 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e 31        test_open1
2ec10 36 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20  6        ,0 },. 
2ec20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f      { "sqlite3_o
2ec30 70 65 6e 5f 76 32 22 2c 20 20 20 20 20 20 20 20  pen_v2",        
2ec40 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e         test_open
2ec50 5f 76 32 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a  _v2       ,0 },.
2ec60 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2ec70 63 6f 6d 70 6c 65 74 65 31 36 22 2c 20 20 20 20  complete16",    
2ec80 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6d          test_com
2ec90 70 6c 65 74 65 31 36 20 20 20 20 2c 30 20 7d 2c  plete16    ,0 },
2eca0 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ..     { "sqlite
2ecb0 33 5f 70 72 65 70 61 72 65 22 2c 20 20 20 20 20  3_prepare",     
2ecc0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 70            test_p
2ecd0 72 65 70 61 72 65 20 20 20 20 20 20 20 2c 30 20  repare       ,0 
2ece0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2ecf0 65 33 5f 70 72 65 70 61 72 65 31 36 22 2c 20 20  e3_prepare16",  
2ed00 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
2ed10 70 72 65 70 61 72 65 31 36 20 20 20 20 20 2c 30  prepare16     ,0
2ed20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2ed30 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 22 2c  te3_prepare_v2",
2ed40 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
2ed50 5f 70 72 65 70 61 72 65 5f 76 32 20 20 20 20 2c  _prepare_v2    ,
2ed60 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
2ed70 69 74 65 33 5f 70 72 65 70 61 72 65 5f 74 6b 74  ite3_prepare_tkt
2ed80 33 31 33 34 22 2c 20 20 20 20 20 20 20 74 65 73  3134",       tes
2ed90 74 5f 70 72 65 70 61 72 65 5f 74 6b 74 33 31 33  t_prepare_tkt313
2eda0 34 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73  4, 0},.     { "s
2edb0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36  qlite3_prepare16
2edc0 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20 20 74  _v2",          t
2edd0 65 73 74 5f 70 72 65 70 61 72 65 31 36 5f 76 32  est_prepare16_v2
2ede0 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
2edf0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
2ee00 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2ee10 74 65 73 74 5f 66 69 6e 61 6c 69 7a 65 20 20 20  test_finalize   
2ee20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
2ee30 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74  "sqlite3_stmt_st
2ee40 61 74 75 73 22 2c 20 20 20 20 20 20 20 20 20 20  atus",          
2ee50 20 74 65 73 74 5f 73 74 6d 74 5f 73 74 61 74 75   test_stmt_statu
2ee60 73 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  s   ,0 },.     {
2ee70 20 22 73 71 6c 69 74 65 33 5f 72 65 73 65 74 22   "sqlite3_reset"
2ee80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2ee90 20 20 74 65 73 74 5f 72 65 73 65 74 20 20 20 20    test_reset    
2eea0 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
2eeb0 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 70 69 72  { "sqlite3_expir
2eec0 65 64 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ed",            
2eed0 20 20 20 74 65 73 74 5f 65 78 70 69 72 65 64 20     test_expired 
2eee0 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
2eef0 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 72 61 6e   { "sqlite3_tran
2ef00 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 22 2c 20  sfer_bindings", 
2ef10 20 20 20 20 74 65 73 74 5f 74 72 61 6e 73 66 65      test_transfe
2ef20 72 5f 62 69 6e 64 20 2c 30 20 7d 2c 0a 20 20 20  r_bind ,0 },.   
2ef30 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 68 61    { "sqlite3_cha
2ef40 6e 67 65 73 22 2c 20 20 20 20 20 20 20 20 20 20  nges",          
2ef50 20 20 20 20 20 74 65 73 74 5f 63 68 61 6e 67 65       test_change
2ef60 73 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  s       ,0 },.  
2ef70 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 74     { "sqlite3_st
2ef80 65 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ep",            
2ef90 20 20 20 20 20 20 74 65 73 74 5f 73 74 65 70 20        test_step 
2efa0 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20           ,0 },. 
2efb0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73      { "sqlite3_s
2efc0 71 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ql",            
2efd0 20 20 20 20 20 20 20 74 65 73 74 5f 73 71 6c 20         test_sql 
2efe0 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a            ,0 },.
2eff0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2f000 6e 65 78 74 5f 73 74 6d 74 22 2c 20 20 20 20 20  next_stmt",     
2f010 20 20 20 20 20 20 20 20 74 65 73 74 5f 6e 65 78          test_nex
2f020 74 5f 73 74 6d 74 20 20 20 20 20 2c 30 20 7d 2c  t_stmt     ,0 },
2f030 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2f040 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 22 2c  _stmt_readonly",
2f050 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 74           test_st
2f060 6d 74 5f 72 65 61 64 6f 6e 6c 79 20 2c 30 20 7d  mt_readonly ,0 }
2f070 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2f080 33 5f 73 74 6d 74 5f 62 75 73 79 22 2c 20 20 20  3_stmt_busy",   
2f090 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 73            test_s
2f0a0 74 6d 74 5f 62 75 73 79 20 20 20 20 20 2c 30 20  tmt_busy     ,0 
2f0b0 7d 2c 0a 20 20 20 20 20 7b 20 22 75 73 65 73 5f  },.     { "uses_
2f0c0 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 22 2c 20 20  stmt_journal",  
2f0d0 20 20 20 20 20 20 20 20 20 20 20 75 73 65 73 5f             uses_
2f0e0 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 20 2c 30 20  stmt_journal ,0 
2f0f0 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  },..     { "sqli
2f100 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  te3_release_memo
2f110 72 79 22 2c 20 20 20 20 20 20 20 20 74 65 73 74  ry",        test
2f120 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 2c  _release_memory,
2f130 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20       0},.     { 
2f140 22 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65  "sqlite3_db_rele
2f150 61 73 65 5f 6d 65 6d 6f 72 79 22 2c 20 20 20 20  ase_memory",    
2f160 20 74 65 73 74 5f 64 62 5f 72 65 6c 65 61 73 65   test_db_release
2f170 5f 6d 65 6d 6f 72 79 2c 20 20 30 7d 2c 0a 20 20  _memory,  0},.  
2f180 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 64 62     { "sqlite3_db
2f190 5f 66 69 6c 65 6e 61 6d 65 22 2c 20 20 20 20 20  _filename",     
2f1a0 20 20 20 20 20 20 74 65 73 74 5f 64 62 5f 66 69        test_db_fi
2f1b0 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 30  lename,        0
2f1c0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2f1d0 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 22 2c  e3_db_readonly",
2f1e0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
2f1f0 64 62 5f 72 65 61 64 6f 6e 6c 79 2c 20 20 20 20  db_readonly,    
2f200 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22      0},.     { "
2f210 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61  sqlite3_soft_hea
2f220 70 5f 6c 69 6d 69 74 22 2c 20 20 20 20 20 20 20  p_limit",       
2f230 74 65 73 74 5f 73 6f 66 74 5f 68 65 61 70 5f 6c  test_soft_heap_l
2f240 69 6d 69 74 2c 20 20 20 20 30 7d 2c 0a 20 20 20  imit,    0},.   
2f250 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 68 72    { "sqlite3_thr
2f260 65 61 64 5f 63 6c 65 61 6e 75 70 22 2c 20 20 20  ead_cleanup",   
2f270 20 20 20 20 20 74 65 73 74 5f 74 68 72 65 61 64       test_thread
2f280 5f 63 6c 65 61 6e 75 70 2c 20 20 20 20 20 30 7d  _cleanup,     0}
2f290 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2f2a0 33 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74  3_pager_refcount
2f2b0 73 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f 70  s",       test_p
2f2c0 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 2c 20  ager_refcounts, 
2f2d0 20 20 20 30 7d 2c 0a 0a 20 20 20 20 20 7b 20 22     0},..     { "
2f2e0 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74  sqlite3_load_ext
2f2f0 65 6e 73 69 6f 6e 22 2c 20 20 20 20 20 20 20 20  ension",        
2f300 74 65 73 74 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  test_load_extens
2f310 69 6f 6e 2c 20 20 20 20 20 30 7d 2c 0a 20 20 20  ion,     0},.   
2f320 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 6e 61    { "sqlite3_ena
2f330 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  ble_load_extensi
2f340 6f 6e 22 2c 20 74 65 73 74 5f 65 6e 61 62 6c 65  on", test_enable
2f350 5f 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 30 7d  _load,        0}
2f360 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2f370 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c  3_extended_resul
2f380 74 5f 63 6f 64 65 73 22 2c 20 74 65 73 74 5f 65  t_codes", test_e
2f390 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63  xtended_result_c
2f3a0 6f 64 65 73 2c 20 30 7d 2c 0a 20 20 20 20 20 7b  odes, 0},.     {
2f3b0 20 22 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 22   "sqlite3_limit"
2f3c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2f3d0 20 20 74 65 73 74 5f 6c 69 6d 69 74 2c 20 20 20    test_limit,   
2f3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 7d                0}
2f3f0 2c 0a 0a 20 20 20 20 20 7b 20 22 73 61 76 65 5f  ,..     { "save_
2f400 70 72 6e 67 5f 73 74 61 74 65 22 2c 20 20 20 20  prng_state",    
2f410 20 20 20 20 20 20 20 20 20 20 20 73 61 76 65 5f             save_
2f420 70 72 6e 67 5f 73 74 61 74 65 2c 20 20 20 20 30  prng_state,    0
2f430 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65 73 74   },.     { "rest
2f440 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c  ore_prng_state",
2f450 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73 74              rest
2f460 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20  ore_prng_state, 
2f470 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65 73  0 },.     { "res
2f480 65 74 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c 20  et_prng_state", 
2f490 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73               res
2f4a0 65 74 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20 20  et_prng_state,  
2f4b0 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 61   0 },.     { "da
2f4c0 74 61 62 61 73 65 5f 6e 65 76 65 72 5f 63 6f 72  tabase_never_cor
2f4d0 72 75 70 74 22 2c 20 20 20 20 20 20 20 20 64 61  rupt",        da
2f4e0 74 61 62 61 73 65 5f 6e 65 76 65 72 5f 63 6f 72  tabase_never_cor
2f4f0 72 75 70 74 2c 20 30 7d 2c 0a 20 20 20 20 20 7b  rupt, 0},.     {
2f500 20 22 64 61 74 61 62 61 73 65 5f 6d 61 79 5f 62   "database_may_b
2f510 65 5f 63 6f 72 72 75 70 74 22 2c 20 20 20 20 20  e_corrupt",     
2f520 20 20 64 61 74 61 62 61 73 65 5f 6d 61 79 5f 62    database_may_b
2f530 65 5f 63 6f 72 72 75 70 74 2c 20 30 7d 2c 0a 20  e_corrupt, 0},. 
2f540 20 20 20 20 7b 20 22 6f 70 74 69 6d 69 7a 61 74      { "optimizat
2f550 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 22 2c 20 20 20  ion_control",   
2f560 20 20 20 20 20 20 20 6f 70 74 69 6d 69 7a 61 74         optimizat
2f570 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 2c 30 7d 2c 0a  ion_control,0},.
2f580 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
2f590 4e 0a 20 20 20 20 20 7b 20 22 6c 6f 63 6b 5f 77  N.     { "lock_w
2f5a0 69 6e 33 32 5f 66 69 6c 65 22 2c 20 20 20 20 20  in32_file",     
2f5b0 20 20 20 20 20 20 20 20 20 20 77 69 6e 33 32 5f            win32_
2f5c0 66 69 6c 65 5f 6c 6f 63 6b 2c 20 20 20 20 30 20  file_lock,    0 
2f5d0 7d 2c 0a 20 20 20 20 20 7b 20 22 65 78 69 73 74  },.     { "exist
2f5e0 73 5f 77 69 6e 33 32 5f 70 61 74 68 22 2c 20 20  s_win32_path",  
2f5f0 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 33 32             win32
2f600 5f 65 78 69 73 74 73 5f 70 61 74 68 2c 20 20 30  _exists_path,  0
2f610 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6e 64   },.     { "find
2f620 5f 77 69 6e 33 32 5f 66 69 6c 65 22 2c 20 20 20  _win32_file",   
2f630 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 33              win3
2f640 32 5f 66 69 6e 64 5f 66 69 6c 65 2c 20 20 20 20  2_find_file,    
2f650 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 65 6c  0 },.     { "del
2f660 65 74 65 5f 77 69 6e 33 32 5f 66 69 6c 65 22 2c  ete_win32_file",
2f670 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e               win
2f680 33 32 5f 64 65 6c 65 74 65 5f 66 69 6c 65 2c 20  32_delete_file, 
2f690 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6d 61   0 },.     { "ma
2f6a0 6b 65 5f 77 69 6e 33 32 5f 64 69 72 22 2c 20 20  ke_win32_dir",  
2f6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
2f6c0 6e 33 32 5f 6d 6b 64 69 72 2c 20 20 20 20 20 20  n32_mkdir,      
2f6d0 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72    0 },.     { "r
2f6e0 65 6d 6f 76 65 5f 77 69 6e 33 32 5f 64 69 72 22  emove_win32_dir"
2f6f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  ,              w
2f700 69 6e 33 32 5f 72 6d 64 69 72 2c 20 20 20 20 20  in32_rmdir,     
2f710 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 20     0 },.#endif. 
2f720 20 20 20 20 7b 20 22 74 63 6c 5f 6f 62 6a 70 72      { "tcl_objpr
2f730 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  oc",            
2f740 20 20 20 20 20 20 20 72 75 6e 41 73 4f 62 6a 50         runAsObjP
2f750 72 6f 63 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a  roc,       0 },.
2f760 0a 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  .     /* sqlite3
2f770 5f 63 6f 6c 75 6d 6e 5f 2a 28 29 20 41 50 49 20  _column_*() API 
2f780 2a 2f 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  */.     { "sqlit
2f790 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 22  e3_column_count"
2f7a0 2c 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f  ,          test_
2f7b0 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 20 2c 30  column_count  ,0
2f7c0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2f7d0 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 22 2c  te3_data_count",
2f7e0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
2f7f0 5f 64 61 74 61 5f 63 6f 75 6e 74 20 20 20 20 2c  _data_count    ,
2f800 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
2f810 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
2f820 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ",           tes
2f830 74 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 20 20  t_column_type   
2f840 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
2f850 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
2f860 62 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65  b",           te
2f870 73 74 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20 20  st_column_blob  
2f880 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
2f890 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f  qlite3_column_do
2f8a0 75 62 6c 65 22 2c 20 20 20 20 20 20 20 20 20 74  uble",         t
2f8b0 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c  est_column_doubl
2f8c0 65 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22  e ,0 },.     { "
2f8d0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
2f8e0 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 20  nt64",          
2f8f0 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  test_column_int6
2f900 34 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20  4  ,0 },.     { 
2f910 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
2f920 74 65 78 74 22 2c 20 20 20 74 65 73 74 5f 73 74  text",   test_st
2f930 6d 74 5f 75 74 66 38 2c 20 20 28 76 6f 69 64 2a  mt_utf8,  (void*
2f940 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
2f950 74 65 78 74 20 7d 2c 0a 20 20 20 20 20 7b 20 22  text },.     { "
2f960 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
2f970 61 6d 65 22 2c 20 20 20 74 65 73 74 5f 73 74 6d  ame",   test_stm
2f980 74 5f 75 74 66 38 2c 20 20 28 76 6f 69 64 2a 29  t_utf8,  (void*)
2f990 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
2f9a0 61 6d 65 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  ame },.     { "s
2f9b0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
2f9c0 74 22 2c 20 20 20 20 74 65 73 74 5f 73 74 6d 74  t",    test_stmt
2f9d0 5f 69 6e 74 2c 20 20 20 28 76 6f 69 64 2a 29 73  _int,   (void*)s
2f9e0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
2f9f0 74 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  t  },.     { "sq
2fa00 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
2fa10 65 73 22 2c 20 20 74 65 73 74 5f 73 74 6d 74 5f  es",  test_stmt_
2fa20 69 6e 74 2c 20 20 20 28 76 6f 69 64 2a 29 73 71  int,   (void*)sq
2fa30 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
2fa40 65 73 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c  es},.#ifndef SQL
2fa50 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50  ITE_OMIT_DECLTYP
2fa60 45 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  E.     { "sqlite
2fa70 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70  3_column_decltyp
2fa80 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74 66  e",test_stmt_utf
2fa90 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  8,(void*)sqlite3
2faa0 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65  _column_decltype
2fab0 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  },.#endif.#ifdef
2fac0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
2fad0 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 7b  OLUMN_METADATA.{
2fae0 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
2faf0 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 22 2c  _database_name",
2fb00 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 28  test_stmt_utf8,(
2fb10 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f  void*)sqlite3_co
2fb20 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61  lumn_database_na
2fb30 6d 65 7d 2c 0a 7b 20 22 73 71 6c 69 74 65 33 5f  me},.{ "sqlite3_
2fb40 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d  column_table_nam
2fb50 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74 66  e",test_stmt_utf
2fb60 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  8,(void*)sqlite3
2fb70 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61  _column_table_na
2fb80 6d 65 7d 2c 0a 7b 20 22 73 71 6c 69 74 65 33 5f  me},.{ "sqlite3_
2fb90 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61  column_origin_na
2fba0 6d 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74  me",test_stmt_ut
2fbb0 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65  f8,(void*)sqlite
2fbc0 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f  3_column_origin_
2fbd0 6e 61 6d 65 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23  name},.#endif..#
2fbe0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2fbf0 49 54 5f 55 54 46 31 36 0a 20 20 20 20 20 7b 20  IT_UTF16.     { 
2fc00 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
2fc10 62 79 74 65 73 31 36 22 2c 20 74 65 73 74 5f 73  bytes16", test_s
2fc20 74 6d 74 5f 69 6e 74 2c 20 28 76 6f 69 64 2a 29  tmt_int, (void*)
2fc30 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
2fc40 79 74 65 73 31 36 20 7d 2c 0a 20 20 20 20 20 7b  ytes16 },.     {
2fc50 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
2fc60 5f 74 65 78 74 31 36 22 2c 20 20 74 65 73 74 5f  _text16",  test_
2fc70 73 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f 69  stmt_utf16, (voi
2fc80 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
2fc90 6e 5f 74 65 78 74 31 36 7d 2c 0a 20 20 20 20 20  n_text16},.     
2fca0 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
2fcb0 6e 5f 6e 61 6d 65 31 36 22 2c 20 20 74 65 73 74  n_name16",  test
2fcc0 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f  _stmt_utf16, (vo
2fcd0 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  id*)sqlite3_colu
2fce0 6d 6e 5f 6e 61 6d 65 31 36 7d 2c 0a 20 20 20 20  mn_name16},.    
2fcf0 20 7b 20 22 61 64 64 5f 61 6c 69 67 6e 6d 65 6e   { "add_alignmen
2fd00 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e  t_test_collation
2fd10 73 22 2c 20 61 64 64 5f 61 6c 69 67 6e 6d 65 6e  s", add_alignmen
2fd20 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e  t_test_collation
2fd30 73 2c 20 30 20 20 20 20 20 20 7d 2c 0a 23 69 66  s, 0      },.#if
2fd40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2fd50 5f 44 45 43 4c 54 59 50 45 0a 20 20 20 20 20 7b  _DECLTYPE.     {
2fd60 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
2fd70 5f 64 65 63 6c 74 79 70 65 31 36 22 2c 74 65 73  _decltype16",tes
2fd80 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 28 76 6f  t_stmt_utf16,(vo
2fd90 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  id*)sqlite3_colu
2fda0 6d 6e 5f 64 65 63 6c 74 79 70 65 31 36 7d 2c 0a  mn_decltype16},.
2fdb0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
2fdc0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
2fdd0 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 7b 22 73 71  MN_METADATA.{"sq
2fde0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74  lite3_column_dat
2fdf0 61 62 61 73 65 5f 6e 61 6d 65 31 36 22 2c 0a 20  abase_name16",. 
2fe00 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36   test_stmt_utf16
2fe10 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  , (void*)sqlite3
2fe20 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65  _column_database
2fe30 5f 6e 61 6d 65 31 36 7d 2c 0a 7b 22 73 71 6c 69  _name16},.{"sqli
2fe40 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65  te3_column_table
2fe50 5f 6e 61 6d 65 31 36 22 2c 20 74 65 73 74 5f 73  _name16", test_s
2fe60 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f 69 64  tmt_utf16, (void
2fe70 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
2fe80 5f 74 61 62 6c 65 5f 6e 61 6d 65 31 36 7d 2c 0a  _table_name16},.
2fe90 7b 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  {"sqlite3_column
2fea0 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 31 36 22 2c  _origin_name16",
2feb0 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36   test_stmt_utf16
2fec0 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  , (void*)sqlite3
2fed0 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e  _column_origin_n
2fee0 61 6d 65 31 36 7d 2c 0a 23 65 6e 64 69 66 0a 23  ame16},.#endif.#
2fef0 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71  endif.     { "sq
2ff00 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
2ff10 6c 61 74 69 6f 6e 5f 76 32 22 2c 20 74 65 73 74  lation_v2", test
2ff20 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
2ff30 6e 5f 76 32 2c 20 30 20 7d 2c 0a 20 20 20 20 20  n_v2, 0 },.     
2ff40 7b 20 22 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61  { "sqlite3_globa
2ff50 6c 5f 72 65 63 6f 76 65 72 22 2c 20 20 20 20 20  l_recover",     
2ff60 74 65 73 74 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f  test_global_reco
2ff70 76 65 72 2c 20 30 20 20 20 7d 2c 0a 20 20 20 20  ver, 0   },.    
2ff80 20 7b 20 22 77 6f 72 6b 69 6e 67 5f 36 34 62 69   { "working_64bi
2ff90 74 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20  t_int",         
2ffa0 20 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69   working_64bit_i
2ffb0 6e 74 2c 20 20 20 30 20 20 20 7d 2c 0a 20 20 20  nt,   0   },.   
2ffc0 20 20 7b 20 22 76 66 73 5f 75 6e 6c 69 6e 6b 5f    { "vfs_unlink_
2ffd0 74 65 73 74 22 2c 20 20 20 20 20 20 20 20 20 20  test",          
2ffe0 20 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73    vfs_unlink_tes
2fff0 74 2c 20 20 20 20 20 30 20 20 20 7d 2c 0a 20 20  t,     0   },.  
30000 20 20 20 7b 20 22 76 66 73 5f 69 6e 69 74 66 61     { "vfs_initfa
30010 69 6c 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20  il_test",       
30020 20 20 20 76 66 73 5f 69 6e 69 74 66 61 69 6c 5f     vfs_initfail_
30030 74 65 73 74 2c 20 20 20 30 20 20 20 7d 2c 0a 20  test,   0   },. 
30040 20 20 20 20 7b 20 22 76 66 73 5f 75 6e 72 65 67      { "vfs_unreg
30050 69 73 74 65 72 5f 61 6c 6c 22 2c 20 20 20 20 20  ister_all",     
30060 20 20 20 20 76 66 73 5f 75 6e 72 65 67 69 73 74      vfs_unregist
30070 65 72 5f 61 6c 6c 2c 20 20 30 20 20 20 7d 2c 0a  er_all,  0   },.
30080 20 20 20 20 20 7b 20 22 76 66 73 5f 72 65 72 65       { "vfs_rere
30090 67 69 73 74 65 72 5f 61 6c 6c 22 2c 20 20 20 20  gister_all",    
300a0 20 20 20 20 20 76 66 73 5f 72 65 72 65 67 69 73       vfs_reregis
300b0 74 65 72 5f 61 6c 6c 2c 20 20 30 20 20 20 7d 2c  ter_all,  0   },
300c0 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f  .     { "file_co
300d0 6e 74 72 6f 6c 5f 74 65 73 74 22 2c 20 20 20 20  ntrol_test",    
300e0 20 20 20 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72        file_contr
300f0 6f 6c 5f 74 65 73 74 2c 20 20 20 30 20 20 20 7d  ol_test,   0   }
30100 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63  ,.     { "file_c
30110 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f  ontrol_lasterrno
30120 5f 74 65 73 74 22 2c 20 66 69 6c 65 5f 63 6f 6e  _test", file_con
30130 74 72 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f 5f 74  trol_lasterrno_t
30140 65 73 74 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20  est,  0   },.   
30150 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f    { "file_contro
30160 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74  l_lockproxy_test
30170 22 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  ", file_control_
30180 6c 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74 2c 20  lockproxy_test, 
30190 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   0   },.     { "
301a0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75  file_control_chu
301b0 6e 6b 73 69 7a 65 5f 74 65 73 74 22 2c 20 66 69  nksize_test", fi
301c0 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b  le_control_chunk
301d0 73 69 7a 65 5f 74 65 73 74 2c 20 20 30 20 20 20  size_test,  0   
301e0 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f  },.     { "file_
301f0 63 6f 6e 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74  control_sizehint
30200 5f 74 65 73 74 22 2c 20 20 66 69 6c 65 5f 63 6f  _test",  file_co
30210 6e 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74  ntrol_sizehint_t
30220 65 73 74 2c 20 20 20 30 20 20 20 7d 2c 0a 23 69  est,   0   },.#i
30230 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a  f SQLITE_OS_WIN.
30240 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e       { "file_con
30250 74 72 6f 6c 5f 77 69 6e 33 32 5f 61 76 5f 72 65  trol_win32_av_re
30260 74 72 79 22 2c 20 66 69 6c 65 5f 63 6f 6e 74 72  try", file_contr
30270 6f 6c 5f 77 69 6e 33 32 5f 61 76 5f 72 65 74 72  ol_win32_av_retr
30280 79 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20  y,  0   },.     
30290 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  { "file_control_
302a0 77 69 6e 33 32 5f 73 65 74 5f 68 61 6e 64 6c 65  win32_set_handle
302b0 22 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  ", file_control_
302c0 77 69 6e 33 32 5f 73 65 74 5f 68 61 6e 64 6c 65  win32_set_handle
302d0 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20  , 0  },.#endif. 
302e0 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74      { "file_cont
302f0 72 6f 6c 5f 70 65 72 73 69 73 74 5f 77 61 6c 22  rol_persist_wal"
30300 2c 20 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  ,    file_contro
30310 6c 5f 70 65 72 73 69 73 74 5f 77 61 6c 2c 20 20  l_persist_wal,  
30320 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b     0   },.     {
30330 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70   "file_control_p
30340 6f 77 65 72 73 61 66 65 5f 6f 76 65 72 77 72 69  owersafe_overwri
30350 74 65 22 2c 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te",file_control
30360 5f 70 6f 77 65 72 73 61 66 65 5f 6f 76 65 72 77  _powersafe_overw
30370 72 69 74 65 2c 30 7d 2c 0a 20 20 20 20 20 7b 20  rite,0},.     { 
30380 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66  "file_control_vf
30390 73 6e 61 6d 65 22 2c 20 20 20 20 20 20 20 20 66  sname",        f
303a0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e  ile_control_vfsn
303b0 61 6d 65 2c 20 20 20 20 20 20 20 20 20 30 20 20  ame,         0  
303c0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65   },.     { "file
303d0 5f 63 6f 6e 74 72 6f 6c 5f 74 65 6d 70 66 69 6c  _control_tempfil
303e0 65 6e 61 6d 65 22 2c 20 20 20 66 69 6c 65 5f 63  ename",   file_c
303f0 6f 6e 74 72 6f 6c 5f 74 65 6d 70 66 69 6c 65 6e  ontrol_tempfilen
30400 61 6d 65 2c 20 20 20 20 30 20 20 20 7d 2c 0a 20  ame,    0   },. 
30410 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 76      { "sqlite3_v
30420 66 73 5f 6c 69 73 74 22 2c 20 20 20 20 20 20 20  fs_list",       
30430 20 20 20 20 76 66 73 5f 6c 69 73 74 2c 20 20 20      vfs_list,   
30440 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20    0   },.     { 
30450 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f  "sqlite3_create_
30460 66 75 6e 63 74 69 6f 6e 5f 76 32 22 2c 20 74 65  function_v2", te
30470 73 74 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  st_create_functi
30480 6f 6e 5f 76 32 2c 20 30 20 7d 2c 0a 0a 20 20 20  on_v2, 0 },..   
30490 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 73 20 66    /* Functions f
304a0 72 6f 6d 20 6f 73 2e 68 20 2a 2f 0a 23 69 66 6e  rom os.h */.#ifn
304b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
304c0 55 54 46 31 36 0a 20 20 20 20 20 7b 20 22 61 64  UTF16.     { "ad
304d0 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c  d_test_collate",
304e0 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c          test_col
304f0 6c 61 74 65 2c 20 30 20 20 20 20 20 20 20 20 20  late, 0         
30500 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64     },.     { "ad
30510 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e  d_test_collate_n
30520 65 65 64 65 64 22 2c 20 74 65 73 74 5f 63 6f 6c  eeded", test_col
30530 6c 61 74 65 5f 6e 65 65 64 65 64 2c 20 30 20 20  late_needed, 0  
30540 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64     },.     { "ad
30550 64 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22  d_test_function"
30560 2c 20 20 20 20 20 20 20 74 65 73 74 5f 66 75 6e  ,       test_fun
30570 63 74 69 6f 6e 2c 20 30 20 20 20 20 20 20 20 20  ction, 0        
30580 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64     },.     { "ad
30590 64 5f 74 65 73 74 5f 75 74 66 31 36 62 69 6e 5f  d_test_utf16bin_
305a0 63 6f 6c 6c 61 74 65 22 2c 20 20 20 20 74 65 73  collate",    tes
305b0 74 5f 75 74 66 31 36 62 69 6e 5f 63 6f 6c 6c 61  t_utf16bin_colla
305c0 74 65 2c 20 30 20 20 20 20 20 20 20 20 7d 2c 0a  te, 0        },.
305d0 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73  #endif.     { "s
305e0 71 6c 69 74 65 33 5f 74 65 73 74 5f 65 72 72 73  qlite3_test_errs
305f0 74 72 22 2c 20 20 20 20 20 74 65 73 74 5f 65 72  tr",     test_er
30600 72 73 74 72 2c 20 30 20 20 20 20 20 20 20 20 20  rstr, 0         
30610 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 74      },.     { "t
30620 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79 70 65  cl_variable_type
30630 22 2c 20 20 20 20 20 20 20 74 63 6c 5f 76 61 72  ",       tcl_var
30640 69 61 62 6c 65 5f 74 79 70 65 2c 20 30 20 20 20  iable_type, 0   
30650 20 20 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53      },.#ifndef S
30660 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
30670 44 5f 43 41 43 48 45 0a 20 20 20 20 20 7b 20 22  D_CACHE.     { "
30680 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73  sqlite3_enable_s
30690 68 61 72 65 64 5f 63 61 63 68 65 22 2c 20 74 65  hared_cache", te
306a0 73 74 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64  st_enable_shared
306b0 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  , 0  },.     { "
306c0 73 71 6c 69 74 65 33 5f 73 68 61 72 65 64 5f 63  sqlite3_shared_c
306d0 61 63 68 65 5f 72 65 70 6f 72 74 22 2c 20 73 71  ache_report", sq
306e0 6c 69 74 65 33 42 74 72 65 65 53 68 61 72 65 64  lite3BtreeShared
306f0 43 61 63 68 65 52 65 70 6f 72 74 2c 20 30 7d 2c  CacheReport, 0},
30700 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22  .#endif.     { "
30710 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
30720 6f 6e 5f 6e 75 6d 62 65 72 22 2c 20 74 65 73 74  on_number", test
30730 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62  _libversion_numb
30740 65 72 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b  er, 0  },.     {
30750 20 22 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f   "sqlite3_table_
30760 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 22  column_metadata"
30770 2c 20 74 65 73 74 5f 74 61 62 6c 65 5f 63 6f 6c  , test_table_col
30780 75 6d 6e 5f 6d 65 74 61 64 61 74 61 2c 20 30 20  umn_metadata, 0 
30790 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   },.#ifndef SQLI
307a0 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
307b0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
307c0 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 22 2c 20 74  _blob_reopen", t
307d0 65 73 74 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 2c  est_blob_reopen,
307e0 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20   0  },.#endif.  
307f0 20 20 20 7b 20 22 70 63 61 63 68 65 5f 73 74 61     { "pcache_sta
30800 74 73 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f  ts",       test_
30810 70 63 61 63 68 65 5f 73 74 61 74 73 2c 20 30 20  pcache_stats, 0 
30820 20 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54   },.#ifdef SQLIT
30830 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f  E_ENABLE_UNLOCK_
30840 4e 4f 54 49 46 59 0a 20 20 20 20 20 7b 20 22 73  NOTIFY.     { "s
30850 71 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f  qlite3_unlock_no
30860 74 69 66 79 22 2c 20 74 65 73 74 5f 75 6e 6c 6f  tify", test_unlo
30870 63 6b 5f 6e 6f 74 69 66 79 2c 20 30 20 20 7d 2c  ck_notify, 0  },
30880 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22  .#endif.     { "
30890 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
308a0 6b 70 6f 69 6e 74 22 2c 20 20 20 74 65 73 74 5f  kpoint",   test_
308b0 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 2c 20  wal_checkpoint, 
308c0 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  0  },.     { "sq
308d0 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
308e0 6f 69 6e 74 5f 76 32 22 2c 74 65 73 74 5f 77 61  oint_v2",test_wa
308f0 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 2c  l_checkpoint_v2,
30900 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 74   0  },.     { "t
30910 65 73 74 5f 73 71 6c 69 74 65 33 5f 6c 6f 67 22  est_sqlite3_log"
30920 2c 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 73  ,         test_s
30930 71 6c 69 74 65 33 5f 6c 6f 67 2c 20 30 20 20 7d  qlite3_log, 0  }
30940 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ,.#ifndef SQLITE
30950 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
30960 20 20 20 7b 20 22 70 72 69 6e 74 5f 65 78 70 6c     { "print_expl
30970 61 69 6e 5f 71 75 65 72 79 5f 70 6c 61 6e 22 2c  ain_query_plan",
30980 20 74 65 73 74 5f 70 72 69 6e 74 5f 65 71 70 2c   test_print_eqp,
30990 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20   0  },.#endif.  
309a0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 65     { "sqlite3_te
309b0 73 74 5f 63 6f 6e 74 72 6f 6c 22 2c 20 74 65 73  st_control", tes
309c0 74 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 20 7d  t_test_control }
309d0 2c 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ,.#if SQLITE_OS_
309e0 55 4e 49 58 0a 20 20 20 20 20 7b 20 22 67 65 74  UNIX.     { "get
309f0 72 75 73 61 67 65 22 2c 20 74 65 73 74 5f 67 65  rusage", test_ge
30a00 74 72 75 73 61 67 65 20 7d 2c 0a 23 65 6e 64 69  trusage },.#endi
30a10 66 0a 20 20 20 20 20 7b 20 22 6c 6f 61 64 5f 73  f.     { "load_s
30a20 74 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 22  tatic_extension"
30a30 2c 20 74 63 6c 4c 6f 61 64 53 74 61 74 69 63 45  , tclLoadStaticE
30a40 78 74 65 6e 73 69 6f 6e 43 6d 64 20 7d 2c 0a 20  xtensionCmd },. 
30a50 20 20 20 20 7b 20 22 73 6f 72 74 65 72 5f 74 65      { "sorter_te
30a60 73 74 5f 66 61 6b 65 68 65 61 70 22 2c 20 73 6f  st_fakeheap", so
30a70 72 74 65 72 5f 74 65 73 74 5f 66 61 6b 65 68 65  rter_test_fakehe
30a80 61 70 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 6f  ap },.     { "so
30a90 72 74 65 72 5f 74 65 73 74 5f 73 6f 72 74 34 5f  rter_test_sort4_
30aa0 68 65 6c 70 65 72 22 2c 20 73 6f 72 74 65 72 5f  helper", sorter_
30ab0 74 65 73 74 5f 73 6f 72 74 34 5f 68 65 6c 70 65  test_sort4_helpe
30ac0 72 20 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c 49  r },.#ifdef SQLI
30ad0 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
30ae0 43 41 54 49 4f 4e 0a 20 20 20 20 20 7b 20 22 73  CATION.     { "s
30af0 71 6c 69 74 65 33 5f 75 73 65 72 5f 61 75 74 68  qlite3_user_auth
30b00 65 6e 74 69 63 61 74 65 22 2c 20 74 65 73 74 5f  enticate", test_
30b10 75 73 65 72 5f 61 75 74 68 65 6e 74 69 63 61 74  user_authenticat
30b20 65 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22  e, 0 },.     { "
30b30 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 61 64 64  sqlite3_user_add
30b40 22 2c 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ",          test
30b50 5f 75 73 65 72 5f 61 64 64 2c 20 20 20 20 20 20  _user_add,      
30b60 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20      0 },.     { 
30b70 22 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 63 68  "sqlite3_user_ch
30b80 61 6e 67 65 22 2c 20 20 20 20 20 20 20 74 65 73  ange",       tes
30b90 74 5f 75 73 65 72 5f 63 68 61 6e 67 65 2c 20 20  t_user_change,  
30ba0 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b       0 },.     {
30bb0 20 22 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64   "sqlite3_user_d
30bc0 65 6c 65 74 65 22 2c 20 20 20 20 20 20 20 74 65  elete",       te
30bd0 73 74 5f 75 73 65 72 5f 64 65 6c 65 74 65 2c 20  st_user_delete, 
30be0 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
30bf0 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
30c00 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
30c10 53 54 41 54 55 53 0a 20 20 20 20 20 7b 20 22 73  STATUS.     { "s
30c20 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e  qlite3_stmt_scan
30c30 73 74 61 74 75 73 22 2c 20 20 20 20 20 20 20 74  status",       t
30c40 65 73 74 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  est_stmt_scansta
30c50 74 75 73 2c 20 20 20 30 20 7d 2c 0a 20 20 20 20  tus,   0 },.    
30c60 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 6d 74   { "sqlite3_stmt
30c70 5f 73 63 61 6e 73 74 61 74 75 73 5f 72 65 73 65  _scanstatus_rese
30c80 74 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f 73 63  t", test_stmt_sc
30c90 61 6e 73 74 61 74 75 73 5f 72 65 73 65 74 2c 20  anstatus_reset, 
30ca0 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 20    0 },.#endif.. 
30cb0 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74   };.  static int
30cc0 20 62 69 74 6d 61 73 6b 5f 73 69 7a 65 20 3d 20   bitmask_size = 
30cd0 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a  sizeof(Bitmask)*
30ce0 38 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 65 78  8;.  int i;.  ex
30cf0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
30d00 5f 73 79 6e 63 5f 63 6f 75 6e 74 2c 20 73 71 6c  _sync_count, sql
30d10 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
30d20 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  unt;.  extern in
30d30 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65  t sqlite3_opente
30d40 6d 70 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  mp_count;.  exte
30d50 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c  rn int sqlite3_l
30d60 69 6b 65 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74  ike_count;.  ext
30d70 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
30d80 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 3b 0a 20  xferopt_count;. 
30d90 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
30da0 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
30db0 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e  _count;.  extern
30dc0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67   int sqlite3_pag
30dd0 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74  er_writedb_count
30de0 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
30df0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
30e00 74 65 6a 5f 63 6f 75 6e 74 3b 0a 23 69 66 20 53  tej_count;.#if S
30e10 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 20 20 65  QLITE_OS_WIN.  e
30e20 78 74 65 72 6e 20 4c 4f 4e 47 20 76 6f 6c 61 74  xtern LONG volat
30e30 69 6c 65 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74  ile sqlite3_os_t
30e40 79 70 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  ype;.#endif.#ifd
30e50 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
30e60 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
30e70 69 74 65 33 57 68 65 72 65 54 72 61 63 65 3b 0a  ite3WhereTrace;.
30e80 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
30e90 69 74 65 33 4f 53 54 72 61 63 65 3b 0a 20 20 65  ite3OSTrace;.  e
30ea0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
30eb0 33 57 61 6c 54 72 61 63 65 3b 0a 23 65 6e 64 69  3WalTrace;.#endi
30ec0 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
30ed0 54 45 53 54 0a 23 69 66 64 65 66 20 53 51 4c 49  TEST.#ifdef SQLI
30ee0 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 0a 20  TE_ENABLE_FTS3. 
30ef0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
30f00 74 65 33 5f 66 74 73 33 5f 65 6e 61 62 6c 65 5f  te3_fts3_enable_
30f10 70 61 72 65 6e 74 68 65 73 65 73 3b 0a 23 65 6e  parentheses;.#en
30f20 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 66 6f  dif.#endif..  fo
30f30 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
30f40 61 43 6d 64 29 2f 73 69 7a 65 6f 66 28 61 43 6d  aCmd)/sizeof(aCm
30f50 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  d[0]); i++){.   
30f60 20 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61   Tcl_CreateComma
30f70 6e 64 28 69 6e 74 65 72 70 2c 20 61 43 6d 64 5b  nd(interp, aCmd[
30f80 69 5d 2e 7a 4e 61 6d 65 2c 20 61 43 6d 64 5b 69  i].zName, aCmd[i
30f90 5d 2e 78 50 72 6f 63 2c 20 30 2c 20 30 29 3b 0a  ].xProc, 0, 0);.
30fa0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
30fb0 3c 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64 29  <sizeof(aObjCmd)
30fc0 2f 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64 5b  /sizeof(aObjCmd[
30fd0 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54  0]); i++){.    T
30fe0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
30ff0 61 6e 64 28 69 6e 74 65 72 70 2c 20 61 4f 62 6a  and(interp, aObj
31000 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 0a 20  Cmd[i].zName, . 
31010 20 20 20 20 20 20 20 61 4f 62 6a 43 6d 64 5b 69         aObjCmd[i
31020 5d 2e 78 50 72 6f 63 2c 20 61 4f 62 6a 43 6d 64  ].xProc, aObjCmd
31030 5b 69 5d 2e 63 6c 69 65 6e 74 44 61 74 61 2c 20  [i].clientData, 
31040 30 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 4c 69  0);.  }.  Tcl_Li
31050 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
31060 71 6c 69 74 65 5f 73 65 61 72 63 68 5f 63 6f 75  qlite_search_cou
31070 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61  nt", .      (cha
31080 72 2a 29 26 73 71 6c 69 74 65 33 5f 73 65 61 72  r*)&sqlite3_sear
31090 63 68 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49  ch_count, TCL_LI
310a0 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c  NK_INT);.  Tcl_L
310b0 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
310c0 73 71 6c 69 74 65 5f 66 6f 75 6e 64 5f 63 6f 75  sqlite_found_cou
310d0 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61  nt", .      (cha
310e0 72 2a 29 26 73 71 6c 69 74 65 33 5f 66 6f 75 6e  r*)&sqlite3_foun
310f0 64 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  d_count, TCL_LIN
31100 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
31110 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
31120 71 6c 69 74 65 5f 73 6f 72 74 5f 63 6f 75 6e 74  qlite_sort_count
31130 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a  ", .      (char*
31140 29 26 73 71 6c 69 74 65 33 5f 73 6f 72 74 5f 63  )&sqlite3_sort_c
31150 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
31160 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
31170 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
31180 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a 65  te3_max_blobsize
31190 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a  ", .      (char*
311a0 29 26 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c  )&sqlite3_max_bl
311b0 6f 62 73 69 7a 65 2c 20 54 43 4c 5f 4c 49 4e 4b  obsize, TCL_LINK
311c0 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e  _INT);.  Tcl_Lin
311d0 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
311e0 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 22  lite_like_count"
311f0 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  , .      (char*)
31200 26 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f 63 6f  &sqlite3_like_co
31210 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  unt, TCL_LINK_IN
31220 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  T);.  Tcl_LinkVa
31230 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
31240 65 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e  e_interrupt_coun
31250 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72  t", .      (char
31260 2a 29 26 73 71 6c 69 74 65 33 5f 69 6e 74 65 72  *)&sqlite3_inter
31270 72 75 70 74 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  rupt_count, TCL_
31280 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
31290 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
312a0 20 22 73 71 6c 69 74 65 5f 6f 70 65 6e 5f 66 69   "sqlite_open_fi
312b0 6c 65 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20  le_count", .    
312c0 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
312d0 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e  3_open_file_coun
312e0 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  t, TCL_LINK_INT)
312f0 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
31300 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
31310 63 75 72 72 65 6e 74 5f 74 69 6d 65 22 2c 20 0a  current_time", .
31320 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
31330 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
31340 6d 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  me, TCL_LINK_INT
31350 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  );.#if SQLITE_OS
31360 5f 55 4e 49 58 20 26 26 20 64 65 66 69 6e 65 64  _UNIX && defined
31370 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
31380 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
31390 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 54 63 6c  KING_STYLE.  Tcl
313a0 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
313b0 20 22 73 71 6c 69 74 65 5f 68 6f 73 74 69 64 5f   "sqlite_hostid_
313c0 6e 75 6d 22 2c 20 0a 20 20 20 20 20 20 28 63 68  num", .      (ch
313d0 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 68 6f 73  ar*)&sqlite3_hos
313e0 74 69 64 5f 6e 75 6d 2c 20 54 43 4c 5f 4c 49 4e  tid_num, TCL_LIN
313f0 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 20  K_INT);.#endif. 
31400 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
31410 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 78 66  erp, "sqlite3_xf
31420 65 72 6f 70 74 5f 63 6f 75 6e 74 22 2c 0a 20 20  eropt_count",.  
31430 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
31440 74 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e  te3_xferopt_coun
31450 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  t, TCL_LINK_INT)
31460 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
31470 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33  interp, "sqlite3
31480 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f  _pager_readdb_co
31490 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61  unt",.      (cha
314a0 72 2a 29 26 73 71 6c 69 74 65 33 5f 70 61 67 65  r*)&sqlite3_page
314b0 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 2c 20  r_readdb_count, 
314c0 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
314d0 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
314e0 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 70 61  erp, "sqlite3_pa
314f0 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
31500 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  t",.      (char*
31510 29 26 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  )&sqlite3_pager_
31520 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 2c 20 54  writedb_count, T
31530 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
31540 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
31550 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 70 61 67  rp, "sqlite3_pag
31560 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 22  er_writej_count"
31570 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
31580 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
31590 69 74 65 6a 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  itej_count, TCL_
315a0 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66 6e 64  LINK_INT);.#ifnd
315b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
315c0 54 46 31 36 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  TF16.  Tcl_LinkV
315d0 61 72 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 6c  ar(interp, "unal
315e0 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75  igned_string_cou
315f0 6e 74 65 72 22 2c 0a 20 20 20 20 20 20 28 63 68  nter",.      (ch
31600 61 72 2a 29 26 75 6e 61 6c 69 67 6e 65 64 5f 73  ar*)&unaligned_s
31610 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 2c 20 54  tring_counter, T
31620 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65  CL_LINK_INT);.#e
31630 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
31640 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
31650 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
31660 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6c 61 73  erp, "sqlite_las
31670 74 5f 6e 65 65 64 65 64 5f 63 6f 6c 6c 61 74 69  t_needed_collati
31680 6f 6e 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  on",.      (char
31690 2a 29 26 70 7a 4e 65 65 64 65 64 43 6f 6c 6c 61  *)&pzNeededColla
316a0 74 69 6f 6e 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53  tion, TCL_LINK_S
316b0 54 52 49 4e 47 7c 54 43 4c 5f 4c 49 4e 4b 5f 52  TRING|TCL_LINK_R
316c0 45 41 44 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69  EAD_ONLY);.#endi
316d0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  f.#if SQLITE_OS_
316e0 57 49 4e 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  WIN.  Tcl_LinkVa
316f0 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
31700 65 5f 6f 73 5f 74 79 70 65 22 2c 0a 20 20 20 20  e_os_type",.    
31710 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
31720 33 5f 6f 73 5f 74 79 70 65 2c 20 54 43 4c 5f 4c  3_os_type, TCL_L
31730 49 4e 4b 5f 4c 4f 4e 47 29 3b 0a 23 65 6e 64 69  INK_LONG);.#endi
31740 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
31750 54 45 53 54 0a 20 20 7b 0a 20 20 20 20 73 74 61  TEST.  {.    sta
31760 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
31770 71 75 65 72 79 5f 70 6c 61 6e 20 3d 20 22 2a 2a  query_plan = "**
31780 2a 20 4f 42 53 4f 4c 45 54 45 20 56 41 52 49 41  * OBSOLETE VARIA
31790 42 4c 45 20 2a 2a 2a 22 3b 0a 20 20 20 20 54 63  BLE ***";.    Tc
317a0 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
317b0 2c 20 22 73 71 6c 69 74 65 5f 71 75 65 72 79 5f  , "sqlite_query_
317c0 70 6c 61 6e 22 2c 0a 20 20 20 20 20 20 20 28 63  plan",.       (c
317d0 68 61 72 2a 29 26 71 75 65 72 79 5f 70 6c 61 6e  har*)&query_plan
317e0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e  , TCL_LINK_STRIN
317f0 47 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f  G|TCL_LINK_READ_
31800 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  ONLY);.  }.#endi
31810 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
31820 44 45 42 55 47 0a 20 20 54 63 6c 5f 4c 69 6e 6b  DEBUG.  Tcl_Link
31830 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
31840 69 74 65 5f 77 68 65 72 65 5f 74 72 61 63 65 22  ite_where_trace"
31850 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
31860 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
31870 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  e, TCL_LINK_INT)
31880 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
31890 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
318a0 6f 73 5f 74 72 61 63 65 22 2c 0a 20 20 20 20 20  os_trace",.     
318b0 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
318c0 4f 53 54 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e  OSTrace, TCL_LIN
318d0 4b 5f 49 4e 54 29 3b 0a 23 69 66 6e 64 65 66 20  K_INT);.#ifndef 
318e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
318f0 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
31900 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 77 61  terp, "sqlite_wa
31910 6c 5f 74 72 61 63 65 22 2c 0a 20 20 20 20 20 20  l_trace",.      
31920 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 57  (char*)&sqlite3W
31930 61 6c 54 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e  alTrace, TCL_LIN
31940 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 23  K_INT);.#endif.#
31950 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
31960 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
31970 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
31980 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f  nterp, "sqlite_o
31990 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 22 2c 0a  pentemp_count",.
319a0 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
319b0 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
319c0 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
319d0 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 63  NT);.#endif.  Tc
319e0 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
319f0 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 69 63  , "sqlite_static
31a00 5f 62 69 6e 64 5f 76 61 6c 75 65 22 2c 0a 20 20  _bind_value",.  
31a10 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
31a20 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76  te_static_bind_v
31a30 61 6c 75 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53  alue, TCL_LINK_S
31a40 54 52 49 4e 47 29 3b 0a 20 20 54 63 6c 5f 4c 69  TRING);.  Tcl_Li
31a50 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
31a60 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e  qlite_static_bin
31a70 64 5f 6e 62 79 74 65 22 2c 0a 20 20 20 20 20 20  d_nbyte",.      
31a80 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 5f 73  (char*)&sqlite_s
31a90 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65  tatic_bind_nbyte
31aa0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
31ab0 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
31ac0 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 74  nterp, "sqlite_t
31ad0 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 22 2c 0a  emp_directory",.
31ae0 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
31af0 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
31b00 74 6f 72 79 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53  tory, TCL_LINK_S
31b10 54 52 49 4e 47 29 3b 0a 20 20 54 63 6c 5f 4c 69  TRING);.  Tcl_Li
31b20 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
31b30 71 6c 69 74 65 5f 64 61 74 61 5f 64 69 72 65 63  qlite_data_direc
31b40 74 6f 72 79 22 2c 0a 20 20 20 20 20 20 28 63 68  tory",.      (ch
31b50 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 64 61 74  ar*)&sqlite3_dat
31b60 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 54 43 4c  a_directory, TCL
31b70 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a 20  _LINK_STRING);. 
31b80 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
31b90 65 72 70 2c 20 22 62 69 74 6d 61 73 6b 5f 73 69  erp, "bitmask_si
31ba0 7a 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  ze",.      (char
31bb0 2a 29 26 62 69 74 6d 61 73 6b 5f 73 69 7a 65 2c  *)&bitmask_size,
31bc0 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 7c 54 43   TCL_LINK_INT|TC
31bd0 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59  L_LINK_READ_ONLY
31be0 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
31bf0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
31c00 5f 73 79 6e 63 5f 63 6f 75 6e 74 22 2c 0a 20 20  _sync_count",.  
31c10 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
31c20 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2c 20  te3_sync_count, 
31c30 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
31c40 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
31c50 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 66 75 6c  erp, "sqlite_ful
31c60 6c 73 79 6e 63 5f 63 6f 75 6e 74 22 2c 0a 20 20  lsync_count",.  
31c70 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
31c80 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
31c90 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  nt, TCL_LINK_INT
31ca0 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  );.#if defined(S
31cb0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
31cc0 33 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  3) && defined(SQ
31cd0 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 54 63 6c  LITE_TEST).  Tcl
31ce0 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
31cf0 20 22 73 71 6c 69 74 65 5f 66 74 73 33 5f 65 6e   "sqlite_fts3_en
31d00 61 62 6c 65 5f 70 61 72 65 6e 74 68 65 73 65 73  able_parentheses
31d10 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
31d20 26 73 71 6c 69 74 65 33 5f 66 74 73 33 5f 65 6e  &sqlite3_fts3_en
31d30 61 62 6c 65 5f 70 61 72 65 6e 74 68 65 73 65 73  able_parentheses
31d40 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
31d50 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
31d60 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a                  TCL_OK;.}.