/ Hex Artifact Content
Login

Artifact cce6ad0effe8c66a62d2634d9714ffdc7372ef11:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 66  ******.** Code f
0180: 6f 72 20 74 65 73 74 69 6e 67 20 61 6c 6c 20 73  or testing all s
0190: 6f 72 74 73 20 6f 66 20 53 51 4c 69 74 65 20 69  orts of SQLite i
01a0: 6e 74 65 72 66 61 63 65 73 2e 20 20 54 68 69 73  nterfaces.  This
01b0: 20 63 6f 64 65 0a 2a 2a 20 69 73 20 6e 6f 74 20   code.** is not 
01c0: 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
01d0: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 20  SQLite library. 
01e0: 20 49 74 20 69 73 20 75 73 65 64 20 66 6f 72 20   It is used for 
01f0: 61 75 74 6f 6d 61 74 65 64 0a 2a 2a 20 74 65 73  automated.** tes
0200: 74 69 6e 67 20 6f 66 20 74 68 65 20 53 51 4c 69  ting of the SQLi
0210: 74 65 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23  te library..*/.#
0220: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0230: 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54 45  nt.h".#if SQLITE
0240: 5f 4f 53 5f 57 49 4e 0a 23 20 20 69 6e 63 6c 75  _OS_WIN.#  inclu
0250: 64 65 20 22 6f 73 5f 77 69 6e 2e 68 22 0a 23 65  de "os_win.h".#e
0260: 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 22  ndif..#include "
0270: 76 64 62 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c  vdbeInt.h".#incl
0280: 75 64 65 20 22 74 63 6c 2e 68 22 0a 23 69 6e 63  ude "tcl.h".#inc
0290: 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a  lude <stdlib.h>.
02a0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67  #include <string
02b0: 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .h>../*.** This 
02c0: 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
02d0: 20 66 69 72 73 74 20 70 61 72 74 20 6f 66 20 74   first part of t
02e0: 68 65 20 53 71 6c 69 74 65 44 62 20 73 74 72 75  he SqliteDb stru
02f0: 63 74 75 72 65 20 69 6e 20 0a 2a 2a 20 74 63 6c  cture in .** tcl
0300: 73 71 6c 69 74 65 2e 63 2e 20 20 57 65 20 6e 65  sqlite.c.  We ne
0310: 65 64 20 69 74 20 68 65 72 65 20 73 6f 20 74 68  ed it here so th
0320: 61 74 20 74 68 65 20 67 65 74 5f 73 71 6c 69 74  at the get_sqlit
0330: 65 5f 70 6f 69 6e 74 65 72 20 72 6f 75 74 69 6e  e_pointer routin
0340: 65 0a 2a 2a 20 63 61 6e 20 65 78 74 72 61 63 74  e.** can extract
0350: 20 74 68 65 20 73 71 6c 69 74 65 33 2a 20 70 6f   the sqlite3* po
0360: 69 6e 74 65 72 20 66 72 6f 6d 20 61 6e 20 65 78  inter from an ex
0370: 69 73 74 69 6e 67 20 54 63 6c 20 53 51 4c 69 74  isting Tcl SQLit
0380: 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  e.** connection.
0390: 0a 2a 2f 0a 73 74 72 75 63 74 20 53 71 6c 69 74  .*/.struct Sqlit
03a0: 65 44 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  eDb {.  sqlite3 
03b0: 2a 64 62 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  *db;.};../*.** C
03c0: 6f 6e 76 65 72 74 20 74 65 78 74 20 67 65 6e 65  onvert text gene
03d0: 72 61 74 65 64 20 62 79 20 74 68 65 20 22 25 70  rated by the "%p
03e0: 22 20 63 6f 6e 76 65 72 73 69 6f 6e 20 66 6f 72  " conversion for
03f0: 6d 61 74 20 62 61 63 6b 20 69 6e 74 6f 0a 2a 2a  mat back into.**
0400: 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73   a pointer..*/.s
0410: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 48 65  tatic int testHe
0420: 78 54 6f 49 6e 74 28 69 6e 74 20 68 29 7b 0a 20  xToInt(int h){. 
0430: 20 69 66 28 20 68 3e 3d 27 30 27 20 26 26 20 68   if( h>='0' && h
0440: 3c 3d 27 39 27 20 29 7b 0a 20 20 20 20 72 65 74  <='9' ){.    ret
0450: 75 72 6e 20 68 20 2d 20 27 30 27 3b 0a 20 20 7d  urn h - '0';.  }
0460: 65 6c 73 65 20 69 66 28 20 68 3e 3d 27 61 27 20  else if( h>='a' 
0470: 26 26 20 68 3c 3d 27 66 27 20 29 7b 0a 20 20 20  && h<='f' ){.   
0480: 20 72 65 74 75 72 6e 20 68 20 2d 20 27 61 27 20   return h - 'a' 
0490: 2b 20 31 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  + 10;.  }else{. 
04a0: 20 20 20 61 73 73 65 72 74 28 20 68 3e 3d 27 41     assert( h>='A
04b0: 27 20 26 26 20 68 3c 3d 27 46 27 20 29 3b 0a 20  ' && h<='F' );. 
04c0: 20 20 20 72 65 74 75 72 6e 20 68 20 2d 20 27 41     return h - 'A
04d0: 27 20 2b 20 31 30 3b 0a 20 20 7d 0a 7d 0a 76 6f  ' + 10;.  }.}.vo
04e0: 69 64 20 2a 73 71 6c 69 74 65 33 54 65 73 74 54  id *sqlite3TestT
04f0: 65 78 74 54 6f 50 74 72 28 63 6f 6e 73 74 20 63  extToPtr(const c
0500: 68 61 72 20 2a 7a 29 7b 0a 20 20 76 6f 69 64 20  har *z){.  void 
0510: 2a 70 3b 0a 20 20 75 36 34 20 76 3b 0a 20 20 75  *p;.  u64 v;.  u
0520: 33 32 20 76 32 3b 0a 20 20 69 66 28 20 7a 5b 30  32 v2;.  if( z[0
0530: 5d 3d 3d 27 30 27 20 26 26 20 7a 5b 31 5d 3d 3d  ]=='0' && z[1]==
0540: 27 78 27 20 29 7b 0a 20 20 20 20 7a 20 2b 3d 20  'x' ){.    z += 
0550: 32 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 30 3b 0a  2;.  }.  v = 0;.
0560: 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20    while( *z ){. 
0570: 20 20 20 76 20 3d 20 28 76 3c 3c 34 29 20 2b 20     v = (v<<4) + 
0580: 74 65 73 74 48 65 78 54 6f 49 6e 74 28 2a 7a 29  testHexToInt(*z)
0590: 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 7d 0a 20  ;.    z++;.  }. 
05a0: 20 69 66 28 20 73 69 7a 65 6f 66 28 70 29 3d 3d   if( sizeof(p)==
05b0: 73 69 7a 65 6f 66 28 76 29 20 29 7b 0a 20 20 20  sizeof(v) ){.   
05c0: 20 6d 65 6d 63 70 79 28 26 70 2c 20 26 76 2c 20   memcpy(&p, &v, 
05d0: 73 69 7a 65 6f 66 28 70 29 29 3b 0a 20 20 7d 65  sizeof(p));.  }e
05e0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
05f0: 20 73 69 7a 65 6f 66 28 70 29 3d 3d 73 69 7a 65   sizeof(p)==size
0600: 6f 66 28 76 32 29 20 29 3b 0a 20 20 20 20 76 32  of(v2) );.    v2
0610: 20 3d 20 28 75 33 32 29 76 3b 0a 20 20 20 20 6d   = (u32)v;.    m
0620: 65 6d 63 70 79 28 26 70 2c 20 26 76 32 2c 20 73  emcpy(&p, &v2, s
0630: 69 7a 65 6f 66 28 70 29 29 3b 0a 20 20 7d 0a 20  izeof(p));.  }. 
0640: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f   return p;.}.../
0650: 2a 0a 2a 2a 20 41 20 54 43 4c 20 63 6f 6d 6d 61  *.** A TCL comma
0660: 6e 64 20 74 68 61 74 20 72 65 74 75 72 6e 73 20  nd that returns 
0670: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
0680: 68 65 20 73 71 6c 69 74 65 2a 20 70 6f 69 6e 74  he sqlite* point
0690: 65 72 0a 2a 2a 20 66 6f 72 20 61 6e 20 73 71 6c  er.** for an sql
06a0: 69 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  ite connection i
06b0: 6e 73 74 61 6e 63 65 2e 20 20 42 61 64 20 74 68  nstance.  Bad th
06c0: 69 6e 67 73 20 68 61 70 70 65 6e 20 69 66 20 74  ings happen if t
06d0: 68 65 0a 2a 2a 20 69 6e 70 75 74 20 69 73 20 6e  he.** input is n
06e0: 6f 74 20 61 6e 20 73 71 6c 69 74 65 20 63 6f 6e  ot an sqlite con
06f0: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  nection..*/.stat
0700: 69 63 20 69 6e 74 20 67 65 74 5f 73 71 6c 69 74  ic int get_sqlit
0710: 65 5f 70 6f 69 6e 74 65 72 28 0a 20 20 76 6f 69  e_pointer(.  voi
0720: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
0730: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
0740: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
0750: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
0760: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
0770: 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 2a  truct SqliteDb *
0780: 70 3b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f  p;.  Tcl_CmdInfo
0790: 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 63 68 61 72   cmdInfo;.  char
07a0: 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 69 66   zBuf[100];.  if
07b0: 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
07c0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
07d0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
07e0: 76 2c 20 22 53 51 4c 49 54 45 2d 43 4f 4e 4e 45  v, "SQLITE-CONNE
07f0: 43 54 49 4f 4e 22 29 3b 0a 20 20 20 20 72 65 74  CTION");.    ret
0800: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
0810: 20 7d 0a 20 20 69 66 28 20 21 54 63 6c 5f 47 65   }.  if( !Tcl_Ge
0820: 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74  tCommandInfo(int
0830: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
0840: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 63 6d  ng(objv[1]), &cm
0850: 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54 63  dInfo) ){.    Tc
0860: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
0870: 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20  nterp, "command 
0880: 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 0a 20 20  not found: ",.  
0890: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74           Tcl_Get
08a0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
08b0: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
08c0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
08d0: 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 28 73 74 72  ;.  }.  p = (str
08e0: 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29 63 6d  uct SqliteDb*)cm
08f0: 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44  dInfo.objClientD
0900: 61 74 61 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a  ata;.  sprintf(z
0910: 42 75 66 2c 20 22 25 70 22 2c 20 70 2d 3e 64 62  Buf, "%p", p->db
0920: 29 3b 0a 20 20 69 66 28 20 73 74 72 6e 63 6d 70  );.  if( strncmp
0930: 28 7a 42 75 66 2c 22 30 78 22 2c 32 29 20 29 7b  (zBuf,"0x",2) ){
0940: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
0950: 66 2c 20 22 30 78 25 70 22 2c 20 70 2d 3e 64 62  f, "0x%p", p->db
0960: 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70  );.  }.  Tcl_App
0970: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
0980: 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65  , zBuf, 0);.  re
0990: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
09a0: 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 70  /*.** Decode a p
09b0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
09c0: 69 74 65 33 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  ite3 object..*/.
09d0: 69 6e 74 20 67 65 74 44 62 50 6f 69 6e 74 65 72  int getDbPointer
09e0: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
09f0: 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  erp, const char 
0a00: 2a 7a 41 2c 20 73 71 6c 69 74 65 33 20 2a 2a 70  *zA, sqlite3 **p
0a10: 70 44 62 29 7b 0a 20 20 73 74 72 75 63 74 20 53  pDb){.  struct S
0a20: 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20 54 63  qliteDb *p;.  Tc
0a30: 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66  l_CmdInfo cmdInf
0a40: 6f 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  o;.  if( Tcl_Get
0a50: 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65  CommandInfo(inte
0a60: 72 70 2c 20 7a 41 2c 20 26 63 6d 64 49 6e 66 6f  rp, zA, &cmdInfo
0a70: 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 73 74  ) ){.    p = (st
0a80: 72 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29 63  ruct SqliteDb*)c
0a90: 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74  mdInfo.objClient
0aa0: 44 61 74 61 3b 0a 20 20 20 20 2a 70 70 44 62 20  Data;.    *ppDb 
0ab0: 3d 20 70 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65  = p->db;.  }else
0ac0: 7b 0a 20 20 20 20 2a 70 70 44 62 20 3d 20 28 73  {.    *ppDb = (s
0ad0: 71 6c 69 74 65 33 2a 29 73 71 6c 69 74 65 33 54  qlite3*)sqlite3T
0ae0: 65 73 74 54 65 78 74 54 6f 50 74 72 28 7a 41 29  estTextToPtr(zA)
0af0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
0b00: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  CL_OK;.}..#if SQ
0b10: 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a  LITE_OS_WIN./*.*
0b20: 2a 20 44 65 63 6f 64 65 20 61 20 57 69 6e 33 32  * Decode a Win32
0b30: 20 48 41 4e 44 4c 45 20 6f 62 6a 65 63 74 2e 0a   HANDLE object..
0b40: 2a 2f 0a 69 6e 74 20 67 65 74 57 69 6e 33 32 48  */.int getWin32H
0b50: 61 6e 64 6c 65 28 54 63 6c 5f 49 6e 74 65 72 70  andle(Tcl_Interp
0b60: 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20   *interp, const 
0b70: 63 68 61 72 20 2a 7a 41 2c 20 4c 50 48 41 4e 44  char *zA, LPHAND
0b80: 4c 45 20 70 68 46 69 6c 65 29 7b 0a 20 20 2a 70  LE phFile){.  *p
0b90: 68 46 69 6c 65 20 3d 20 28 48 41 4e 44 4c 45 29  hFile = (HANDLE)
0ba0: 73 71 6c 69 74 65 33 54 65 73 74 54 65 78 74 54  sqlite3TestTextT
0bb0: 6f 50 74 72 28 7a 41 29 3b 0a 20 20 72 65 74 75  oPtr(zA);.  retu
0bc0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e  rn TCL_OK;.}.#en
0bd0: 64 69 66 0a 0a 65 78 74 65 72 6e 20 63 6f 6e 73  dif..extern cons
0be0: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45  t char *sqlite3E
0bf0: 72 72 4e 61 6d 65 28 69 6e 74 29 3b 0a 23 64 65  rrName(int);.#de
0c00: 66 69 6e 65 20 74 31 45 72 72 6f 72 4e 61 6d 65  fine t1ErrorName
0c10: 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 0a   sqlite3ErrName.
0c20: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
0c30: 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 20  n sqlite3_stmt* 
0c40: 69 6e 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 2a  into an sqlite3*
0c50: 2e 20 20 54 68 69 73 20 64 65 70 65 6e 64 73 20  .  This depends 
0c60: 6f 6e 20 74 68 65 0a 2a 2a 20 66 61 63 74 20 74  on the.** fact t
0c70: 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 2a  hat the sqlite3*
0c80: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 66 69   is the first fi
0c90: 65 6c 64 20 69 6e 20 74 68 65 20 56 64 62 65 20  eld in the Vdbe 
0ca0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 23 64  structure..*/.#d
0cb0: 65 66 69 6e 65 20 53 74 6d 74 54 6f 44 62 28 58  efine StmtToDb(X
0cc0: 29 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 68  )   sqlite3_db_h
0cd0: 61 6e 64 6c 65 28 58 29 0a 0a 2f 2a 0a 2a 2a 20  andle(X)../*.** 
0ce0: 43 68 65 63 6b 20 61 20 72 65 74 75 72 6e 20 76  Check a return v
0cf0: 61 6c 75 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  alue to make sur
0d00: 65 20 69 74 20 61 67 72 65 65 73 20 77 69 74 68  e it agrees with
0d10: 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20   the results.** 
0d20: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65 72 72  from sqlite3_err
0d30: 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  code..*/.int sql
0d40: 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
0d50: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
0d60: 72 70 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  rp, sqlite3 *db,
0d70: 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 66 28 20   int rc){.  if( 
0d80: 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 73 61  sqlite3_threadsa
0d90: 66 65 28 29 3d 3d 30 20 26 26 20 72 63 21 3d 53  fe()==0 && rc!=S
0da0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 26 26 20  QLITE_MISUSE && 
0db0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  rc!=SQLITE_OK.  
0dc0: 20 26 26 20 73 71 6c 69 74 65 33 5f 65 72 72 63   && sqlite3_errc
0dd0: 6f 64 65 28 64 62 29 21 3d 72 63 20 29 7b 0a 20  ode(db)!=rc ){. 
0de0: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30     char zBuf[200
0df0: 5d 3b 0a 20 20 20 20 69 6e 74 20 72 32 20 3d 20  ];.    int r2 = 
0e00: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
0e10: 64 62 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66  db);.    sprintf
0e20: 28 7a 42 75 66 2c 20 22 65 72 72 6f 72 20 63 6f  (zBuf, "error co
0e30: 64 65 20 25 73 20 28 25 64 29 20 64 6f 65 73 20  de %s (%d) does 
0e40: 6e 6f 74 20 6d 61 74 63 68 20 73 71 6c 69 74 65  not match sqlite
0e50: 33 5f 65 72 72 63 6f 64 65 20 25 73 20 28 25 64  3_errcode %s (%d
0e60: 29 22 2c 0a 20 20 20 20 20 20 20 74 31 45 72 72  )",.       t1Err
0e70: 6f 72 4e 61 6d 65 28 72 63 29 2c 20 72 63 2c 20  orName(rc), rc, 
0e80: 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 32 29 2c  t1ErrorName(r2),
0e90: 20 72 32 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65   r2);.    Tcl_Re
0ea0: 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  setResult(interp
0eb0: 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  );.    Tcl_Appen
0ec0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
0ed0: 7a 42 75 66 2c 20 30 29 3b 0a 20 20 20 20 72 65  zBuf, 0);.    re
0ee0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
0ef0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
0f00: 20 44 65 63 6f 64 65 20 61 20 70 6f 69 6e 74 65   Decode a pointe
0f10: 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f  r to an sqlite3_
0f20: 73 74 6d 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  stmt object..*/.
0f30: 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 53 74  static int getSt
0f40: 6d 74 50 6f 69 6e 74 65 72 28 0a 20 20 54 63 6c  mtPointer(.  Tcl
0f50: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
0f60: 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
0f70: 7a 41 72 67 2c 20 20 0a 20 20 73 71 6c 69 74 65  zArg,  .  sqlite
0f80: 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 0a  3_stmt **ppStmt.
0f90: 29 7b 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 28  ){.  *ppStmt = (
0fa0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 73 71  sqlite3_stmt*)sq
0fb0: 6c 69 74 65 33 54 65 73 74 54 65 78 74 54 6f 50  lite3TestTextToP
0fc0: 74 72 28 7a 41 72 67 29 3b 0a 20 20 72 65 74 75  tr(zArg);.  retu
0fd0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
0fe0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 74  .** Generate a t
0ff0: 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ext representati
1000: 6f 6e 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20  on of a pointer 
1010: 74 68 61 74 20 63 61 6e 20 62 65 20 75 6e 64 65  that can be unde
1020: 72 73 74 6f 6f 64 0a 2a 2a 20 62 79 20 74 68 65  rstood.** by the
1030: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 20 61 6e   getDbPointer an
1040: 64 20 67 65 74 56 6d 50 6f 69 6e 74 65 72 20 72  d getVmPointer r
1050: 6f 75 74 69 6e 65 73 20 61 62 6f 76 65 2e 0a 2a  outines above..*
1060: 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 62 6c 65 6d  *.** The problem
1070: 20 69 73 2c 20 6f 6e 20 73 6f 6d 65 20 6d 61 63   is, on some mac
1080: 68 69 6e 65 73 20 28 53 6f 6c 61 72 69 73 29 20  hines (Solaris) 
1090: 69 66 20 79 6f 75 20 64 6f 20 61 20 70 72 69 6e  if you do a prin
10a0: 74 66 20 77 69 74 68 0a 2a 2a 20 22 25 70 22 20  tf with.** "%p" 
10b0: 79 6f 75 20 63 61 6e 6e 6f 74 20 74 75 72 6e 20  you cannot turn 
10c0: 61 72 6f 75 6e 64 20 61 6e 64 20 64 6f 20 61 20  around and do a 
10d0: 73 63 61 6e 66 20 77 69 74 68 20 74 68 65 20 73  scanf with the s
10e0: 61 6d 65 20 22 25 70 22 20 61 6e 64 0a 2a 2a 20  ame "%p" and.** 
10f0: 67 65 74 20 79 6f 75 72 20 70 6f 69 6e 74 65 72  get your pointer
1100: 20 62 61 63 6b 2e 20 20 59 6f 75 20 68 61 76 65   back.  You have
1110: 20 74 6f 20 70 72 65 70 65 6e 64 20 61 20 22 30   to prepend a "0
1120: 78 22 20 62 65 66 6f 72 65 20 69 74 20 77 69 6c  x" before it wil
1130: 6c 0a 2a 2a 20 77 6f 72 6b 2e 20 20 4f 72 20 61  l.** work.  Or a
1140: 74 20 6c 65 61 73 74 20 74 68 61 74 20 69 73 20  t least that is 
1150: 77 68 61 74 20 69 73 20 72 65 70 6f 72 74 65 64  what is reported
1160: 20 74 6f 20 6d 65 20 28 64 72 68 29 2e 20 20 42   to me (drh).  B
1170: 75 74 20 74 68 69 73 0a 2a 2a 20 62 65 68 61 76  ut this.** behav
1180: 69 6f 72 20 76 61 72 69 65 73 20 66 72 6f 6d 20  ior varies from 
1190: 6d 61 63 68 69 6e 65 20 74 6f 20 6d 61 63 68 69  machine to machi
11a0: 6e 65 2e 20 20 54 68 65 20 73 6f 6c 75 74 69 6f  ne.  The solutio
11b0: 6e 20 75 73 65 64 20 68 65 72 20 69 73 0a 2a 2a  n used her is.**
11c0: 20 74 6f 20 74 65 73 74 20 74 68 65 20 73 74 72   to test the str
11d0: 69 6e 67 20 72 69 67 68 74 20 61 66 74 65 72 20  ing right after 
11e0: 69 74 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  it is generated 
11f0: 74 6f 20 73 65 65 20 69 66 20 69 74 20 63 61 6e  to see if it can
1200: 20 62 65 0a 2a 2a 20 75 6e 64 65 72 73 74 6f 6f   be.** understoo
1210: 64 20 62 79 20 73 63 61 6e 66 2c 20 61 6e 64 20  d by scanf, and 
1220: 69 66 20 6e 6f 74 2c 20 74 72 79 20 70 72 65 70  if not, try prep
1230: 65 6e 64 69 6e 67 20 61 6e 20 22 30 78 22 20 74  ending an "0x" t
1240: 6f 20 73 65 65 20 69 66 0a 2a 2a 20 74 68 61 74  o see if.** that
1250: 20 68 65 6c 70 73 2e 20 20 49 66 20 6e 6f 74 68   helps.  If noth
1260: 69 6e 67 20 77 6f 72 6b 73 2c 20 61 20 66 61 74  ing works, a fat
1270: 61 6c 20 65 72 72 6f 72 20 69 73 20 67 65 6e 65  al error is gene
1280: 72 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rated..*/.int sq
1290: 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
12a0: 6e 74 65 72 53 74 72 28 54 63 6c 5f 49 6e 74 65  nterStr(Tcl_Inte
12b0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 63 68 61 72  rp *interp, char
12c0: 20 2a 7a 50 74 72 2c 20 76 6f 69 64 20 2a 70 29   *zPtr, void *p)
12d0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  {.  sqlite3_snpr
12e0: 69 6e 74 66 28 31 30 30 2c 20 7a 50 74 72 2c 20  intf(100, zPtr, 
12f0: 22 25 70 22 2c 20 70 29 3b 0a 20 20 72 65 74 75  "%p", p);.  retu
1300: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1310: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b  .** The callback
1320: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 71 6c   routine for sql
1330: 69 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74 66  ite3_exec_printf
1340: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
1350: 74 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63 62  t exec_printf_cb
1360: 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74  (void *pArg, int
1370: 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72   argc, char **ar
1380: 67 76 2c 20 63 68 61 72 20 2a 2a 6e 61 6d 65 29  gv, char **name)
1390: 7b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  {.  Tcl_DString 
13a0: 2a 73 74 72 20 3d 20 28 54 63 6c 5f 44 53 74 72  *str = (Tcl_DStr
13b0: 69 6e 67 2a 29 70 41 72 67 3b 0a 20 20 69 6e 74  ing*)pArg;.  int
13c0: 20 69 3b 0a 0a 20 20 69 66 28 20 54 63 6c 5f 44   i;..  if( Tcl_D
13d0: 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 73 74 72  StringLength(str
13e0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28  )==0 ){.    for(
13f0: 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  i=0; i<argc; i++
1400: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 53 74  ){.      Tcl_DSt
1410: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
1420: 74 28 73 74 72 2c 20 6e 61 6d 65 5b 69 5d 20 3f  t(str, name[i] ?
1430: 20 6e 61 6d 65 5b 69 5d 20 3a 20 22 4e 55 4c 4c   name[i] : "NULL
1440: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ");.    }.  }.  
1450: 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b  for(i=0; i<argc;
1460: 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 44   i++){.    Tcl_D
1470: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
1480: 65 6e 74 28 73 74 72 2c 20 61 72 67 76 5b 69 5d  ent(str, argv[i]
1490: 20 3f 20 61 72 67 76 5b 69 5d 20 3a 20 22 4e 55   ? argv[i] : "NU
14a0: 4c 4c 22 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  LL");.  }.  retu
14b0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
14c0: 68 65 20 49 2f 4f 20 74 72 61 63 69 6e 67 20 63  he I/O tracing c
14d0: 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 23 69 66 20  allback..*/.#if 
14e0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
14f0: 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64  OMIT_TRACE) && d
1500: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
1510: 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 73 74  ABLE_IOTRACE).st
1520: 61 74 69 63 20 46 49 4c 45 20 2a 69 6f 74 72 61  atic FILE *iotra
1530: 63 65 5f 66 69 6c 65 20 3d 20 30 3b 0a 73 74 61  ce_file = 0;.sta
1540: 74 69 63 20 76 6f 69 64 20 69 6f 5f 74 72 61 63  tic void io_trac
1550: 65 5f 63 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74  e_callback(const
1560: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
1570: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
1580: 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  ap;.  va_start(a
1590: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 76  p, zFormat);.  v
15a0: 66 70 72 69 6e 74 66 28 69 6f 74 72 61 63 65 5f  fprintf(iotrace_
15b0: 66 69 6c 65 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  file, zFormat, a
15c0: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
15d0: 3b 0a 20 20 66 66 6c 75 73 68 28 69 6f 74 72 61  ;.  fflush(iotra
15e0: 63 65 5f 66 69 6c 65 29 3b 0a 7d 0a 23 65 6e 64  ce_file);.}.#end
15f0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  if../*.** Usage:
1600: 20 20 69 6f 5f 74 72 61 63 65 20 46 49 4c 45 4e    io_trace FILEN
1610: 41 4d 45 0a 2a 2a 0a 2a 2a 20 54 75 72 6e 20 49  AME.**.** Turn I
1620: 2f 4f 20 74 72 61 63 69 6e 67 20 6f 6e 20 6f 72  /O tracing on or
1630: 20 6f 66 66 2e 20 20 49 66 20 46 49 4c 45 4e 41   off.  If FILENA
1640: 4d 45 20 69 73 20 6e 6f 74 20 61 6e 20 65 6d 70  ME is not an emp
1650: 74 79 20 73 74 72 69 6e 67 2c 0a 2a 2a 20 49 2f  ty string,.** I/
1660: 4f 20 74 72 61 63 69 6e 67 20 62 65 67 69 6e 73  O tracing begins
1670: 20 67 6f 69 6e 67 20 69 6e 74 6f 20 46 49 4c 45   going into FILE
1680: 4e 41 4d 45 2e 20 49 66 20 46 49 4c 45 4e 41 4d  NAME. If FILENAM
1690: 45 20 69 73 20 61 6e 20 65 6d 70 74 79 0a 2a 2a  E is an empty.**
16a0: 20 73 74 72 69 6e 67 2c 20 49 2f 4f 20 74 72 61   string, I/O tra
16b0: 63 69 6e 67 20 69 73 20 74 75 72 6e 65 64 20 6f  cing is turned o
16c0: 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ff..*/.static in
16d0: 74 20 74 65 73 74 5f 69 6f 5f 74 72 61 63 65 28  t test_io_trace(
16e0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
16f0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1700: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
1710: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
1720: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
1730: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
1740: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
1750: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1760: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
1770: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
1780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
1790: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
17a0: 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 21 64  ent */.){.#if !d
17b0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
17c0: 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66  IT_TRACE) && def
17d0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
17e0: 4c 45 5f 49 4f 54 52 41 43 45 29 0a 20 20 69 66  LE_IOTRACE).  if
17f0: 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20  ( argc!=2 ){.   
1800: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1810: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1820: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1830: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
1840: 0a 20 20 20 20 20 20 20 20 20 20 22 20 46 49 4c  .          " FIL
1850: 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20  ENAME\"", 0);.  
1860: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1870: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 6f  OR;.  }.  if( io
1880: 74 72 61 63 65 5f 66 69 6c 65 20 29 7b 0a 20 20  trace_file ){.  
1890: 20 20 69 66 28 20 69 6f 74 72 61 63 65 5f 66 69    if( iotrace_fi
18a0: 6c 65 21 3d 73 74 64 6f 75 74 20 26 26 20 69 6f  le!=stdout && io
18b0: 74 72 61 63 65 5f 66 69 6c 65 21 3d 73 74 64 65  trace_file!=stde
18c0: 72 72 20 29 7b 0a 20 20 20 20 20 20 66 63 6c 6f  rr ){.      fclo
18d0: 73 65 28 69 6f 74 72 61 63 65 5f 66 69 6c 65 29  se(iotrace_file)
18e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6f 74 72  ;.    }.    iotr
18f0: 61 63 65 5f 66 69 6c 65 20 3d 20 30 3b 0a 20 20  ace_file = 0;.  
1900: 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65    sqlite3IoTrace
1910: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
1920: 61 72 67 76 5b 31 5d 5b 30 5d 20 29 7b 0a 20 20  argv[1][0] ){.  
1930: 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67    if( strcmp(arg
1940: 76 5b 31 5d 2c 22 73 74 64 6f 75 74 22 29 3d 3d  v[1],"stdout")==
1950: 30 20 29 7b 0a 20 20 20 20 20 20 69 6f 74 72 61  0 ){.      iotra
1960: 63 65 5f 66 69 6c 65 20 3d 20 73 74 64 6f 75 74  ce_file = stdout
1970: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1980: 73 74 72 63 6d 70 28 61 72 67 76 5b 31 5d 2c 22  strcmp(argv[1],"
1990: 73 74 64 65 72 72 22 29 3d 3d 30 20 29 7b 0a 20  stderr")==0 ){. 
19a0: 20 20 20 20 20 69 6f 74 72 61 63 65 5f 66 69 6c       iotrace_fil
19b0: 65 20 3d 20 73 74 64 65 72 72 3b 0a 20 20 20 20  e = stderr;.    
19c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6f 74  }else{.      iot
19d0: 72 61 63 65 5f 66 69 6c 65 20 3d 20 66 6f 70 65  race_file = fope
19e0: 6e 28 61 72 67 76 5b 31 5d 2c 20 22 77 22 29 3b  n(argv[1], "w");
19f0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1a00: 65 33 49 6f 54 72 61 63 65 20 3d 20 69 6f 5f 74  e3IoTrace = io_t
1a10: 72 61 63 65 5f 63 61 6c 6c 62 61 63 6b 3b 0a 20  race_callback;. 
1a20: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
1a30: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1a40: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 63 6c 61 6e  .** Usage:  clan
1a50: 67 5f 73 61 6e 69 74 69 7a 65 5f 61 64 64 72 65  g_sanitize_addre
1a60: 73 73 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ss .**.** Return
1a70: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 70 72  s true if the pr
1a80: 6f 67 72 61 6d 20 77 61 73 20 63 6f 6d 70 69 6c  ogram was compil
1a90: 65 64 20 75 73 69 6e 67 20 63 6c 61 6e 67 20 77  ed using clang w
1aa0: 69 74 68 20 74 68 65 20 0a 2a 2a 20 2d 66 73 61  ith the .** -fsa
1ab0: 6e 69 74 69 7a 65 3d 61 64 64 72 65 73 73 20 73  nitize=address s
1ac0: 77 69 74 63 68 20 6f 6e 20 74 68 65 20 63 6f 6d  witch on the com
1ad0: 6d 61 6e 64 20 6c 69 6e 65 2e 20 46 61 6c 73 65  mand line. False
1ae0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
1af0: 74 61 74 69 63 20 69 6e 74 20 63 6c 61 6e 67 5f  tatic int clang_
1b00: 73 61 6e 69 74 69 7a 65 5f 61 64 64 72 65 73 73  sanitize_address
1b10: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
1b20: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
1b30: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
1b40: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
1b50: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
1b60: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
1b70: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
1b80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1b90: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
1ba0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1bc0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
1bd0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ment */.){.  int
1be0: 20 72 65 73 20 3d 20 30 3b 0a 23 69 66 20 64 65   res = 0;.#if de
1bf0: 66 69 6e 65 64 28 5f 5f 68 61 73 5f 66 65 61 74  fined(__has_feat
1c00: 75 72 65 29 0a 23 20 69 66 20 5f 5f 68 61 73 5f  ure).# if __has_
1c10: 66 65 61 74 75 72 65 28 61 64 64 72 65 73 73 5f  feature(address_
1c20: 73 61 6e 69 74 69 7a 65 72 29 0a 20 20 72 65 73  sanitizer).  res
1c30: 20 3d 20 31 3b 0a 23 20 65 6e 64 69 66 0a 23 65   = 1;.# endif.#e
1c40: 6e 64 69 66 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ndif.  Tcl_SetOb
1c50: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
1c60: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65  Tcl_NewIntObj(re
1c70: 73 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  s));.  return TC
1c80: 4c 5f 4f 4b 3b 0a 7d 0a 20 20 0a 2f 2a 0a 2a 2a  L_OK;.}.  ./*.**
1c90: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
1ca0: 5f 65 78 65 63 5f 70 72 69 6e 74 66 20 20 44 42  _exec_printf  DB
1cb0: 20 20 46 4f 52 4d 41 54 20 20 53 54 52 49 4e 47    FORMAT  STRING
1cc0: 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  .**.** Invoke th
1cd0: 65 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 70  e sqlite3_exec_p
1ce0: 72 69 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63  rintf() interfac
1cf0: 65 20 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e  e using the open
1d00: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 44 42 2e   database.** DB.
1d10: 20 20 54 68 65 20 53 51 4c 20 69 73 20 74 68 65    The SQL is the
1d20: 20 73 74 72 69 6e 67 20 46 4f 52 4d 41 54 2e 20   string FORMAT. 
1d30: 20 54 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69   The format stri
1d40: 6e 67 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69  ng should contai
1d50: 6e 0a 2a 2a 20 6f 6e 65 20 25 73 20 6f 72 20 25  n.** one %s or %
1d60: 71 2e 20 20 53 54 52 49 4e 47 20 69 73 20 74 68  q.  STRING is th
1d70: 65 20 76 61 6c 75 65 20 69 6e 73 65 72 74 65 64  e value inserted
1d80: 20 69 6e 74 6f 20 25 73 20 6f 72 20 25 71 2e 0a   into %s or %q..
1d90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1da0: 73 74 5f 65 78 65 63 5f 70 72 69 6e 74 66 28 0a  st_exec_printf(.
1db0: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
1dc0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1dd0: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
1de0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
1df0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
1e00: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
1e10: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
1e20: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1e30: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
1e40: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
1e50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
1e60: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
1e70: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
1e80: 65 33 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53  e3 *db;.  Tcl_DS
1e90: 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74  tring str;.  int
1ea0: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72   rc;.  char *zEr
1eb0: 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  r = 0;.  char *z
1ec0: 53 71 6c 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  Sql;.  char zBuf
1ed0: 5b 33 30 5d 3b 0a 20 20 69 66 28 20 61 72 67 63  [30];.  if( argc
1ee0: 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
1ef0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1f00: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1f10: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1f20: 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
1f30: 20 20 20 22 20 44 42 20 46 4f 52 4d 41 54 20 53     " DB FORMAT S
1f40: 54 52 49 4e 47 22 2c 20 30 29 3b 0a 20 20 20 20  TRING", 0);.    
1f50: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1f60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
1f70: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
1f80: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
1f90: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1fa0: 52 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  R;.  Tcl_DString
1fb0: 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 7a 53  Init(&str);.  zS
1fc0: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
1fd0: 69 6e 74 66 28 61 72 67 76 5b 32 5d 2c 20 61 72  intf(argv[2], ar
1fe0: 67 76 5b 33 5d 29 3b 0a 20 20 72 63 20 3d 20 73  gv[3]);.  rc = s
1ff0: 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20  qlite3_exec(db, 
2000: 7a 53 71 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74  zSql, exec_print
2010: 66 5f 63 62 2c 20 26 73 74 72 2c 20 26 7a 45 72  f_cb, &str, &zEr
2020: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  r);.  sqlite3_fr
2030: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 73 70 72 69  ee(zSql);.  spri
2040: 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20  ntf(zBuf, "%d", 
2050: 72 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  rc);.  Tcl_Appen
2060: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2070: 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70   zBuf);.  Tcl_Ap
2080: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2090: 72 70 2c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rp, rc==SQLITE_O
20a0: 4b 20 3f 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  K ? Tcl_DStringV
20b0: 61 6c 75 65 28 26 73 74 72 29 20 3a 20 7a 45 72  alue(&str) : zEr
20c0: 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  r);.  Tcl_DStrin
20d0: 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 69  gFree(&str);.  i
20e0: 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74 65  f( zErr ) sqlite
20f0: 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20  3_free(zErr);.  
2100: 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
2110: 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
2120: 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
2130: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74  TCL_ERROR;.  ret
2140: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
2150: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
2160: 69 74 65 33 5f 65 78 65 63 5f 68 65 78 20 20 44  ite3_exec_hex  D
2170: 42 20 20 48 45 58 0a 2a 2a 0a 2a 2a 20 49 6e 76  B  HEX.**.** Inv
2180: 6f 6b 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  oke the sqlite3_
2190: 65 78 65 63 28 29 20 6f 6e 20 61 20 73 74 72 69  exec() on a stri
21a0: 6e 67 20 74 68 61 74 20 69 73 20 6f 62 74 61 69  ng that is obtai
21b0: 6e 65 64 20 62 79 20 74 72 61 6e 73 6c 61 74 69  ned by translati
21c0: 6e 67 0a 2a 2a 20 48 45 58 20 69 6e 74 6f 20 41  ng.** HEX into A
21d0: 53 43 49 49 2e 20 20 4d 6f 73 74 20 63 68 61 72  SCII.  Most char
21e0: 61 63 74 65 72 73 20 61 72 65 20 74 72 61 6e 73  acters are trans
21f0: 6c 61 74 65 64 20 61 73 20 69 73 2e 20 20 25 48  lated as is.  %H
2200: 48 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 61 20 68  H becomes.** a h
2210: 65 78 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f  ex character..*/
2220: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
2230: 5f 65 78 65 63 5f 68 65 78 28 0a 20 20 76 6f 69  _exec_hex(.  voi
2240: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
2250: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2260: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
2270: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
2280: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
2290: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
22a0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
22b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
22c0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
22d0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
22e0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
22f0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
2300: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
2310: 62 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  b;.  Tcl_DString
2320: 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63 2c 20   str;.  int rc, 
2330: 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 2a 7a 45  i, j;.  char *zE
2340: 72 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  rr = 0;.  char *
2350: 7a 48 65 78 3b 0a 20 20 63 68 61 72 20 7a 53 71  zHex;.  char zSq
2360: 6c 5b 35 30 30 5d 3b 0a 20 20 63 68 61 72 20 7a  l[500];.  char z
2370: 42 75 66 5b 33 30 5d 3b 0a 20 20 69 66 28 20 61  Buf[30];.  if( a
2380: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
2390: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
23a0: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
23b0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
23c0: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
23d0: 20 20 20 20 20 20 22 20 44 42 20 48 45 58 22 2c        " DB HEX",
23e0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
23f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2400: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
2410: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
2420: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
2430: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 48   TCL_ERROR;.  zH
2440: 65 78 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20  ex = argv[2];.  
2450: 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 73 69 7a  for(i=j=0; i<siz
2460: 65 6f 66 28 7a 53 71 6c 29 20 26 26 20 7a 48 65  eof(zSql) && zHe
2470: 78 5b 6a 5d 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b  x[j]; i++, j++){
2480: 0a 20 20 20 20 69 66 28 20 7a 48 65 78 5b 6a 5d  .    if( zHex[j]
2490: 3d 3d 27 25 27 20 26 26 20 7a 48 65 78 5b 6a 2b  =='%' && zHex[j+
24a0: 32 5d 20 26 26 20 7a 48 65 78 5b 6a 2b 32 5d 20  2] && zHex[j+2] 
24b0: 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 69 5d  ){.      zSql[i]
24c0: 20 3d 20 28 74 65 73 74 48 65 78 54 6f 49 6e 74   = (testHexToInt
24d0: 28 7a 48 65 78 5b 6a 2b 31 5d 29 3c 3c 34 29 20  (zHex[j+1])<<4) 
24e0: 2b 20 74 65 73 74 48 65 78 54 6f 49 6e 74 28 7a  + testHexToInt(z
24f0: 48 65 78 5b 6a 2b 32 5d 29 3b 0a 20 20 20 20 20  Hex[j+2]);.     
2500: 20 6a 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65 6c   j += 2;.    }el
2510: 73 65 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 69  se{.      zSql[i
2520: 5d 20 3d 20 7a 48 65 78 5b 6a 5d 3b 0a 20 20 20  ] = zHex[j];.   
2530: 20 7d 0a 20 20 7d 0a 20 20 7a 53 71 6c 5b 69 5d   }.  }.  zSql[i]
2540: 20 3d 20 30 3b 0a 20 20 54 63 6c 5f 44 53 74 72   = 0;.  Tcl_DStr
2550: 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20  ingInit(&str);. 
2560: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
2570: 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 65 78 65  ec(db, zSql, exe
2580: 63 5f 70 72 69 6e 74 66 5f 63 62 2c 20 26 73 74  c_printf_cb, &st
2590: 72 2c 20 26 7a 45 72 72 29 3b 0a 20 20 73 70 72  r, &zErr);.  spr
25a0: 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c  intf(zBuf, "%d",
25b0: 20 72 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65   rc);.  Tcl_Appe
25c0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
25d0: 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41  , zBuf);.  Tcl_A
25e0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
25f0: 65 72 70 2c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  erp, rc==SQLITE_
2600: 4f 4b 20 3f 20 54 63 6c 5f 44 53 74 72 69 6e 67  OK ? Tcl_DString
2610: 56 61 6c 75 65 28 26 73 74 72 29 20 3a 20 7a 45  Value(&str) : zE
2620: 72 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  rr);.  Tcl_DStri
2630: 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20  ngFree(&str);.  
2640: 69 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74  if( zErr ) sqlit
2650: 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20  e3_free(zErr);. 
2660: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
2670: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
2680: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
2690: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
26a0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
26b0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 64 62  /*.** Usage:  db
26c0: 5f 65 6e 74 65 72 20 44 42 0a 2a 2a 20 20 20 20  _enter DB.**    
26d0: 20 20 20 20 20 64 62 5f 6c 65 61 76 65 20 44 42       db_leave DB
26e0: 0a 2a 2a 0a 2a 2a 20 45 6e 74 65 72 20 6f 72 20  .**.** Enter or 
26f0: 6c 65 61 76 65 20 74 68 65 20 6d 75 74 65 78 20  leave the mutex 
2700: 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  on a database co
2710: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nnection..*/.sta
2720: 74 69 63 20 69 6e 74 20 64 62 5f 65 6e 74 65 72  tic int db_enter
2730: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
2740: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
2750: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
2760: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
2770: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
2780: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
2790: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
27a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
27b0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
27c0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
27e0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
27f0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
2800: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
2810: 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  argc!=2 ){.    T
2820: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2830: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
2840: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
2850: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a   \"", argv[0], .
2860: 20 20 20 20 20 20 20 22 20 44 42 22 2c 20 30 29         " DB", 0)
2870: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2880: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
2890: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
28a0: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
28b0: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
28c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74  L_ERROR;.  sqlit
28d0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
28e0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
28f0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 73 74  urn TCL_OK;.}.st
2900: 61 74 69 63 20 69 6e 74 20 64 62 5f 6c 65 61 76  atic int db_leav
2910: 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  e(.  void *NotUs
2920: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
2930: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
2940: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
2950: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
2960: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
2970: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
2980: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2990: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
29a0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
29b0: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
29c0: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
29d0: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71  ument */.){.  sq
29e0: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28  lite3 *db;.  if(
29f0: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
2a00: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2a10: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
2a20: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
2a30: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
2a40: 0a 20 20 20 20 20 20 20 22 20 44 42 22 2c 20 30  .       " DB", 0
2a50: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2a60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
2a70: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
2a80: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
2a90: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
2aa0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69  CL_ERROR;.  sqli
2ab0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
2ac0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
2ad0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
2ae0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
2af0: 6c 69 74 65 33 5f 65 78 65 63 20 20 44 42 20 20  lite3_exec  DB  
2b00: 53 51 4c 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  SQL.**.** Invoke
2b10: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 65 78 65   the sqlite3_exe
2b20: 63 20 69 6e 74 65 72 66 61 63 65 20 75 73 69 6e  c interface usin
2b30: 67 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  g the open datab
2b40: 61 73 65 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63  ase DB.*/.static
2b50: 20 69 6e 74 20 74 65 73 74 5f 65 78 65 63 28 0a   int test_exec(.
2b60: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
2b70: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2b80: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
2b90: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
2ba0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
2bb0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
2bc0: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
2bd0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2be0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
2bf0: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
2c00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
2c10: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
2c20: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
2c30: 65 33 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53  e3 *db;.  Tcl_DS
2c40: 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74  tring str;.  int
2c50: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72   rc;.  char *zEr
2c60: 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  r = 0;.  char *z
2c70: 53 71 6c 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  Sql;.  int i, j;
2c80: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d  .  char zBuf[30]
2c90: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
2ca0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
2cb0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2cc0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
2cd0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
2ce0: 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22  gv[0], .       "
2cf0: 20 44 42 20 53 51 4c 22 2c 20 30 29 3b 0a 20 20   DB SQL", 0);.  
2d00: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2d10: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
2d20: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
2d30: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
2d40: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2d50: 52 4f 52 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  ROR;.  Tcl_DStri
2d60: 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20  ngInit(&str);.  
2d70: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
2d80: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 61 72 67  printf("%s", arg
2d90: 76 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 6a  v[2]);.  for(i=j
2da0: 3d 30 3b 20 7a 53 71 6c 5b 69 5d 3b 29 7b 0a 20  =0; zSql[i];){. 
2db0: 20 20 20 69 66 28 20 7a 53 71 6c 5b 69 5d 3d 3d     if( zSql[i]==
2dc0: 27 25 27 20 29 7b 0a 20 20 20 20 20 20 7a 53 71  '%' ){.      zSq
2dd0: 6c 5b 6a 2b 2b 5d 20 3d 20 28 74 65 73 74 48 65  l[j++] = (testHe
2de0: 78 54 6f 49 6e 74 28 7a 53 71 6c 5b 69 2b 31 5d  xToInt(zSql[i+1]
2df0: 29 3c 3c 34 29 20 2b 20 74 65 73 74 48 65 78 54  )<<4) + testHexT
2e00: 6f 49 6e 74 28 7a 53 71 6c 5b 69 2b 32 5d 29 3b  oInt(zSql[i+2]);
2e10: 0a 20 20 20 20 20 20 69 20 2b 3d 20 33 3b 0a 20  .      i += 3;. 
2e20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e30: 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 7a 53 71 6c  zSql[j++] = zSql
2e40: 5b 69 2b 2b 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  [i++];.    }.  }
2e50: 0a 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a  .  zSql[j] = 0;.
2e60: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
2e70: 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 65 78  xec(db, zSql, ex
2e80: 65 63 5f 70 72 69 6e 74 66 5f 63 62 2c 20 26 73  ec_printf_cb, &s
2e90: 74 72 2c 20 26 7a 45 72 72 29 3b 0a 20 20 73 71  tr, &zErr);.  sq
2ea0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
2eb0: 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66  ;.  sprintf(zBuf
2ec0: 2c 20 22 25 64 22 2c 20 72 63 29 3b 0a 20 20 54  , "%d", rc);.  T
2ed0: 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  cl_AppendElement
2ee0: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a  (interp, zBuf);.
2ef0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d    Tcl_AppendElem
2f00: 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 63 3d 3d  ent(interp, rc==
2f10: 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 63 6c 5f  SQLITE_OK ? Tcl_
2f20: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74  DStringValue(&st
2f30: 72 29 20 3a 20 7a 45 72 72 29 3b 0a 20 20 54 63  r) : zErr);.  Tc
2f40: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 73  l_DStringFree(&s
2f50: 74 72 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20  tr);.  if( zErr 
2f60: 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a  ) sqlite3_free(z
2f70: 45 72 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  Err);.  if( sqli
2f80: 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
2f90: 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
2fa0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2fb0: 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  R;.  return TCL_
2fc0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
2fd0: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65 78 65  ge:  sqlite3_exe
2fe0: 63 5f 6e 72 20 20 44 42 20 20 53 51 4c 0a 2a 2a  c_nr  DB  SQL.**
2ff0: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73  .** Invoke the s
3000: 71 6c 69 74 65 33 5f 65 78 65 63 20 69 6e 74 65  qlite3_exec inte
3010: 72 66 61 63 65 20 75 73 69 6e 67 20 74 68 65 20  rface using the 
3020: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 44 42  open database DB
3030: 2e 20 20 44 69 73 63 61 72 64 0a 2a 2a 20 61 6c  .  Discard.** al
3040: 6c 20 72 65 73 75 6c 74 73 0a 2a 2f 0a 73 74 61  l results.*/.sta
3050: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 78 65  tic int test_exe
3060: 63 5f 6e 72 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  c_nr(.  void *No
3070: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
3080: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
3090: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
30a0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
30b0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
30c0: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30e0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
30f0: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
3100: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
3110: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
3120: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
3130: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
3140: 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a  int rc;.  char *
3150: 7a 45 72 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  zErr = 0;.  if( 
3160: 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  argc!=3 ){.    T
3170: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
3180: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
3190: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
31a0: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a   \"", argv[0], .
31b0: 20 20 20 20 20 20 20 22 20 44 42 20 53 51 4c 22         " DB SQL"
31c0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
31d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
31e0: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
31f0: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
3200: 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
3210: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
3220: 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
3230: 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 30 2c  (db, argv[2], 0,
3240: 20 30 2c 20 26 7a 45 72 72 29 3b 0a 20 20 69 66   0, &zErr);.  if
3250: 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
3260: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
3270: 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
3280: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72  L_ERROR;.  retur
3290: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
32a0: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
32b0: 65 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f 74 65 73  e3_mprintf_z_tes
32c0: 74 20 20 53 45 50 41 52 41 54 4f 52 20 20 41 52  t  SEPARATOR  AR
32d0: 47 30 20 20 41 52 47 31 20 2e 2e 2e 0a 2a 2a 0a  G0  ARG1 ....**.
32e0: 2a 2a 20 54 65 73 74 20 74 68 65 20 25 7a 20 66  ** Test the %z f
32f0: 6f 72 6d 61 74 20 6f 66 20 73 71 6c 69 74 65 5f  ormat of sqlite_
3300: 6d 70 72 69 6e 74 66 28 29 2e 20 20 55 73 65 20  mprintf().  Use 
3310: 6d 75 6c 74 69 70 6c 65 20 6d 70 72 69 6e 74 66  multiple mprintf
3320: 28 29 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20  () calls to .** 
3330: 63 6f 6e 63 61 74 65 6e 61 74 65 20 61 72 67 30  concatenate arg0
3340: 20 74 68 72 6f 75 67 68 20 61 72 67 6e 20 75 73   through argn us
3350: 69 6e 67 20 73 65 70 61 72 61 74 6f 72 20 61 73  ing separator as
3360: 20 74 68 65 20 73 65 70 61 72 61 74 6f 72 2e 0a   the separator..
3370: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  ** Return the re
3380: 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sult..*/.static 
3390: 69 6e 74 20 74 65 73 74 5f 6d 70 72 69 6e 74 66  int test_mprintf
33a0: 5f 7a 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  _z(.  void *NotU
33b0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
33c0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
33d0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
33e0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
33f0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
3400: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
3410: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3420: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
3430: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
3440: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
3450: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
3460: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63  gument */.){.  c
3470: 68 61 72 20 2a 7a 52 65 73 75 6c 74 20 3d 20 30  har *zResult = 0
3480: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 66 6f  ;.  int i;..  fo
3490: 72 28 69 3d 32 3b 20 69 3c 61 72 67 63 20 26 26  r(i=2; i<argc &&
34a0: 20 28 69 3d 3d 32 20 7c 7c 20 7a 52 65 73 75 6c   (i==2 || zResul
34b0: 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 52  t); i++){.    zR
34c0: 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 5f  esult = sqlite3_
34d0: 6d 70 72 69 6e 74 66 28 22 25 7a 25 73 25 73 22  mprintf("%z%s%s"
34e0: 2c 20 7a 52 65 73 75 6c 74 2c 20 61 72 67 76 5b  , zResult, argv[
34f0: 31 5d 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20  1], argv[i]);.  
3500: 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  }.  Tcl_AppendRe
3510: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 52 65  sult(interp, zRe
3520: 73 75 6c 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69  sult, 0);.  sqli
3530: 74 65 33 5f 66 72 65 65 28 7a 52 65 73 75 6c 74  te3_free(zResult
3540: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
3550: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
3560: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge:  sqlite3_mpr
3570: 69 6e 74 66 5f 6e 5f 74 65 73 74 20 20 53 54 52  intf_n_test  STR
3580: 49 4e 47 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  ING.**.** Test t
3590: 68 65 20 25 6e 20 66 6f 72 6d 61 74 20 6f 66 20  he %n format of 
35a0: 73 71 6c 69 74 65 5f 6d 70 72 69 6e 74 66 28 29  sqlite_mprintf()
35b0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65  .  Return the le
35c0: 6e 67 74 68 20 6f 66 20 74 68 65 0a 2a 2a 20 69  ngth of the.** i
35d0: 6e 70 75 74 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  nput string..*/.
35e0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
35f0: 6d 70 72 69 6e 74 66 5f 6e 28 0a 20 20 76 6f 69  mprintf_n(.  voi
3600: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
3610: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
3620: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
3630: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
3640: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
3650: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
3660: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
3670: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
3680: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
3690: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
36a0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
36b0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
36c0: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 53 74 72  .){.  char *zStr
36d0: 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  ;.  int n = 0;. 
36e0: 20 7a 53 74 72 20 3d 20 73 71 6c 69 74 65 33 5f   zStr = sqlite3_
36f0: 6d 70 72 69 6e 74 66 28 22 25 73 25 6e 22 2c 20  mprintf("%s%n", 
3700: 61 72 67 76 5b 31 5d 2c 20 26 6e 29 3b 0a 20 20  argv[1], &n);.  
3710: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 74  sqlite3_free(zSt
3720: 72 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  r);.  Tcl_SetObj
3730: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
3740: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 29 29  cl_NewIntObj(n))
3750: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
3760: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
3770: 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  e:  sqlite3_snpr
3780: 69 6e 74 66 5f 69 6e 74 20 20 53 49 5a 45 20 46  intf_int  SIZE F
3790: 4f 52 4d 41 54 20 20 49 4e 54 0a 2a 2a 0a 2a 2a  ORMAT  INT.**.**
37a0: 20 54 65 73 74 20 74 68 65 20 6f 66 20 73 71 6c   Test the of sql
37b0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 29 20  ite3_snprintf() 
37c0: 72 6f 75 74 69 6e 65 2e 20 20 53 49 5a 45 20 69  routine.  SIZE i
37d0: 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
37e0: 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66  e.** output buff
37f0: 65 72 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68  er in bytes.  Th
3800: 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 69  e maximum size i
3810: 73 20 31 30 30 2e 20 20 46 4f 52 4d 41 54 20 69  s 100.  FORMAT i
3820: 73 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 61 74 20  s the.** format 
3830: 73 74 72 69 6e 67 2e 20 20 49 4e 54 20 69 73 20  string.  INT is 
3840: 61 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72  a single integer
3850: 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 20   argument.  The 
3860: 46 4f 52 4d 41 54 0a 2a 2a 20 73 74 72 69 6e 67  FORMAT.** string
3870: 20 6d 75 73 74 20 72 65 71 75 69 72 65 20 6e 6f   must require no
3880: 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 69 73 20   more than this 
3890: 6f 6e 65 20 69 6e 74 65 67 65 72 20 61 72 67 75  one integer argu
38a0: 6d 65 6e 74 2e 20 20 49 66 0a 2a 2a 20 59 6f 75  ment.  If.** You
38b0: 20 70 61 73 73 20 69 6e 20 61 20 66 6f 72 6d 61   pass in a forma
38c0: 74 20 73 74 72 69 6e 67 20 74 68 61 74 20 72 65  t string that re
38d0: 71 75 69 72 65 73 20 6d 6f 72 65 20 74 68 61 6e  quires more than
38e0: 20 6f 6e 65 20 61 72 67 75 6d 65 6e 74 2c 0a 2a   one argument,.*
38f0: 2a 20 62 61 64 20 74 68 69 6e 67 73 20 77 69 6c  * bad things wil
3900: 6c 20 68 61 70 70 65 6e 2e 0a 2a 2f 0a 73 74 61  l happen..*/.sta
3910: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 6e 70  tic int test_snp
3920: 72 69 6e 74 66 5f 69 6e 74 28 0a 20 20 76 6f 69  rintf_int(.  voi
3930: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
3940: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
3950: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
3960: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
3970: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
3980: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
3990: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
39a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
39b0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
39c0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
39d0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
39e0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
39f0: 0a 29 7b 0a 20 20 63 68 61 72 20 7a 53 74 72 5b  .){.  char zStr[
3a00: 31 30 30 5d 3b 0a 20 20 69 6e 74 20 6e 20 3d 20  100];.  int n = 
3a10: 61 74 6f 69 28 61 72 67 76 5b 31 5d 29 3b 0a 20  atoi(argv[1]);. 
3a20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
3a30: 72 6d 61 74 20 3d 20 61 72 67 76 5b 32 5d 3b 0a  rmat = argv[2];.
3a40: 20 20 69 6e 74 20 61 31 20 3d 20 61 74 6f 69 28    int a1 = atoi(
3a50: 61 72 67 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20  argv[3]);.  if( 
3a60: 6e 3e 73 69 7a 65 6f 66 28 7a 53 74 72 29 20 29  n>sizeof(zStr) )
3a70: 20 6e 20 3d 20 73 69 7a 65 6f 66 28 7a 53 74 72   n = sizeof(zStr
3a80: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  );.  sqlite3_snp
3a90: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 53 74  rintf(sizeof(zSt
3aa0: 72 29 2c 20 7a 53 74 72 2c 20 22 61 62 63 64 65  r), zStr, "abcde
3ab0: 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
3ac0: 76 77 78 79 7a 22 29 3b 0a 20 20 73 71 6c 69 74  vwxyz");.  sqlit
3ad0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a  e3_snprintf(n, z
3ae0: 53 74 72 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 31  Str, zFormat, a1
3af0: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
3b00: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 53  esult(interp, zS
3b10: 74 72 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  tr, 0);.  return
3b20: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e   TCL_OK;.}..#ifn
3b30: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3b40: 47 45 54 5f 54 41 42 4c 45 0a 0a 2f 2a 0a 2a 2a  GET_TABLE../*.**
3b50: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
3b60: 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74  _get_table_print
3b70: 66 20 20 44 42 20 20 46 4f 52 4d 41 54 20 20 53  f  DB  FORMAT  S
3b80: 54 52 49 4e 47 20 20 3f 2d 2d 6e 6f 2d 63 6f 75  TRING  ?--no-cou
3b90: 6e 74 73 3f 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b  nts?.**.** Invok
3ba0: 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 67 65  e the sqlite3_ge
3bb0: 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 28 29  t_table_printf()
3bc0: 20 69 6e 74 65 72 66 61 63 65 20 75 73 69 6e 67   interface using
3bd0: 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
3be0: 73 65 0a 2a 2a 20 44 42 2e 20 20 54 68 65 20 53  se.** DB.  The S
3bf0: 51 4c 20 69 73 20 74 68 65 20 73 74 72 69 6e 67  QL is the string
3c00: 20 46 4f 52 4d 41 54 2e 20 20 54 68 65 20 66 6f   FORMAT.  The fo
3c10: 72 6d 61 74 20 73 74 72 69 6e 67 20 73 68 6f 75  rmat string shou
3c20: 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6f 6e  ld contain.** on
3c30: 65 20 25 73 20 6f 72 20 25 71 2e 20 20 53 54 52  e %s or %q.  STR
3c40: 49 4e 47 20 69 73 20 74 68 65 20 76 61 6c 75 65  ING is the value
3c50: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 25   inserted into %
3c60: 73 20 6f 72 20 25 71 2e 0a 2a 2f 0a 73 74 61 74  s or %q..*/.stat
3c70: 69 63 20 69 6e 74 20 74 65 73 74 5f 67 65 74 5f  ic int test_get_
3c80: 74 61 62 6c 65 5f 70 72 69 6e 74 66 28 0a 20 20  table_printf(.  
3c90: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
3ca0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
3cb0: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
3cc0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
3cd0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
3ce0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
3cf0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
3d00: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3d10: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
3d20: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
3d30: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
3d40: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
3d50: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
3d60: 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53 74 72   *db;.  Tcl_DStr
3d70: 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 72  ing str;.  int r
3d80: 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20  c;.  char *zErr 
3d90: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52 6f 77 2c  = 0;.  int nRow,
3da0: 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 2a   nCol;.  char **
3db0: 61 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 69  aResult;.  int i
3dc0: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30  ;.  char zBuf[30
3dd0: 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  ];.  char *zSql;
3de0: 0a 20 20 69 6e 74 20 72 65 73 43 6f 75 6e 74 20  .  int resCount 
3df0: 3d 20 2d 31 3b 0a 20 20 69 66 28 20 61 72 67 63  = -1;.  if( argc
3e00: 3d 3d 35 20 29 7b 0a 20 20 20 20 69 66 28 20 54  ==5 ){.    if( T
3e10: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
3e20: 2c 20 61 72 67 76 5b 34 5d 2c 20 26 72 65 73 43  , argv[4], &resC
3e30: 6f 75 6e 74 29 20 29 20 72 65 74 75 72 6e 20 54  ount) ) return T
3e40: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
3e50: 69 66 28 20 61 72 67 63 21 3d 34 20 26 26 20 61  if( argc!=4 && a
3e60: 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63  rgc!=5 ){.    Tc
3e70: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
3e80: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
3e90: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
3ea0: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
3eb0: 20 20 20 20 20 20 22 20 44 42 20 46 4f 52 4d 41        " DB FORMA
3ec0: 54 20 53 54 52 49 4e 47 20 3f 43 4f 55 4e 54 3f  T STRING ?COUNT?
3ed0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
3ee0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
3ef0: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
3f00: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
3f10: 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
3f20: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
3f30: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
3f40: 26 73 74 72 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  &str);.  zSql = 
3f50: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
3f60: 61 72 67 76 5b 32 5d 2c 61 72 67 76 5b 33 5d 29  argv[2],argv[3])
3f70: 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 35 20  ;.  if( argc==5 
3f80: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
3f90: 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 28 64 62  te3_get_table(db
3fa0: 2c 20 7a 53 71 6c 2c 20 26 61 52 65 73 75 6c 74  , zSql, &aResult
3fb0: 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 29 3b 0a  , 0, 0, &zErr);.
3fc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
3fd0: 3d 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61  = sqlite3_get_ta
3fe0: 62 6c 65 28 64 62 2c 20 7a 53 71 6c 2c 20 26 61  ble(db, zSql, &a
3ff0: 52 65 73 75 6c 74 2c 20 26 6e 52 6f 77 2c 20 26  Result, &nRow, &
4000: 6e 43 6f 6c 2c 20 26 7a 45 72 72 29 3b 0a 20 20  nCol, &zErr);.  
4010: 20 20 72 65 73 43 6f 75 6e 74 20 3d 20 28 6e 52    resCount = (nR
4020: 6f 77 2b 31 29 2a 6e 43 6f 6c 3b 0a 20 20 7d 0a  ow+1)*nCol;.  }.
4030: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
4040: 53 71 6c 29 3b 0a 20 20 73 70 72 69 6e 74 66 28  Sql);.  sprintf(
4050: 7a 42 75 66 2c 20 22 25 64 22 2c 20 72 63 29 3b  zBuf, "%d", rc);
4060: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65  .  Tcl_AppendEle
4070: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  ment(interp, zBu
4080: 66 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  f);.  if( rc==SQ
4090: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
40a0: 66 28 20 61 72 67 63 3d 3d 34 20 29 7b 0a 20 20  f( argc==4 ){.  
40b0: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66      sprintf(zBuf
40c0: 2c 20 22 25 64 22 2c 20 6e 52 6f 77 29 3b 0a 20  , "%d", nRow);. 
40d0: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 45       Tcl_AppendE
40e0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a  lement(interp, z
40f0: 42 75 66 29 3b 0a 20 20 20 20 20 20 73 70 72 69  Buf);.      spri
4100: 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20  ntf(zBuf, "%d", 
4110: 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 54 63 6c  nCol);.      Tcl
4120: 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  _AppendElement(i
4130: 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20  nterp, zBuf);.  
4140: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
4150: 20 69 3c 72 65 73 43 6f 75 6e 74 3b 20 69 2b 2b   i<resCount; i++
4160: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
4170: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
4180: 70 2c 20 61 52 65 73 75 6c 74 5b 69 5d 20 3f 20  p, aResult[i] ? 
4190: 61 52 65 73 75 6c 74 5b 69 5d 20 3a 20 22 4e 55  aResult[i] : "NU
41a0: 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  LL");.    }.  }e
41b0: 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  lse{.    Tcl_App
41c0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
41d0: 70 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20  p, zErr);.  }.  
41e0: 73 71 6c 69 74 65 33 5f 66 72 65 65 5f 74 61 62  sqlite3_free_tab
41f0: 6c 65 28 61 52 65 73 75 6c 74 29 3b 0a 20 20 69  le(aResult);.  i
4200: 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74 65  f( zErr ) sqlite
4210: 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20  3_free(zErr);.  
4220: 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
4230: 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
4240: 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
4250: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74  TCL_ERROR;.  ret
4260: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23  urn TCL_OK;.}..#
4270: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
4280: 4f 4d 49 54 5f 47 45 54 5f 54 41 42 4c 45 20 2a  OMIT_GET_TABLE *
4290: 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  /.../*.** Usage:
42a0: 20 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69    sqlite3_last_i
42b0: 6e 73 65 72 74 5f 72 6f 77 69 64 20 44 42 0a 2a  nsert_rowid DB.*
42c0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65  *.** Returns the
42d0: 20 69 6e 74 65 67 65 72 20 52 4f 57 49 44 20 6f   integer ROWID o
42e0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
42f0: 74 20 69 6e 73 65 72 74 2e 0a 2a 2f 0a 73 74 61  t insert..*/.sta
4300: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 61 73  tic int test_las
4310: 74 5f 72 6f 77 69 64 28 0a 20 20 76 6f 69 64 20  t_rowid(.  void 
4320: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
4330: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
4340: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
4350: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
4360: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
4370: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
4380: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
4390: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
43a0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
43b0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
43c0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
43d0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
43e0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
43f0: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d  .  char zBuf[30]
4400: 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  ;..  if( argc!=2
4410: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
4420: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
4430: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
4440: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
4450: 72 67 76 5b 30 5d 2c 20 22 20 44 42 5c 22 22 2c  rgv[0], " DB\"",
4460: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
4470: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
4480: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
4490: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
44a0: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
44b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 70   TCL_ERROR;.  sp
44c0: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 6c 6c  rintf(zBuf, "%ll
44d0: 64 22 2c 20 73 71 6c 69 74 65 33 5f 6c 61 73 74  d", sqlite3_last
44e0: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 64 62  _insert_rowid(db
44f0: 29 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  ));.  Tcl_Append
4500: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
4510: 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  Buf, 0);.  retur
4520: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
4530: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
4540: 6c 69 74 65 33 5f 6b 65 79 20 44 42 20 4b 45 59  lite3_key DB KEY
4550: 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63  .**.** Set the c
4560: 6f 64 65 63 20 6b 65 79 2e 0a 2a 2f 0a 73 74 61  odec key..*/.sta
4570: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6b 65 79  tic int test_key
4580: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
4590: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
45a0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
45b0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
45c0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
45d0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
45e0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
45f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4600: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
4610: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
4620: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4630: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
4640: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66 64 65  ment */.){.#ifde
4650: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4660: 45 43 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  EC.  sqlite3 *db
4670: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
4680: 7a 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4b 65 79  zKey;.  int nKey
4690: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
46a0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
46b0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
46c0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
46d0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
46e0: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
46f0: 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b  FILENAME\"", 0);
4700: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
4710: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
4720: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
4730: 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
4740: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
4750: 5f 45 52 52 4f 52 3b 0a 20 20 7a 4b 65 79 20 3d  _ERROR;.  zKey =
4760: 20 61 72 67 76 5b 32 5d 3b 0a 20 20 6e 4b 65 79   argv[2];.  nKey
4770: 20 3d 20 73 74 72 6c 65 6e 28 7a 4b 65 79 29 3b   = strlen(zKey);
4780: 0a 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 28 64  .  sqlite3_key(d
4790: 62 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a  b, zKey, nKey);.
47a0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
47b0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
47c0: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
47d0: 5f 72 65 6b 65 79 20 44 42 20 4b 45 59 0a 2a 2a  _rekey DB KEY.**
47e0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63  .** Change the c
47f0: 6f 64 65 63 20 6b 65 79 2e 0a 2a 2f 0a 73 74 61  odec key..*/.sta
4800: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 72 65 6b  tic int test_rek
4810: 65 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  ey(.  void *NotU
4820: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
4830: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
4840: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
4850: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
4860: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
4870: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
4880: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4890: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
48a0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
48b0: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
48c0: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
48d0: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66  gument */.){.#if
48e0: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
48f0: 4f 44 45 43 0a 20 20 73 71 6c 69 74 65 33 20 2a  ODEC.  sqlite3 *
4900: 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
4910: 20 2a 7a 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4b   *zKey;.  int nK
4920: 65 79 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  ey;.  if( argc!=
4930: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
4940: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
4950: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
4960: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
4970: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
4980: 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30  " FILENAME\"", 0
4990: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
49a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
49b0: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
49c0: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
49d0: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
49e0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4b 65 79  CL_ERROR;.  zKey
49f0: 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20 6e 4b   = argv[2];.  nK
4a00: 65 79 20 3d 20 73 74 72 6c 65 6e 28 7a 4b 65 79  ey = strlen(zKey
4a10: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 6b  );.  sqlite3_rek
4a20: 65 79 28 64 62 2c 20 7a 4b 65 79 2c 20 6e 4b 65  ey(db, zKey, nKe
4a30: 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  y);.#endif.  ret
4a40: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
4a50: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
4a60: 69 74 65 33 5f 63 6c 6f 73 65 20 44 42 0a 2a 2a  ite3_close DB.**
4a70: 0a 2a 2a 20 43 6c 6f 73 65 73 20 74 68 65 20 64  .** Closes the d
4a80: 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62  atabase opened b
4a90: 79 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 2e 0a  y sqlite3_open..
4aa0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
4ab0: 6c 69 74 65 5f 74 65 73 74 5f 63 6c 6f 73 65 28  lite_test_close(
4ac0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
4ad0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
4ae0: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
4af0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
4b00: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
4b10: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
4b20: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
4b30: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4b40: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
4b50: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
4b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
4b70: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
4b80: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ent */.){.  sqli
4b90: 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
4ba0: 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  c;.  if( argc!=2
4bb0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
4bc0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
4bd0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
4be0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
4bf0: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
4c00: 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29   FILENAME\"", 0)
4c10: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
4c20: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
4c30: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
4c40: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
4c50: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
4c60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
4c70: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62  sqlite3_close(db
4c80: 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  );.  Tcl_SetResu
4c90: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
4ca0: 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
4cb0: 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  c), TCL_STATIC);
4cc0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
4cd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
4ce0: 3a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  :  sqlite3_close
4cf0: 5f 76 32 20 44 42 0a 2a 2a 0a 2a 2a 20 43 6c 6f  _v2 DB.**.** Clo
4d00: 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ses the database
4d10: 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74   opened by sqlit
4d20: 65 33 5f 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74  e3_open..*/.stat
4d30: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f 74 65  ic int sqlite_te
4d40: 73 74 5f 63 6c 6f 73 65 5f 76 32 28 0a 20 20 76  st_close_v2(.  v
4d50: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
4d60: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
4d70: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
4d80: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
4d90: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
4da0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
4db0: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
4dc0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4dd0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
4de0: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
4df0: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
4e00: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
4e10: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
4e20: 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *db;.  int rc;. 
4e30: 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a   if( argc!=2 ){.
4e40: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
4e50: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
4e60: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
4e70: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
4e80: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c  0],.       " FIL
4e90: 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20  ENAME\"", 0);.  
4ea0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
4eb0: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
4ec0: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
4ed0: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
4ee0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
4ef0: 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
4f00: 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 64 62 29  te3_close_v2(db)
4f10: 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ;.  Tcl_SetResul
4f20: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
4f30: 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
4f40: 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
4f50: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
4f60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
4f70: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
4f80: 78 5f 63 6f 61 6c 65 73 63 65 28 29 20 66 75 6e  x_coalesce() fun
4f90: 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e  ction..** Return
4fa0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
4fb0: 65 6e 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67  ent non-NULL arg
4fc0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
4fd0: 20 76 6f 69 64 20 74 31 5f 69 66 6e 75 6c 6c 46   void t1_ifnullF
4fe0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
4ff0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
5000: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
5010: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
5020: 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  rgv.){.  int i;.
5030: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
5040: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  c; i++){.    if(
5050: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71   SQLITE_NULL!=sq
5060: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
5070: 28 61 72 67 76 5b 69 5d 29 20 29 7b 0a 20 20 20  (argv[i]) ){.   
5080: 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74     int n = sqlit
5090: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
50a0: 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73  rgv[i]);.      s
50b0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
50c0: 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61  xt(context, (cha
50d0: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
50e0: 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29 2c 0a  _text(argv[i]),.
50f0: 20 20 20 20 20 20 20 20 20 20 6e 2c 20 53 51 4c            n, SQL
5100: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
5110: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5120: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
5130: 54 68 65 73 65 20 61 72 65 20 74 65 73 74 20 66  These are test f
5140: 75 6e 63 74 69 6f 6e 73 2e 20 20 20 20 68 65 78  unctions.    hex
5150: 38 28 29 20 69 6e 74 65 72 70 72 65 74 73 20 69  8() interprets i
5160: 74 73 20 61 72 67 75 6d 65 6e 74 20 61 73 0a 2a  ts argument as.*
5170: 2a 20 55 54 46 38 20 61 6e 64 20 72 65 74 75 72  * UTF8 and retur
5180: 6e 73 20 61 20 68 65 78 20 65 6e 63 6f 64 69 6e  ns a hex encodin
5190: 67 2e 20 20 68 65 78 31 36 6c 65 28 29 20 69 6e  g.  hex16le() in
51a0: 74 65 72 70 72 65 74 73 20 69 74 73 20 61 72 67  terprets its arg
51b0: 75 6d 65 6e 74 0a 2a 2a 20 61 73 20 55 54 46 31  ument.** as UTF1
51c0: 36 6c 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20  6le and returns 
51d0: 61 20 68 65 78 20 65 6e 63 6f 64 69 6e 67 2e 0a  a hex encoding..
51e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  */.static void h
51f0: 65 78 38 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  ex8Func(sqlite3_
5200: 63 6f 6e 74 65 78 74 20 2a 70 2c 20 69 6e 74 20  context *p, int 
5210: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
5220: 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63  lue **argv){.  c
5230: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
5240: 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 69 3b 0a  ar *z;.  int i;.
5250: 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d    char zBuf[200]
5260: 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  z = sqlite3_
5270: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
5280: 30 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  0]);.  for(i=0; 
5290: 69 3c 73 69 7a 65 6f 66 28 7a 42 75 66 29 2f 32  i<sizeof(zBuf)/2
52a0: 20 2d 20 32 20 26 26 20 7a 5b 69 5d 3b 20 69 2b   - 2 && z[i]; i+
52b0: 2b 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28  +){.    sprintf(
52c0: 26 7a 42 75 66 5b 69 2a 32 5d 2c 20 22 25 30 32  &zBuf[i*2], "%02
52d0: 78 22 2c 20 7a 5b 69 5d 26 30 78 66 66 29 3b 0a  x", z[i]&0xff);.
52e0: 20 20 7d 0a 20 20 7a 42 75 66 5b 69 2a 32 5d 20    }.  zBuf[i*2] 
52f0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  = 0;.  sqlite3_r
5300: 65 73 75 6c 74 5f 74 65 78 74 28 70 2c 20 28 63  esult_text(p, (c
5310: 68 61 72 2a 29 7a 42 75 66 2c 20 2d 31 2c 20 53  har*)zBuf, -1, S
5320: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
5330: 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ;.}.#ifndef SQLI
5340: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 73 74  TE_OMIT_UTF16.st
5350: 61 74 69 63 20 76 6f 69 64 20 68 65 78 31 36 46  atic void hex16F
5360: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
5370: 65 78 74 20 2a 70 2c 20 69 6e 74 20 61 72 67 63  ext *p, int argc
5380: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
5390: 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74  **argv){.  const
53a0: 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20   unsigned short 
53b0: 69 6e 74 20 2a 7a 3b 0a 20 20 69 6e 74 20 69 3b  int *z;.  int i;
53c0: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 34 30 30  .  char zBuf[400
53d0: 5d 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  ];.  z = sqlite3
53e0: 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 61 72  _value_text16(ar
53f0: 67 76 5b 30 5d 29 3b 0a 20 20 66 6f 72 28 69 3d  gv[0]);.  for(i=
5400: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 42 75 66  0; i<sizeof(zBuf
5410: 29 2f 34 20 2d 20 34 20 26 26 20 7a 5b 69 5d 3b  )/4 - 4 && z[i];
5420: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 70 72 69 6e   i++){.    sprin
5430: 74 66 28 26 7a 42 75 66 5b 69 2a 34 5d 2c 20 22  tf(&zBuf[i*4], "
5440: 25 30 34 78 22 2c 20 7a 5b 69 5d 26 30 78 66 66  %04x", z[i]&0xff
5450: 29 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 69 2a  );.  }.  zBuf[i*
5460: 34 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  4] = 0;.  sqlite
5470: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 2c  3_result_text(p,
5480: 20 28 63 68 61 72 2a 29 7a 42 75 66 2c 20 2d 31   (char*)zBuf, -1
5490: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
54a0: 4e 54 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  NT);.}.#endif../
54b0: 2a 0a 2a 2a 20 41 20 73 74 72 75 63 74 75 72 65  *.** A structure
54c0: 20 69 6e 74 6f 20 77 68 69 63 68 20 74 6f 20 61   into which to a
54d0: 63 63 75 6d 75 6c 61 74 65 20 74 65 78 74 2e 0a  ccumulate text..
54e0: 2a 2f 0a 73 74 72 75 63 74 20 64 73 74 72 20 7b  */.struct dstr {
54f0: 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20  .  int nAlloc;  
5500: 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74  /* Space allocat
5510: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 73 65  ed */.  int nUse
5520: 64 3b 20 20 20 2f 2a 20 53 70 61 63 65 20 75 73  d;   /* Space us
5530: 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b  ed */.  char *z;
5540: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 61 63       /* The spac
5550: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  e */.};../*.** A
5560: 70 70 65 6e 64 20 74 65 78 74 20 74 6f 20 61 20  ppend text to a 
5570: 64 73 74 72 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dstr.*/.static v
5580: 6f 69 64 20 64 73 74 72 41 70 70 65 6e 64 28 73  oid dstrAppend(s
5590: 74 72 75 63 74 20 64 73 74 72 20 2a 70 2c 20 63  truct dstr *p, c
55a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
55b0: 74 20 64 69 76 69 64 65 72 29 7b 0a 20 20 69 6e  t divider){.  in
55c0: 74 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  t n = (int)strle
55d0: 6e 28 7a 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  n(z);.  if( p->n
55e0: 55 73 65 64 20 2b 20 6e 20 2b 20 32 20 3e 20 70  Used + n + 2 > p
55f0: 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
5600: 63 68 61 72 20 2a 7a 4e 65 77 3b 0a 20 20 20 20  char *zNew;.    
5610: 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e  p->nAlloc = p->n
5620: 41 6c 6c 6f 63 2a 32 20 2b 20 6e 20 2b 20 32 30  Alloc*2 + n + 20
5630: 30 3b 0a 20 20 20 20 7a 4e 65 77 20 3d 20 73 71  0;.    zNew = sq
5640: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 2d  lite3_realloc(p-
5650: 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a  >z, p->nAlloc);.
5660: 20 20 20 20 69 66 28 20 7a 4e 65 77 3d 3d 30 20      if( zNew==0 
5670: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5680: 5f 66 72 65 65 28 70 2d 3e 7a 29 3b 0a 20 20 20  _free(p->z);.   
5690: 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20     memset(p, 0, 
56a0: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 20  sizeof(*p));.   
56b0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
56c0: 0a 20 20 20 20 70 2d 3e 7a 20 3d 20 7a 4e 65 77  .    p->z = zNew
56d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 69 76 69  ;.  }.  if( divi
56e0: 64 65 72 20 26 26 20 70 2d 3e 6e 55 73 65 64 3e  der && p->nUsed>
56f0: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 7a 5b 70 2d  0 ){.    p->z[p-
5700: 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20 64 69 76 69  >nUsed++] = divi
5710: 64 65 72 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70  der;.  }.  memcp
5720: 79 28 26 70 2d 3e 7a 5b 70 2d 3e 6e 55 73 65 64  y(&p->z[p->nUsed
5730: 5d 2c 20 7a 2c 20 6e 2b 31 29 3b 0a 20 20 70 2d  ], z, n+1);.  p-
5740: 3e 6e 55 73 65 64 20 2b 3d 20 6e 3b 0a 7d 0a 0a  >nUsed += n;.}..
5750: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 64 20 66 6f  /*.** Invoked fo
5760: 72 20 65 61 63 68 20 63 61 6c 6c 62 61 63 6b 20  r each callback 
5770: 66 72 6f 6d 20 73 71 6c 69 74 65 33 45 78 65 63  from sqlite3Exec
5780: 46 75 6e 63 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Func.*/.static i
5790: 6e 74 20 65 78 65 63 46 75 6e 63 43 61 6c 6c 62  nt execFuncCallb
57a0: 61 63 6b 28 76 6f 69 64 20 2a 70 44 61 74 61 2c  ack(void *pData,
57b0: 20 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20   int argc, char 
57c0: 2a 2a 61 72 67 76 2c 20 63 68 61 72 20 2a 2a 4e  **argv, char **N
57d0: 6f 74 55 73 65 64 29 7b 0a 20 20 73 74 72 75 63  otUsed){.  struc
57e0: 74 20 64 73 74 72 20 2a 70 20 3d 20 28 73 74 72  t dstr *p = (str
57f0: 75 63 74 20 64 73 74 72 2a 29 70 44 61 74 61 3b  uct dstr*)pData;
5800: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
5810: 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  i=0; i<argc; i++
5820: 29 7b 0a 20 20 20 20 69 66 28 20 61 72 67 76 5b  ){.    if( argv[
5830: 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64  i]==0 ){.      d
5840: 73 74 72 41 70 70 65 6e 64 28 70 2c 20 22 4e 55  strAppend(p, "NU
5850: 4c 4c 22 2c 20 27 20 27 29 3b 0a 20 20 20 20 7d  LL", ' ');.    }
5860: 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 73 74 72  else{.      dstr
5870: 41 70 70 65 6e 64 28 70 2c 20 61 72 67 76 5b 69  Append(p, argv[i
5880: 5d 2c 20 27 20 27 29 3b 0a 20 20 20 20 7d 0a 20  ], ' ');.    }. 
5890: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
58a0: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
58b0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 78 5f  tation of the x_
58c0: 73 71 6c 69 74 65 5f 65 78 65 63 28 29 20 66 75  sqlite_exec() fu
58d0: 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 66 75  nction.  This fu
58e0: 6e 63 74 69 6f 6e 20 74 61 6b 65 73 0a 2a 2a 20  nction takes.** 
58f0: 61 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e  a single argumen
5900: 74 20 61 6e 64 20 61 74 74 65 6d 70 74 73 20 74  t and attempts t
5910: 6f 20 65 78 65 63 75 74 65 20 74 68 61 74 20 61  o execute that a
5920: 72 67 75 6d 65 6e 74 20 61 73 20 53 51 4c 20 63  rgument as SQL c
5930: 6f 64 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  ode..** This is 
5940: 69 6c 6c 65 67 61 6c 20 61 6e 64 20 73 68 6f 75  illegal and shou
5950: 6c 64 20 73 65 74 20 74 68 65 20 53 51 4c 49 54  ld set the SQLIT
5960: 45 5f 4d 49 53 55 53 45 20 66 6c 61 67 20 6f 6e  E_MISUSE flag on
5970: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
5980: 2a 0a 2a 2a 20 32 30 30 34 2d 4a 61 6e 2d 30 37  *.** 2004-Jan-07
5990: 3a 20 20 57 65 20 68 61 76 65 20 63 68 61 6e 67  :  We have chang
59a0: 65 64 20 74 68 69 73 20 74 6f 20 6d 61 6b 65 20  ed this to make 
59b0: 69 74 20 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c  it legal to call
59c0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 0a   sqlite3_exec().
59d0: 2a 2a 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61  ** from within a
59e0: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 20   function call. 
59f0: 20 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f   .** .** This ro
5a00: 75 74 69 6e 65 20 73 69 6d 75 6c 61 74 65 73 20  utine simulates 
5a10: 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 68 61  the effect of ha
5a20: 76 69 6e 67 20 74 77 6f 20 74 68 72 65 61 64 73  ving two threads
5a30: 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 75   attempt to.** u
5a40: 73 65 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  se the same data
5a50: 62 61 73 65 20 61 74 20 74 68 65 20 73 61 6d 65  base at the same
5a60: 20 74 69 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   time..*/.static
5a70: 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 65   void sqlite3Exe
5a80: 63 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  cFunc(.  sqlite3
5a90: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
5aa0: 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20  t, .  int argc, 
5ab0: 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   .  sqlite3_valu
5ac0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 74  e **argv.){.  st
5ad0: 72 75 63 74 20 64 73 74 72 20 78 3b 0a 20 20 6d  ruct dstr x;.  m
5ae0: 65 6d 73 65 74 28 26 78 2c 20 30 2c 20 73 69 7a  emset(&x, 0, siz
5af0: 65 6f 66 28 78 29 29 3b 0a 20 20 28 76 6f 69 64  eof(x));.  (void
5b00: 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28 28 73  )sqlite3_exec((s
5b10: 71 6c 69 74 65 33 2a 29 73 71 6c 69 74 65 33 5f  qlite3*)sqlite3_
5b20: 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78  user_data(contex
5b30: 74 29 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  t),.      (char*
5b40: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
5b50: 65 78 74 28 61 72 67 76 5b 30 5d 29 2c 0a 20 20  ext(argv[0]),.  
5b60: 20 20 20 20 65 78 65 63 46 75 6e 63 43 61 6c 6c      execFuncCall
5b70: 62 61 63 6b 2c 20 26 78 2c 20 30 29 3b 0a 20 20  back, &x, 0);.  
5b80: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
5b90: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 78 2e 7a  ext(context, x.z
5ba0: 2c 20 78 2e 6e 55 73 65 64 2c 20 53 51 4c 49 54  , x.nUsed, SQLIT
5bb0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
5bc0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 78 2e 7a  sqlite3_free(x.z
5bd0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  );.}../*.** Impl
5be0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 6b  ementation of tk
5bf0: 74 32 32 31 33 66 75 6e 63 28 29 2c 20 61 20 73  t2213func(), a s
5c00: 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 74  calar function t
5c10: 68 61 74 20 74 61 6b 65 73 20 65 78 61 63 74 6c  hat takes exactl
5c20: 79 0a 2a 2a 20 6f 6e 65 20 61 72 67 75 6d 65 6e  y.** one argumen
5c30: 74 2e 20 49 74 20 68 61 73 20 74 77 6f 20 69 6e  t. It has two in
5c40: 74 65 72 65 73 74 69 6e 67 20 66 65 61 74 75 72  teresting featur
5c50: 65 73 3a 0a 2a 2a 0a 2a 2a 20 2a 20 49 74 20 63  es:.**.** * It c
5c60: 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f 76 61 6c  alls sqlite3_val
5c70: 75 65 5f 74 65 78 74 28 29 20 33 20 74 69 6d 65  ue_text() 3 time
5c80: 73 20 6f 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  s on the argumen
5c90: 74 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  t sqlite3_value*
5ca0: 2e 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 74 68  ..**   If the th
5cb0: 72 65 65 20 70 6f 69 6e 74 65 72 73 20 72 65 74  ree pointers ret
5cc0: 75 72 6e 65 64 20 61 72 65 20 6e 6f 74 20 74 68  urned are not th
5cd0: 65 20 73 61 6d 65 20 61 6e 20 53 51 4c 20 65 72  e same an SQL er
5ce0: 72 6f 72 20 69 73 20 72 61 69 73 65 64 2e 0a 2a  ror is raised..*
5cf0: 2a 0a 2a 2a 20 2a 20 4f 74 68 65 72 77 69 73 65  *.** * Otherwise
5d00: 20 69 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f   it returns a co
5d10: 70 79 20 6f 66 20 74 68 65 20 74 65 78 74 20 72  py of the text r
5d20: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
5d30: 20 69 74 73 20 0a 2a 2a 20 20 20 61 72 67 75 6d   its .**   argum
5d40: 65 6e 74 20 69 6e 20 73 75 63 68 20 61 20 77 61  ent in such a wa
5d50: 79 20 61 73 20 74 68 65 20 56 44 42 45 20 72 65  y as the VDBE re
5d60: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 73 20  presentation is 
5d70: 61 20 4d 65 6d 2a 20 63 65 6c 6c 20 0a 2a 2a 20  a Mem* cell .** 
5d80: 20 20 77 69 74 68 20 74 68 65 20 4d 45 4d 5f 54    with the MEM_T
5d90: 65 72 6d 20 66 6c 61 67 20 63 6c 65 61 72 2e 20  erm flag clear. 
5da0: 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23 32  .**.** Ticket #2
5db0: 32 31 33 20 63 61 6e 20 74 68 65 72 65 66 6f 72  213 can therefor
5dc0: 65 20 62 65 20 74 65 73 74 65 64 20 62 79 20 65  e be tested by e
5dd0: 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 66 6f  valuating the fo
5de0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 53 51 4c 20 65  llowing.** SQL e
5df0: 78 70 72 65 73 73 69 6f 6e 3a 0a 2a 2a 0a 2a 2a  xpression:.**.**
5e00: 20 20 20 74 6b 74 32 32 31 33 66 75 6e 63 28 74     tkt2213func(t
5e10: 6b 74 32 32 31 33 66 75 6e 63 28 27 61 20 73 74  kt2213func('a st
5e20: 72 69 6e 67 27 29 29 3b 0a 2a 2f 0a 73 74 61 74  ring'));.*/.stat
5e30: 69 63 20 76 6f 69 64 20 74 6b 74 32 32 31 33 46  ic void tkt2213F
5e40: 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  unction(.  sqlit
5e50: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
5e60: 65 78 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63  ext, .  int argc
5e70: 2c 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  ,  .  sqlite3_va
5e80: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
5e90: 69 6e 74 20 6e 54 65 78 74 3b 0a 20 20 75 6e 73  int nText;.  uns
5ea0: 69 67 6e 65 64 20 63 68 61 72 20 63 6f 6e 73 74  igned char const
5eb0: 20 2a 7a 54 65 78 74 31 3b 0a 20 20 75 6e 73 69   *zText1;.  unsi
5ec0: 67 6e 65 64 20 63 68 61 72 20 63 6f 6e 73 74 20  gned char const 
5ed0: 2a 7a 54 65 78 74 32 3b 0a 20 20 75 6e 73 69 67  *zText2;.  unsig
5ee0: 6e 65 64 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ned char const *
5ef0: 7a 54 65 78 74 33 3b 0a 0a 20 20 6e 54 65 78 74  zText3;..  nText
5f00: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
5f10: 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b  _bytes(argv[0]);
5f20: 0a 20 20 7a 54 65 78 74 31 20 3d 20 73 71 6c 69  .  zText1 = sqli
5f30: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
5f40: 72 67 76 5b 30 5d 29 3b 0a 20 20 7a 54 65 78 74  rgv[0]);.  zText
5f50: 32 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  2 = sqlite3_valu
5f60: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
5f70: 0a 20 20 7a 54 65 78 74 33 20 3d 20 73 71 6c 69  .  zText3 = sqli
5f80: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
5f90: 72 67 76 5b 30 5d 29 3b 0a 0a 20 20 69 66 28 20  rgv[0]);..  if( 
5fa0: 7a 54 65 78 74 31 21 3d 7a 54 65 78 74 32 20 7c  zText1!=zText2 |
5fb0: 7c 20 7a 54 65 78 74 32 21 3d 7a 54 65 78 74 33  | zText2!=zText3
5fc0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
5fd0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
5fe0: 74 65 78 74 2c 20 22 74 6b 74 32 32 31 33 20 69  text, "tkt2213 i
5ff0: 73 20 6e 6f 74 20 66 69 78 65 64 22 2c 20 2d 31  s not fixed", -1
6000: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
6010: 63 68 61 72 20 2a 7a 43 6f 70 79 20 3d 20 28 63  char *zCopy = (c
6020: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  har *)sqlite3_ma
6030: 6c 6c 6f 63 28 6e 54 65 78 74 29 3b 0a 20 20 20  lloc(nText);.   
6040: 20 6d 65 6d 63 70 79 28 7a 43 6f 70 79 2c 20 7a   memcpy(zCopy, z
6050: 54 65 78 74 31 2c 20 6e 54 65 78 74 29 3b 0a 20  Text1, nText);. 
6060: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
6070: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
6080: 7a 43 6f 70 79 2c 20 6e 54 65 78 74 2c 20 73 71  zCopy, nText, sq
6090: 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d  lite3_free);.  }
60a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
60b0: 6c 6c 6f 77 69 6e 67 20 53 51 4c 20 66 75 6e 63  llowing SQL func
60c0: 74 69 6f 6e 20 74 61 6b 65 73 20 34 20 61 72 67  tion takes 4 arg
60d0: 75 6d 65 6e 74 73 2e 20 20 54 68 65 20 32 6e 64  uments.  The 2nd
60e0: 20 61 6e 64 0a 2a 2a 20 34 74 68 20 61 72 67 75   and.** 4th argu
60f0: 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 6f 6e 65  ment must be one
6100: 20 6f 66 20 74 68 65 73 65 20 73 74 72 69 6e 67   of these string
6110: 73 3a 20 20 27 74 65 78 74 27 2c 20 27 74 65 78  s:  'text', 'tex
6120: 74 31 36 27 2c 0a 2a 2a 20 6f 72 20 27 62 6c 6f  t16',.** or 'blo
6130: 62 27 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  b' corresponding
6140: 20 74 6f 20 41 50 49 20 66 75 6e 63 74 69 6f 6e   to API function
6150: 73 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c  s.**.**      sql
6160: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
6170: 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
6180: 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 29  3_value_text16()
6190: 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
61a0: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 29 0a 2a 2a  _value_blob().**
61b0: 0a 2a 2a 20 54 68 65 20 74 68 69 72 64 20 61 72  .** The third ar
61c0: 67 75 6d 65 6e 74 20 69 73 20 61 20 73 74 72 69  gument is a stri
61d0: 6e 67 2c 20 65 69 74 68 65 72 20 27 62 79 74 65  ng, either 'byte
61e0: 73 27 20 6f 72 20 27 62 79 74 65 73 31 36 27 20  s' or 'bytes16' 
61f0: 6f 72 20 27 6e 6f 6f 70 27 2c 0a 2a 2a 20 63 6f  or 'noop',.** co
6200: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 41  rresponding to A
6210: 50 49 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  PIs:.**.**      
6220: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
6230: 74 65 73 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  tes().**      sq
6240: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
6250: 73 31 36 28 29 0a 2a 2a 20 20 20 20 20 20 6e 6f  s16().**      no
6260: 6f 70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 41 50 49  op.**.** The API
6270: 73 20 64 65 73 69 67 6e 61 74 65 64 20 62 79 20  s designated by 
6280: 74 68 65 20 32 6e 64 20 74 68 72 6f 75 67 68 20  the 2nd through 
6290: 34 74 68 20 61 72 67 75 6d 65 6e 74 73 20 61 72  4th arguments ar
62a0: 65 20 61 70 70 6c 69 65 64 0a 2a 2a 20 74 6f 20  e applied.** to 
62b0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
62c0: 6e 74 20 69 6e 20 6f 72 64 65 72 2e 20 20 49 66  nt in order.  If
62d0: 20 74 68 65 20 70 6f 69 6e 74 65 72 73 20 72 65   the pointers re
62e0: 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a  turned by the.**
62f0: 20 73 65 63 6f 6e 64 20 61 6e 64 20 66 6f 75 72   second and four
6300: 74 68 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  th are different
6310: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
6320: 65 74 75 72 6e 73 20 31 2e 20 20 4f 74 68 65 72  eturns 1.  Other
6330: 77 69 73 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f  wise,.** this ro
6340: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 30 2e  utine returns 0.
6350: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
6360: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
6370: 74 65 73 74 20 74 6f 20 73 65 65 20 77 68 65 6e  test to see when
6380: 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65   returned pointe
6390: 72 73 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 5f  rs from.** the _
63a0: 74 65 78 74 28 29 2c 20 5f 74 65 78 74 31 36 28  text(), _text16(
63b0: 29 20 61 6e 64 20 5f 62 6c 6f 62 28 29 20 41 50  ) and _blob() AP
63c0: 49 73 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69  Is become invali
63d0: 64 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  dated..*/.static
63e0: 20 76 6f 69 64 20 70 74 72 43 68 6e 67 46 75 6e   void ptrChngFun
63f0: 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ction(.  sqlite3
6400: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
6410: 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20  t, .  int argc, 
6420: 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   .  sqlite3_valu
6430: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f  e **argv.){.  co
6440: 6e 73 74 20 76 6f 69 64 20 2a 70 31 2c 20 2a 70  nst void *p1, *p
6450: 32 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  2;.  const char 
6460: 2a 7a 43 6d 64 3b 0a 20 20 69 66 28 20 61 72 67  *zCmd;.  if( arg
6470: 63 21 3d 34 20 29 20 72 65 74 75 72 6e 3b 0a 20  c!=4 ) return;. 
6480: 20 7a 43 6d 64 20 3d 20 28 63 6f 6e 73 74 20 63   zCmd = (const c
6490: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
64a0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
64b0: 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20  ;.  if( zCmd==0 
64c0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
64d0: 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22 74 65 78  strcmp(zCmd,"tex
64e0: 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 31  t")==0 ){.    p1
64f0: 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29   = (const void*)
6500: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
6510: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 23 69 66  xt(argv[0]);.#if
6520: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6530: 5f 55 54 46 31 36 0a 20 20 7d 65 6c 73 65 20 69  _UTF16.  }else i
6540: 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20  f( strcmp(zCmd, 
6550: 22 74 65 78 74 31 36 22 29 3d 3d 30 20 29 7b 0a  "text16")==0 ){.
6560: 20 20 20 20 70 31 20 3d 20 28 63 6f 6e 73 74 20      p1 = (const 
6570: 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61  void*)sqlite3_va
6580: 6c 75 65 5f 74 65 78 74 31 36 28 61 72 67 76 5b  lue_text16(argv[
6590: 30 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  0]);.#endif.  }e
65a0: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
65b0: 43 6d 64 2c 20 22 62 6c 6f 62 22 29 3d 3d 30 20  Cmd, "blob")==0 
65c0: 29 7b 0a 20 20 20 20 70 31 20 3d 20 28 63 6f 6e  ){.    p1 = (con
65d0: 73 74 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  st void*)sqlite3
65e0: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76  _value_blob(argv
65f0: 5b 30 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  [0]);.  }else{. 
6600: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
6610: 20 7a 43 6d 64 20 3d 20 28 63 6f 6e 73 74 20 63   zCmd = (const c
6620: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
6630: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 32 5d 29  ue_text(argv[2])
6640: 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20  ;.  if( zCmd==0 
6650: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
6660: 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22 62 79 74  strcmp(zCmd,"byt
6670: 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  es")==0 ){.    s
6680: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
6690: 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 23 69 66  es(argv[0]);.#if
66a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
66b0: 5f 55 54 46 31 36 0a 20 20 7d 65 6c 73 65 20 69  _UTF16.  }else i
66c0: 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20  f( strcmp(zCmd, 
66d0: 22 62 79 74 65 73 31 36 22 29 3d 3d 30 20 29 7b  "bytes16")==0 ){
66e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  .    sqlite3_val
66f0: 75 65 5f 62 79 74 65 73 31 36 28 61 72 67 76 5b  ue_bytes16(argv[
6700: 30 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  0]);.#endif.  }e
6710: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
6720: 43 6d 64 2c 20 22 6e 6f 6f 70 22 29 3d 3d 30 20  Cmd, "noop")==0 
6730: 29 7b 0a 20 20 20 20 2f 2a 20 64 6f 20 6e 6f 74  ){.    /* do not
6740: 68 69 6e 67 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  hing */.  }else{
6750: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
6760: 0a 20 20 7a 43 6d 64 20 3d 20 28 63 6f 6e 73 74  .  zCmd = (const
6770: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
6780: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 33  alue_text(argv[3
6790: 5d 29 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d  ]);.  if( zCmd==
67a0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
67b0: 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22 74  ( strcmp(zCmd,"t
67c0: 65 78 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ext")==0 ){.    
67d0: 70 32 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64  p2 = (const void
67e0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
67f0: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 23  text(argv[0]);.#
6800: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6810: 49 54 5f 55 54 46 31 36 0a 20 20 7d 65 6c 73 65  IT_UTF16.  }else
6820: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64   if( strcmp(zCmd
6830: 2c 20 22 74 65 78 74 31 36 22 29 3d 3d 30 20 29  , "text16")==0 )
6840: 7b 0a 20 20 20 20 70 32 20 3d 20 28 63 6f 6e 73  {.    p2 = (cons
6850: 74 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f  t void*)sqlite3_
6860: 76 61 6c 75 65 5f 74 65 78 74 31 36 28 61 72 67  value_text16(arg
6870: 76 5b 30 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20  v[0]);.#endif.  
6880: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
6890: 28 7a 43 6d 64 2c 20 22 62 6c 6f 62 22 29 3d 3d  (zCmd, "blob")==
68a0: 30 20 29 7b 0a 20 20 20 20 70 32 20 3d 20 28 63  0 ){.    p2 = (c
68b0: 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c 69 74  onst void*)sqlit
68c0: 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72  e3_value_blob(ar
68d0: 67 76 5b 30 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b  gv[0]);.  }else{
68e0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
68f0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
6900: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 70  t_int(context, p
6910: 31 21 3d 70 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  1!=p2);.}../*.**
6920: 20 54 68 69 73 20 53 51 4c 20 66 75 6e 63 74 69   This SQL functi
6930: 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 64 69 66  on returns a dif
6940: 66 65 72 65 6e 74 20 61 6e 73 77 65 72 20 65 61  ferent answer ea
6950: 63 68 20 74 69 6d 65 20 69 74 20 69 73 20 63 61  ch time it is ca
6960: 6c 6c 65 64 2c 20 65 76 65 6e 20 69 66 0a 2a 2a  lled, even if.**
6970: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 61   the arguments a
6980: 72 65 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a  re the same..*/.
6990: 73 74 61 74 69 63 20 76 6f 69 64 20 6e 6f 6e 64  static void nond
69a0: 65 74 65 72 6d 69 6e 69 73 74 69 63 46 75 6e 63  eterministicFunc
69b0: 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  tion(.  sqlite3_
69c0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
69d0: 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  , .  int argc,  
69e0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
69f0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 74 61   **argv.){.  sta
6a00: 74 69 63 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  tic int cnt = 0;
6a10: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
6a20: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 63  t_int(context, c
6a30: 6e 74 2b 2b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nt++);.}../*.** 
6a40: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
6a50: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20  create_function 
6a60: 44 42 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68  DB.**.** Call th
6a70: 65 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  e sqlite3_create
6a80: 5f 66 75 6e 63 74 69 6f 6e 20 41 50 49 20 6f 6e  _function API on
6a90: 20 74 68 65 20 67 69 76 65 6e 20 64 61 74 61 62   the given datab
6aa0: 61 73 65 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20  ase in order.** 
6ab0: 74 6f 20 63 72 65 61 74 65 20 61 20 66 75 6e 63  to create a func
6ac0: 74 69 6f 6e 20 6e 61 6d 65 64 20 22 78 5f 63 6f  tion named "x_co
6ad0: 61 6c 65 73 63 65 22 2e 20 20 54 68 69 73 20 66  alesce".  This f
6ae0: 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65  unction does the
6af0: 20 73 61 6d 65 20 74 68 69 6e 67 0a 2a 2a 20 61   same thing.** a
6b00: 73 20 74 68 65 20 22 63 6f 61 6c 65 73 63 65 22  s the "coalesce"
6b10: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73   function.  This
6b20: 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 72   function also r
6b30: 65 67 69 73 74 65 72 73 20 61 6e 20 53 51 4c 20  egisters an SQL 
6b40: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6e 61 6d 65  function.** name
6b50: 64 20 22 78 5f 73 71 6c 69 74 65 5f 65 78 65 63  d "x_sqlite_exec
6b60: 22 20 74 68 61 74 20 69 6e 76 6f 6b 65 73 20 73  " that invokes s
6b70: 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 20 20  qlite3_exec().  
6b80: 49 6e 76 6f 6b 69 6e 67 20 73 71 6c 69 74 65 33  Invoking sqlite3
6b90: 5f 65 78 65 63 28 29 0a 2a 2a 20 69 6e 20 74 68  _exec().** in th
6ba0: 69 73 20 77 61 79 20 69 73 20 69 6c 6c 65 67 61  is way is illega
6bb0: 6c 20 72 65 63 75 72 73 69 6f 6e 20 61 6e 64 20  l recursion and 
6bc0: 73 68 6f 75 6c 64 20 72 61 69 73 65 20 61 6e 20  should raise an 
6bd0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 65 72  SQLITE_MISUSE er
6be0: 72 6f 72 2e 0a 2a 2a 20 54 68 65 20 65 66 66 65  ror..** The effe
6bf0: 63 74 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  ct is similar to
6c00: 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74   trying to use t
6c10: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
6c20: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 72 6f 6d   connection from
6c30: 0a 2a 2a 20 74 77 6f 20 74 68 72 65 61 64 73 20  .** two threads 
6c40: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
6c50: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67  ..**.** The orig
6c60: 69 6e 61 6c 20 6d 6f 74 69 76 61 74 69 6f 6e 20  inal motivation 
6c70: 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  for this routine
6c80: 20 77 61 73 20 74 6f 20 62 65 20 61 62 6c 65 20   was to be able 
6c90: 74 6f 20 63 61 6c 6c 20 74 68 65 0a 2a 2a 20 73  to call the.** s
6ca0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
6cb0: 6e 63 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  nction function 
6cc0: 77 68 69 6c 65 20 61 20 71 75 65 72 79 20 69 73  while a query is
6cd0: 20 69 6e 20 70 72 6f 67 72 65 73 73 20 69 6e 20   in progress in 
6ce0: 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 74 65 73 74  order.** to test
6cf0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 49 53 55   the SQLITE_MISU
6d00: 53 45 20 64 65 74 65 63 74 69 6f 6e 20 6c 6f 67  SE detection log
6d10: 69 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ic..*/.static in
6d20: 74 20 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75  t test_create_fu
6d30: 6e 63 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a  nction(.  void *
6d40: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
6d50: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
6d60: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
6d70: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
6d80: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
6d90: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
6da0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
6db0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
6dc0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
6dd0: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
6de0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
6df0: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
6e00: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
6e10: 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28  ite3 *db;..  if(
6e20: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
6e30: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
6e40: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
6e50: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
6e60: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
6e70: 20 20 20 20 20 20 20 22 20 44 42 5c 22 22 2c 20         " DB\"", 
6e80: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
6e90: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
6ea0: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
6eb0: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
6ec0: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
6ed0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
6ee0: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
6ef0: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 78  _function(db, "x
6f00: 5f 63 6f 61 6c 65 73 63 65 22 2c 20 2d 31 2c 20  _coalesce", -1, 
6f10: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
6f20: 0a 20 20 20 20 20 20 20 20 74 31 5f 69 66 6e 75  .        t1_ifnu
6f30: 6c 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  llFunc, 0, 0);. 
6f40: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6f50: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
6f60: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
6f70: 6e 63 74 69 6f 6e 28 64 62 2c 20 22 68 65 78 38  nction(db, "hex8
6f80: 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
6f90: 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
6fa0: 4d 49 4e 49 53 54 49 43 2c 0a 20 20 20 20 20 20  MINISTIC,.      
6fb0: 20 20 20 20 30 2c 20 68 65 78 38 46 75 6e 63 2c      0, hex8Func,
6fc0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 69 66 6e   0, 0);.  }.#ifn
6fd0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6fe0: 55 54 46 31 36 0a 20 20 69 66 28 20 72 63 3d 3d  UTF16.  if( rc==
6ff0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7000: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
7010: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
7020: 2c 20 22 68 65 78 31 36 22 2c 20 31 2c 20 53 51  , "hex16", 1, SQ
7030: 4c 49 54 45 5f 55 54 46 31 36 20 7c 20 53 51 4c  LITE_UTF16 | SQL
7040: 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
7050: 43 2c 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20  C,.          0, 
7060: 68 65 78 31 36 46 75 6e 63 2c 20 30 2c 20 30 29  hex16Func, 0, 0)
7070: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
7080: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7090: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
70a0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
70b0: 74 69 6f 6e 28 64 62 2c 20 22 74 6b 74 32 32 31  tion(db, "tkt221
70c0: 33 66 75 6e 63 22 2c 20 31 2c 20 53 51 4c 49 54  3func", 1, SQLIT
70d0: 45 5f 41 4e 59 2c 20 30 2c 20 0a 20 20 20 20 20  E_ANY, 0, .     
70e0: 20 20 20 20 20 74 6b 74 32 32 31 33 46 75 6e 63       tkt2213Func
70f0: 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  tion, 0, 0);.  }
7100: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
7110: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
7120: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
7130: 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 70 6f  function(db, "po
7140: 69 6e 74 65 72 5f 63 68 61 6e 67 65 22 2c 20 34  inter_change", 4
7150: 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c  , SQLITE_ANY, 0,
7160: 20 0a 20 20 20 20 20 20 20 20 20 20 70 74 72 43   .          ptrC
7170: 68 6e 67 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20  hngFunction, 0, 
7180: 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 75  0);.  }..  /* Fu
7190: 6e 63 74 69 6f 6e 73 20 63 6f 75 6e 74 65 72 31  nctions counter1
71a0: 28 29 20 61 6e 64 20 63 6f 75 6e 74 65 72 32 28  () and counter2(
71b0: 29 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  ) have the same 
71c0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2d  implementation -
71d0: 20 74 68 65 79 0a 20 20 2a 2a 20 62 6f 74 68 20   they.  ** both 
71e0: 72 65 74 75 72 6e 20 61 6e 20 61 73 63 65 6e 64  return an ascend
71f0: 69 6e 67 20 69 6e 74 65 67 65 72 20 77 69 74 68  ing integer with
7200: 20 65 61 63 68 20 63 61 6c 6c 2e 20 20 42 75 74   each call.  But
7210: 20 63 6f 75 6e 74 65 72 31 28 29 20 69 73 20 6d   counter1() is m
7220: 61 72 6b 65 64 0a 20 20 2a 2a 20 61 73 20 6e 6f  arked.  ** as no
7230: 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20  n-deterministic 
7240: 61 6e 64 20 63 6f 75 6e 74 65 72 32 28 29 20 69  and counter2() i
7250: 73 20 6d 61 72 6b 65 64 20 61 73 20 64 65 74 65  s marked as dete
7260: 72 6d 69 6e 69 73 74 69 63 2e 0a 20 20 2a 2f 0a  rministic..  */.
7270: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
7280: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
7290: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
72a0: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 63 6f 75  unction(db, "cou
72b0: 6e 74 65 72 31 22 2c 20 2d 31 2c 20 53 51 4c 49  nter1", -1, SQLI
72c0: 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20  TE_UTF8,.       
72d0: 20 20 20 30 2c 20 6e 6f 6e 64 65 74 65 72 6d 69     0, nondetermi
72e0: 6e 69 73 74 69 63 46 75 6e 63 74 69 6f 6e 2c 20  nisticFunction, 
72f0: 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  0, 0);.  }.  if(
7300: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
7310: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
7320: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
7330: 6f 6e 28 64 62 2c 20 22 63 6f 75 6e 74 65 72 32  on(db, "counter2
7340: 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  ", -1, SQLITE_UT
7350: 46 38 7c 53 51 4c 49 54 45 5f 44 45 54 45 52 4d  F8|SQLITE_DETERM
7360: 49 4e 49 53 54 49 43 2c 0a 20 20 20 20 20 20 20  INISTIC,.       
7370: 20 20 20 30 2c 20 6e 6f 6e 64 65 74 65 72 6d 69     0, nondetermi
7380: 6e 69 73 74 69 63 46 75 6e 63 74 69 6f 6e 2c 20  nisticFunction, 
7390: 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  0, 0);.  }..#ifn
73a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
73b0: 55 54 46 31 36 0a 20 20 2f 2a 20 55 73 65 20 74  UTF16.  /* Use t
73c0: 68 65 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  he sqlite3_creat
73d0: 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28 29 20 41  e_function16() A
73e0: 50 49 20 68 65 72 65 2e 20 4d 61 69 6e 6c 79 20  PI here. Mainly 
73f0: 66 6f 72 20 66 75 6e 2c 20 62 75 74 20 61 6c 73  for fun, but als
7400: 6f 20 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20  o .  ** because 
7410: 69 74 20 69 73 20 6e 6f 74 20 74 65 73 74 65 64  it is not tested
7420: 20 61 6e 79 77 68 65 72 65 20 65 6c 73 65 2e 20   anywhere else. 
7430: 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
7440: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f  ITE_OK ){.    co
7450: 6e 73 74 20 76 6f 69 64 20 2a 7a 55 74 66 31 36  nst void *zUtf16
7460: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61  ;.    sqlite3_va
7470: 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 20 20 73  lue *pVal;.    s
7480: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
7490: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
74a0: 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65     pVal = sqlite
74b0: 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20  3ValueNew(db);. 
74c0: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
74d0: 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20  etStr(pVal, -1, 
74e0: 22 78 5f 73 71 6c 69 74 65 5f 65 78 65 63 22 2c  "x_sqlite_exec",
74f0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
7500: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
7510: 20 20 7a 55 74 66 31 36 20 3d 20 73 71 6c 69 74    zUtf16 = sqlit
7520: 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c  e3ValueText(pVal
7530: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  , SQLITE_UTF16NA
7540: 54 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64  TIVE);.    if( d
7550: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7560: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
7570: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
7580: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
7590: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
75a0: 5f 66 75 6e 63 74 69 6f 6e 31 36 28 64 62 2c 20  _function16(db, 
75b0: 7a 55 74 66 31 36 2c 20 0a 20 20 20 20 20 20 20  zUtf16, .       
75c0: 20 20 20 20 20 20 20 20 20 31 2c 20 53 51 4c 49           1, SQLI
75d0: 54 45 5f 55 54 46 31 36 2c 20 64 62 2c 20 73 71  TE_UTF16, db, sq
75e0: 6c 69 74 65 33 45 78 65 63 46 75 6e 63 2c 20 30  lite3ExecFunc, 0
75f0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
7600: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
7610: 28 70 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69  (pVal);.    sqli
7620: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
7630: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a  db->mutex);.  }.
7640: 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 73 71  #endif..  if( sq
7650: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
7660: 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
7670: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
7680: 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65  ROR;.  Tcl_SetRe
7690: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
76a0: 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
76b0: 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75  (rc), 0);.  retu
76c0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
76d0: 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20  .** Routines to 
76e0: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 78 5f  implement the x_
76f0: 63 6f 75 6e 74 28 29 20 61 67 67 72 65 67 61 74  count() aggregat
7700: 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  e function..**.*
7710: 2a 20 78 5f 63 6f 75 6e 74 28 29 20 63 6f 75 6e  * x_count() coun
7720: 74 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ts the number of
7730: 20 6e 6f 6e 2d 6e 75 6c 6c 20 61 72 67 75 6d 65   non-null argume
7740: 6e 74 73 2e 20 20 42 75 74 20 74 68 65 72 65 20  nts.  But there 
7750: 61 72 65 0a 2a 2a 20 73 6f 6d 65 20 74 77 69 73  are.** some twis
7760: 74 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70  ts for testing p
7770: 75 72 70 6f 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  urposes..**.** I
7780: 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74  f the argument t
7790: 6f 20 78 5f 63 6f 75 6e 74 28 29 20 69 73 20 34  o x_count() is 4
77a0: 30 20 74 68 65 6e 20 61 20 55 54 46 2d 38 20 65  0 then a UTF-8 e
77b0: 72 72 6f 72 20 69 73 20 72 65 70 6f 72 74 65 64  rror is reported
77c0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 65 70 20  .** on the step 
77d0: 66 75 6e 63 74 69 6f 6e 2e 20 20 49 66 20 78 5f  function.  If x_
77e0: 63 6f 75 6e 74 28 34 31 29 20 69 73 20 73 65 65  count(41) is see
77f0: 6e 2c 20 74 68 65 6e 20 61 20 55 54 46 2d 31 36  n, then a UTF-16
7800: 20 65 72 72 6f 72 0a 2a 2a 20 69 73 20 72 65 70   error.** is rep
7810: 6f 72 74 65 64 20 6f 6e 20 74 68 65 20 73 74 65  orted on the ste
7820: 70 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 66 20  p function.  If 
7830: 74 68 65 20 74 6f 74 61 6c 20 63 6f 75 6e 74 20  the total count 
7840: 69 73 20 34 32 2c 20 74 68 65 6e 0a 2a 2a 20 61  is 42, then.** a
7850: 20 55 54 46 2d 38 20 65 72 72 6f 72 20 69 73 20   UTF-8 error is 
7860: 72 65 70 6f 72 74 65 64 20 6f 6e 20 74 68 65 20  reported on the 
7870: 66 69 6e 61 6c 69 7a 65 20 66 75 6e 63 74 69 6f  finalize functio
7880: 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  n..*/.typedef st
7890: 72 75 63 74 20 74 31 43 6f 75 6e 74 43 74 78 20  ruct t1CountCtx 
78a0: 74 31 43 6f 75 6e 74 43 74 78 3b 0a 73 74 72 75  t1CountCtx;.stru
78b0: 63 74 20 74 31 43 6f 75 6e 74 43 74 78 20 7b 0a  ct t1CountCtx {.
78c0: 20 20 69 6e 74 20 6e 3b 0a 7d 3b 0a 73 74 61 74    int n;.};.stat
78d0: 69 63 20 76 6f 69 64 20 74 31 43 6f 75 6e 74 53  ic void t1CountS
78e0: 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  tep(.  sqlite3_c
78f0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
7900: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
7910: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
7920: 72 67 76 0a 29 7b 0a 20 20 74 31 43 6f 75 6e 74  rgv.){.  t1Count
7930: 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71  Ctx *p;.  p = sq
7940: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
7950: 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
7960: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
7970: 69 66 28 20 28 61 72 67 63 3d 3d 30 20 7c 7c 20  if( (argc==0 || 
7980: 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c  SQLITE_NULL!=sql
7990: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
79a0: 61 72 67 76 5b 30 5d 29 20 29 20 26 26 20 70 20  argv[0]) ) && p 
79b0: 29 7b 0a 20 20 20 20 70 2d 3e 6e 2b 2b 3b 0a 20  ){.    p->n++;. 
79c0: 20 7d 0a 20 20 69 66 28 20 61 72 67 63 3e 30 20   }.  if( argc>0 
79d0: 29 7b 0a 20 20 20 20 69 6e 74 20 76 20 3d 20 73  ){.    int v = s
79e0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
79f0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69  (argv[0]);.    i
7a00: 66 28 20 76 3d 3d 34 30 20 29 7b 0a 20 20 20 20  f( v==40 ){.    
7a10: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
7a20: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
7a30: 22 76 61 6c 75 65 20 6f 66 20 34 30 20 68 61 6e  "value of 40 han
7a40: 64 65 64 20 74 6f 20 78 5f 63 6f 75 6e 74 22 2c  ded to x_count",
7a50: 20 2d 31 29 3b 0a 23 69 66 6e 64 65 66 20 53 51   -1);.#ifndef SQ
7a60: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
7a70: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 76 3d      }else if( v=
7a80: 3d 34 31 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  =41 ){.      con
7a90: 73 74 20 63 68 61 72 20 7a 55 74 66 31 36 45 72  st char zUtf16Er
7aa0: 72 4d 73 67 5b 5d 20 3d 20 7b 20 30 2c 20 30 78  rMsg[] = { 0, 0x
7ab0: 36 31 2c 20 30 2c 20 30 78 36 32 2c 20 30 2c 20  61, 0, 0x62, 0, 
7ac0: 30 78 36 33 2c 20 30 2c 20 30 2c 20 30 7d 3b 0a  0x63, 0, 0, 0};.
7ad0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
7ae0: 73 75 6c 74 5f 65 72 72 6f 72 31 36 28 63 6f 6e  sult_error16(con
7af0: 74 65 78 74 2c 20 26 7a 55 74 66 31 36 45 72 72  text, &zUtf16Err
7b00: 4d 73 67 5b 31 2d 53 51 4c 49 54 45 5f 42 49 47  Msg[1-SQLITE_BIG
7b10: 45 4e 44 49 41 4e 5d 2c 20 2d 31 29 3b 0a 23 65  ENDIAN], -1);.#e
7b20: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ndif.    }.  }.}
7b30: 20 20 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20     .static void 
7b40: 74 31 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 28  t1CountFinalize(
7b50: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
7b60: 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 74 31 43  *context){.  t1C
7b70: 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70 20  ountCtx *p;.  p 
7b80: 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  = sqlite3_aggreg
7b90: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
7ba0: 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  ext, sizeof(*p))
7bb0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
7bc0: 20 69 66 28 20 70 2d 3e 6e 3d 3d 34 32 20 29 7b   if( p->n==42 ){
7bd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
7be0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
7bf0: 65 78 74 2c 20 22 78 5f 63 6f 75 6e 74 20 74 6f  ext, "x_count to
7c00: 74 61 6c 73 20 74 6f 20 34 32 22 2c 20 2d 31 29  tals to 42", -1)
7c10: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7c20: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
7c30: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 70  t_int(context, p
7c40: 20 3f 20 70 2d 3e 6e 20 3a 20 30 29 3b 0a 20 20   ? p->n : 0);.  
7c50: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64    }.  }.}..#ifnd
7c60: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
7c70: 45 50 52 45 43 41 54 45 44 0a 73 74 61 74 69 63  EPRECATED.static
7c80: 20 76 6f 69 64 20 6c 65 67 61 63 79 43 6f 75 6e   void legacyCoun
7c90: 74 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33  tStep(.  sqlite3
7ca0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
7cb0: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
7cc0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
7cd0: 2a 61 72 67 76 0a 29 7b 0a 20 20 2f 2a 20 6e 6f  *argv.){.  /* no
7ce0: 2d 6f 70 20 2a 2f 0a 7d 0a 0a 73 74 61 74 69 63  -op */.}..static
7cf0: 20 76 6f 69 64 20 6c 65 67 61 63 79 43 6f 75 6e   void legacyCoun
7d00: 74 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65  tFinalize(sqlite
7d10: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
7d20: 78 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 72  xt){.  sqlite3_r
7d30: 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78  esult_int(contex
7d40: 74 2c 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65  t, sqlite3_aggre
7d50: 67 61 74 65 5f 63 6f 75 6e 74 28 63 6f 6e 74 65  gate_count(conte
7d60: 78 74 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  xt));.}.#endif..
7d70: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
7d80: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 61 67 67  lite3_create_agg
7d90: 72 65 67 61 74 65 20 44 42 0a 2a 2a 0a 2a 2a 20  regate DB.**.** 
7da0: 43 61 6c 6c 20 74 68 65 20 73 71 6c 69 74 65 33  Call the sqlite3
7db0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
7dc0: 20 41 50 49 20 6f 6e 20 74 68 65 20 67 69 76 65   API on the give
7dd0: 6e 20 64 61 74 61 62 61 73 65 20 69 6e 20 6f 72  n database in or
7de0: 64 65 72 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65  der.** to create
7df0: 20 61 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65   a function name
7e00: 64 20 22 78 5f 63 6f 75 6e 74 22 2e 20 20 54 68  d "x_count".  Th
7e10: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73  is function is s
7e20: 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20 74 68 65  imilar.** to the
7e30: 20 62 75 69 6c 74 2d 69 6e 20 63 6f 75 6e 74 28   built-in count(
7e40: 29 20 66 75 6e 63 74 69 6f 6e 2c 20 77 69 74 68  ) function, with
7e50: 20 61 20 66 65 77 20 73 70 65 63 69 61 6c 20 71   a few special q
7e60: 75 69 72 6b 73 0a 2a 2a 20 66 6f 72 20 74 65 73  uirks.** for tes
7e70: 74 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  ting the sqlite3
7e80: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 29 20  _result_error() 
7e90: 41 50 49 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  APIs..**.** The 
7ea0: 6f 72 69 67 69 6e 61 6c 20 6d 6f 74 69 76 61 74  original motivat
7eb0: 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 72 6f 75  ion for this rou
7ec0: 74 69 6e 65 20 77 61 73 20 74 6f 20 62 65 20 61  tine was to be a
7ed0: 62 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 65 0a  ble to call the.
7ee0: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  ** sqlite3_creat
7ef0: 65 5f 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e_aggregate func
7f00: 74 69 6f 6e 20 77 68 69 6c 65 20 61 20 71 75 65  tion while a que
7f10: 72 79 20 69 73 20 69 6e 20 70 72 6f 67 72 65 73  ry is in progres
7f20: 73 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f  s in order.** to
7f30: 20 74 65 73 74 20 74 68 65 20 53 51 4c 49 54 45   test the SQLITE
7f40: 5f 4d 49 53 55 53 45 20 64 65 74 65 63 74 69 6f  _MISUSE detectio
7f50: 6e 20 6c 6f 67 69 63 2e 20 20 53 65 65 20 6d 69  n logic.  See mi
7f60: 73 75 73 65 2e 74 65 73 74 2e 0a 2a 2a 0a 2a 2a  suse.test..**.**
7f70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   This routine wa
7f80: 73 20 6c 61 74 65 72 20 65 78 74 65 6e 64 65 64  s later extended
7f90: 20 74 6f 20 74 65 73 74 20 74 68 65 20 75 73 65   to test the use
7fa0: 20 6f 66 20 73 71 6c 69 74 65 33 5f 72 65 73 75   of sqlite3_resu
7fb0: 6c 74 5f 65 72 72 6f 72 28 29 0a 2a 2a 20 77 69  lt_error().** wi
7fc0: 74 68 69 6e 20 61 67 67 72 65 67 61 74 65 20 66  thin aggregate f
7fd0: 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  unctions..**.** 
7fe0: 4c 61 74 65 72 3a 20 49 74 20 69 73 20 6e 6f 77  Later: It is now
7ff0: 20 61 6c 73 6f 20 65 78 74 65 6e 64 65 64 20 74   also extended t
8000: 6f 20 72 65 67 69 73 74 65 72 20 74 68 65 20 61  o register the a
8010: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
8020: 6e 0a 2a 2a 20 22 6c 65 67 61 63 79 5f 63 6f 75  n.** "legacy_cou
8030: 6e 74 28 29 22 20 77 69 74 68 20 74 68 65 20 73  nt()" with the s
8040: 75 70 70 6c 69 65 64 20 64 61 74 61 62 61 73 65  upplied database
8050: 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73   handle. This is
8060: 20 75 73 65 64 0a 2a 2a 20 74 6f 20 74 65 73 74   used.** to test
8070: 20 74 68 65 20 64 65 70 72 65 63 61 74 65 64 20   the deprecated 
8080: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
8090: 65 5f 63 6f 75 6e 74 28 29 20 41 50 49 2e 0a 2a  e_count() API..*
80a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
80b0: 74 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67 61  t_create_aggrega
80c0: 74 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  te(.  void *NotU
80d0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
80e0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
80f0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
8100: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
8110: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
8120: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
8130: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8140: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
8150: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
8160: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
8170: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
8180: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73  gument */.){.  s
8190: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
81a0: 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63  t rc;.  if( argc
81b0: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
81c0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
81d0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
81e0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
81f0: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
8200: 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c    " FILENAME\"",
8210: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
8220: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
8230: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
8240: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
8250: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
8260: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
8270: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
8280: 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
8290: 78 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 53 51 4c  x_count", 0, SQL
82a0: 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 0a  ITE_UTF8, 0, 0,.
82b0: 20 20 20 20 20 20 74 31 43 6f 75 6e 74 53 74 65        t1CountSte
82c0: 70 2c 74 31 43 6f 75 6e 74 46 69 6e 61 6c 69 7a  p,t1CountFinaliz
82d0: 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
82e0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
82f0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
8300: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
8310: 22 78 5f 63 6f 75 6e 74 22 2c 20 31 2c 20 53 51  "x_count", 1, SQ
8320: 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c  LITE_UTF8, 0, 0,
8330: 0a 20 20 20 20 20 20 20 20 74 31 43 6f 75 6e 74  .        t1Count
8340: 53 74 65 70 2c 74 31 43 6f 75 6e 74 46 69 6e 61  Step,t1CountFina
8350: 6c 69 7a 65 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  lize);.  }.#ifnd
8360: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
8370: 45 50 52 45 43 41 54 45 44 0a 20 20 69 66 28 20  EPRECATED.  if( 
8380: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
8390: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
83a0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
83b0: 6e 28 64 62 2c 20 22 6c 65 67 61 63 79 5f 63 6f  n(db, "legacy_co
83c0: 75 6e 74 22 2c 20 30 2c 20 53 51 4c 49 54 45 5f  unt", 0, SQLITE_
83d0: 41 4e 59 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  ANY, 0, 0,.     
83e0: 20 20 20 6c 65 67 61 63 79 43 6f 75 6e 74 53 74     legacyCountSt
83f0: 65 70 2c 20 6c 65 67 61 63 79 43 6f 75 6e 74 46  ep, legacyCountF
8400: 69 6e 61 6c 69 7a 65 0a 20 20 20 20 29 3b 0a 20  inalize.    );. 
8410: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
8420: 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
8430: 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
8440: 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
8450: 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74  ERROR;.  Tcl_Set
8460: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
8470: 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
8480: 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65  me(rc), 0);.  re
8490: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
84a0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 70  ./*.** Usage:  p
84b0: 72 69 6e 74 66 20 54 45 58 54 0a 2a 2a 0a 2a 2a  rintf TEXT.**.**
84c0: 20 53 65 6e 64 20 6f 75 74 70 75 74 20 74 6f 20   Send output to 
84d0: 70 72 69 6e 74 66 2e 20 20 55 73 65 20 74 68 69  printf.  Use thi
84e0: 73 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 75  s rather than pu
84f0: 74 73 20 74 6f 20 6d 65 72 67 65 20 74 68 65 20  ts to merge the 
8500: 6f 75 74 70 75 74 0a 2a 2a 20 69 6e 20 74 68 65  output.** in the
8510: 20 63 6f 72 72 65 63 74 20 73 65 71 75 65 6e 63   correct sequenc
8520: 65 20 77 69 74 68 20 64 65 62 75 67 67 69 6e 67  e with debugging
8530: 20 70 72 69 6e 74 66 73 20 69 6e 73 65 72 74 65   printfs inserte
8540: 64 20 69 6e 74 6f 20 43 20 63 6f 64 65 2e 0a 2a  d into C code..*
8550: 2a 20 50 75 74 73 20 75 73 65 73 20 61 20 73 65  * Puts uses a se
8560: 70 61 72 61 74 65 20 62 75 66 66 65 72 20 61 6e  parate buffer an
8570: 64 20 64 65 62 75 67 67 69 6e 67 20 73 74 61 74  d debugging stat
8580: 65 6d 65 6e 74 73 20 77 69 6c 6c 20 62 65 20 6f  ements will be o
8590: 75 74 20 6f 66 0a 2a 2a 20 73 65 71 75 65 6e 63  ut of.** sequenc
85a0: 65 20 69 66 20 69 74 20 69 73 20 75 73 65 64 2e  e if it is used.
85b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
85c0: 65 73 74 5f 70 72 69 6e 74 66 28 0a 20 20 76 6f  est_printf(.  vo
85d0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
85e0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
85f0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
8600: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
8610: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
8620: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
8630: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
8640: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8650: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
8660: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
8670: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
8680: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
8690: 2f 0a 29 7b 0a 20 20 69 66 28 20 61 72 67 63 21  /.){.  if( argc!
86a0: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
86b0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
86c0: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
86d0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
86e0: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
86f0: 20 22 20 54 45 58 54 5c 22 22 2c 20 30 29 3b 0a   " TEXT\"", 0);.
8700: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
8710: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 72 69 6e  RROR;.  }.  prin
8720: 74 66 28 22 25 73 5c 6e 22 2c 20 61 72 67 76 5b  tf("%s\n", argv[
8730: 31 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  1]);.  return TC
8740: 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  L_OK;.}..../*.**
8750: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
8760: 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 20 46 4f 52  _mprintf_int FOR
8770: 4d 41 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45  MAT INTEGER INTE
8780: 47 45 52 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a  GER INTEGER.**.*
8790: 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77  * Call mprintf w
87a0: 69 74 68 20 74 68 72 65 65 20 69 6e 74 65 67 65  ith three intege
87b0: 72 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73  r arguments.*/.s
87c0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
87d0: 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 28 0a 20  3_mprintf_int(. 
87e0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
87f0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
8800: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
8810: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
8820: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
8830: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
8840: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
8850: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8860: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
8870: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
8880: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
8890: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
88a0: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 5b  t */.){.  int a[
88b0: 33 5d 2c 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  3], i;.  char *z
88c0: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35 20  ;.  if( argc!=5 
88d0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
88e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
88f0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
8900: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
8910: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
8920: 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 49  FORMAT INT INT I
8930: 4e 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  NT\"", 0);.    r
8940: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8950: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20  .  }.  for(i=2; 
8960: 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<5; i++){.    i
8970: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
8980: 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26  terp, argv[i], &
8990: 61 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e  a[i-2]) ) return
89a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
89b0: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
89c0: 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61  rintf(argv[1], a
89d0: 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 29  [0], a[1], a[2])
89e0: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
89f0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20  sult(interp, z, 
8a00: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
8a10: 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(z);.  return 
8a20: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
8a30: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
8a40: 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 20 46  _mprintf_int64 F
8a50: 4f 52 4d 41 54 20 49 4e 54 45 47 45 52 20 49 4e  ORMAT INTEGER IN
8a60: 54 45 47 45 52 20 49 4e 54 45 47 45 52 0a 2a 2a  TEGER INTEGER.**
8a70: 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66  .** Call mprintf
8a80: 20 77 69 74 68 20 74 68 72 65 65 20 36 34 2d 62   with three 64-b
8a90: 69 74 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d  it integer argum
8aa0: 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ents.*/.static i
8ab0: 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  nt sqlite3_mprin
8ac0: 74 66 5f 69 6e 74 36 34 28 0a 20 20 76 6f 69 64  tf_int64(.  void
8ad0: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
8ae0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
8af0: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
8b00: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
8b10: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
8b20: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
8b30: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
8b40: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
8b50: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
8b60: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
8b70: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
8b80: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
8b90: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
8ba0: 6c 69 74 65 5f 69 6e 74 36 34 20 61 5b 33 5d 3b  lite_int64 a[3];
8bb0: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66  .  char *z;.  if
8bc0: 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20  ( argc!=5 ){.   
8bd0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8be0: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
8bf0: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
8c00: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
8c10: 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54  .       " FORMAT
8c20: 20 49 4e 54 20 49 4e 54 20 49 4e 54 5c 22 22 2c   INT INT INT\"",
8c30: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
8c40: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
8c50: 20 66 6f 72 28 69 3d 32 3b 20 69 3c 35 3b 20 69   for(i=2; i<5; i
8c60: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
8c70: 69 74 65 33 41 74 6f 69 36 34 28 61 72 67 76 5b  ite3Atoi64(argv[
8c80: 69 5d 2c 20 26 61 5b 69 2d 32 5d 2c 20 31 30 30  i], &a[i-2], 100
8c90: 30 30 30 30 2c 20 53 51 4c 49 54 45 5f 55 54 46  0000, SQLITE_UTF
8ca0: 38 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  8) ){.      Tcl_
8cb0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8cc0: 65 72 70 2c 20 22 61 72 67 75 6d 65 6e 74 20 69  erp, "argument i
8cd0: 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 36 34  s not a valid 64
8ce0: 2d 62 69 74 20 69 6e 74 65 67 65 72 22 2c 20 30  -bit integer", 0
8cf0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
8d00: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
8d10: 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74  .  }.  z = sqlit
8d20: 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b  e3_mprintf(argv[
8d30: 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20  1], a[0], a[1], 
8d40: 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70  a[2]);.  Tcl_App
8d50: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8d60: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
8d70: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
8d80: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
8d90: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
8da0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f  lite3_mprintf_lo
8db0: 6e 67 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  ng FORMAT INTEGE
8dc0: 52 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  R INTEGER INTEGE
8dd0: 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  R.**.** Call mpr
8de0: 69 6e 74 66 20 77 69 74 68 20 74 68 72 65 65 20  intf with three 
8df0: 6c 6f 6e 67 20 69 6e 74 65 67 65 72 20 61 72 67  long integer arg
8e00: 75 6d 65 6e 74 73 2e 20 20 20 54 68 69 73 20 6d  uments.   This m
8e10: 69 67 68 74 20 62 65 20 74 68 65 0a 2a 2a 20 73  ight be the.** s
8e20: 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 5f 6d  ame as sqlite3_m
8e30: 70 72 69 6e 74 66 5f 69 6e 74 20 6f 72 20 73 71  printf_int or sq
8e40: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
8e50: 74 36 34 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  t64, depending o
8e60: 6e 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 2e 0a 2a  n.** platform..*
8e70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
8e80: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e  ite3_mprintf_lon
8e90: 67 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  g(.  void *NotUs
8ea0: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
8eb0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
8ec0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
8ed0: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
8ee0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
8ef0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
8f00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8f10: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
8f20: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
8f30: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
8f40: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
8f50: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ument */.){.  in
8f60: 74 20 69 3b 0a 20 20 6c 6f 6e 67 20 69 6e 74 20  t i;.  long int 
8f70: 61 5b 33 5d 3b 0a 20 20 69 6e 74 20 62 5b 33 5d  a[3];.  int b[3]
8f80: 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  ;.  char *z;.  i
8f90: 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20  f( argc!=5 ){.  
8fa0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8fb0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
8fc0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
8fd0: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
8fe0: 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41  ,.       " FORMA
8ff0: 54 20 49 4e 54 20 49 4e 54 20 49 4e 54 5c 22 22  T INT INT INT\""
9000: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
9010: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
9020: 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 35 3b 20    for(i=2; i<5; 
9030: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63  i++){.    if( Tc
9040: 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
9050: 20 61 72 67 76 5b 69 5d 2c 20 26 62 5b 69 2d 32   argv[i], &b[i-2
9060: 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  ]) ) return TCL_
9070: 45 52 52 4f 52 3b 0a 20 20 20 20 61 5b 69 2d 32  ERROR;.    a[i-2
9080: 5d 20 3d 20 28 6c 6f 6e 67 20 69 6e 74 29 62 5b  ] = (long int)b[
9090: 69 2d 32 5d 3b 0a 20 20 20 20 61 5b 69 2d 32 5d  i-2];.    a[i-2]
90a0: 20 26 3d 20 28 28 28 75 36 34 29 31 29 3c 3c 28   &= (((u64)1)<<(
90b0: 73 69 7a 65 6f 66 28 69 6e 74 29 2a 38 29 29 2d  sizeof(int)*8))-
90c0: 31 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c  1;.  }.  z = sql
90d0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67  ite3_mprintf(arg
90e0: 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d  v[1], a[0], a[1]
90f0: 2c 20 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41  , a[2]);.  Tcl_A
9100: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9110: 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c  rp, z, 0);.  sql
9120: 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
9130: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
9140: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
9150: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
9160: 73 74 72 20 46 4f 52 4d 41 54 20 49 4e 54 45 47  str FORMAT INTEG
9170: 45 52 20 49 4e 54 45 47 45 52 20 53 54 52 49 4e  ER INTEGER STRIN
9180: 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  G.**.** Call mpr
9190: 69 6e 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e  intf with two in
91a0: 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20  teger arguments 
91b0: 61 6e 64 20 6f 6e 65 20 73 74 72 69 6e 67 20 61  and one string a
91c0: 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69  rgument.*/.stati
91d0: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70  c int sqlite3_mp
91e0: 72 69 6e 74 66 5f 73 74 72 28 0a 20 20 76 6f 69  rintf_str(.  voi
91f0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
9200: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
9210: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
9220: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
9230: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
9240: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
9250: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
9260: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
9270: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
9280: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
9290: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
92a0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
92b0: 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20  .){.  int a[3], 
92c0: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  i;.  char *z;.  
92d0: 69 66 28 20 61 72 67 63 3c 34 20 7c 7c 20 61 72  if( argc<4 || ar
92e0: 67 63 3e 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f  gc>5 ){.    Tcl_
92f0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
9300: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
9310: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
9320: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
9330: 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20     " FORMAT INT 
9340: 49 4e 54 20 3f 53 54 52 49 4e 47 3f 5c 22 22 2c  INT ?STRING?\"",
9350: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
9360: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
9370: 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69   for(i=2; i<4; i
9380: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c  ++){.    if( Tcl
9390: 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20  _GetInt(interp, 
93a0: 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d  argv[i], &a[i-2]
93b0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
93c0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20  RROR;.  }.  z = 
93d0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
93e0: 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61  argv[1], a[0], a
93f0: 5b 31 5d 2c 20 61 72 67 63 3e 34 20 3f 20 61 72  [1], argc>4 ? ar
9400: 67 76 5b 34 5d 20 3a 20 4e 55 4c 4c 29 3b 0a 20  gv[4] : NULL);. 
9410: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
9420: 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b  t(interp, z, 0);
9430: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
9440: 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  z);.  return TCL
9450: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
9460: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 6e  age:  sqlite3_sn
9470: 70 72 69 6e 74 66 5f 73 74 72 20 49 4e 54 45 47  printf_str INTEG
9480: 45 52 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  ER FORMAT INTEGE
9490: 52 20 49 4e 54 45 47 45 52 20 53 54 52 49 4e 47  R INTEGER STRING
94a0: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69  .**.** Call mpri
94b0: 6e 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74  ntf with two int
94c0: 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61  eger arguments a
94d0: 6e 64 20 6f 6e 65 20 73 74 72 69 6e 67 20 61 72  nd one string ar
94e0: 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63  gument.*/.static
94f0: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e 70   int sqlite3_snp
9500: 72 69 6e 74 66 5f 73 74 72 28 0a 20 20 76 6f 69  rintf_str(.  voi
9510: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
9520: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
9530: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
9540: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
9550: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
9560: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
9570: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
9580: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
9590: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
95a0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
95b0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
95c0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
95d0: 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20  .){.  int a[3], 
95e0: 69 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68  i;.  int n;.  ch
95f0: 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67  ar *z;.  if( arg
9600: 63 3c 35 20 7c 7c 20 61 72 67 63 3e 36 20 29 7b  c<5 || argc>6 ){
9610: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
9620: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
9630: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
9640: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
9650: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 4e  [0],.       " IN
9660: 54 20 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54  T FORMAT INT INT
9670: 20 3f 53 54 52 49 4e 47 3f 5c 22 22 2c 20 30 29   ?STRING?\"", 0)
9680: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
9690: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
96a0: 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74  ( Tcl_GetInt(int
96b0: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 6e  erp, argv[1], &n
96c0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
96d0: 52 52 4f 52 3b 0a 20 20 69 66 28 20 6e 3c 30 20  RROR;.  if( n<0 
96e0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
96f0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
9700: 22 4e 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 6e  "N must be non-n
9710: 65 67 61 74 69 76 65 22 2c 20 30 29 3b 0a 20 20  egative", 0);.  
9720: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
9730: 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  OR;.  }.  for(i=
9740: 33 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20  3; i<5; i++){.  
9750: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
9760: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d  (interp, argv[i]
9770: 2c 20 26 61 5b 69 2d 33 5d 29 20 29 20 72 65 74  , &a[i-3]) ) ret
9780: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9790: 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33   }.  z = sqlite3
97a0: 5f 6d 61 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a  _malloc( n+1 );.
97b0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
97c0: 74 66 28 6e 2c 20 7a 2c 20 61 72 67 76 5b 32 5d  tf(n, z, argv[2]
97d0: 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 72  , a[0], a[1], ar
97e0: 67 63 3e 34 20 3f 20 61 72 67 76 5b 35 5d 20 3a  gc>4 ? argv[5] :
97f0: 20 4e 55 4c 4c 29 3b 0a 20 20 54 63 6c 5f 41 70   NULL);.  Tcl_Ap
9800: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
9810: 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69  p, z, 0);.  sqli
9820: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72  te3_free(z);.  r
9830: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
9840: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
9850: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64  qlite3_mprintf_d
9860: 6f 75 62 6c 65 20 46 4f 52 4d 41 54 20 49 4e 54  ouble FORMAT INT
9870: 45 47 45 52 20 49 4e 54 45 47 45 52 20 44 4f 55  EGER INTEGER DOU
9880: 42 4c 45 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d  BLE.**.** Call m
9890: 70 72 69 6e 74 66 20 77 69 74 68 20 74 77 6f 20  printf with two 
98a0: 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74  integer argument
98b0: 73 20 61 6e 64 20 6f 6e 65 20 64 6f 75 62 6c 65  s and one double
98c0: 20 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61   argument.*/.sta
98d0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  tic int sqlite3_
98e0: 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 28 0a  mprintf_double(.
98f0: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
9900: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
9910: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
9920: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
9930: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
9940: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
9950: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
9960: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9970: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
9980: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
9990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
99a0: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
99b0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  nt */.){.  int a
99c0: 5b 33 5d 2c 20 69 3b 0a 20 20 64 6f 75 62 6c 65  [3], i;.  double
99d0: 20 72 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20   r;.  char *z;. 
99e0: 20 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a   if( argc!=5 ){.
99f0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
9a00: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
9a10: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
9a20: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
9a30: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52  0],.       " FOR
9a40: 4d 41 54 20 49 4e 54 20 49 4e 54 20 44 4f 55 42  MAT INT INT DOUB
9a50: 4c 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  LE\"", 0);.    r
9a60: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9a70: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20  .  }.  for(i=2; 
9a80: 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<4; i++){.    i
9a90: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
9aa0: 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26  terp, argv[i], &
9ab0: 61 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e  a[i-2]) ) return
9ac0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
9ad0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 44 6f 75    if( Tcl_GetDou
9ae0: 62 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ble(interp, argv
9af0: 5b 34 5d 2c 20 26 72 29 20 29 20 72 65 74 75 72  [4], &r) ) retur
9b00: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
9b10: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
9b20: 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d  tf(argv[1], a[0]
9b30: 2c 20 61 5b 31 5d 2c 20 72 29 3b 0a 20 20 54 63  , a[1], r);.  Tc
9b40: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
9b50: 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20  nterp, z, 0);.  
9b60: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
9b70: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
9b80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
9b90: 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  :  sqlite3_mprin
9ba0: 74 66 5f 73 63 61 6c 65 64 20 46 4f 52 4d 41 54  tf_scaled FORMAT
9bb0: 20 44 4f 55 42 4c 45 20 44 4f 55 42 4c 45 0a 2a   DOUBLE DOUBLE.*
9bc0: 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74  *.** Call mprint
9bd0: 66 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20  f with a single 
9be0: 64 6f 75 62 6c 65 20 61 72 67 75 6d 65 6e 74 20  double argument 
9bf0: 77 68 69 63 68 20 69 73 20 74 68 65 20 70 72 6f  which is the pro
9c00: 64 75 63 74 20 6f 66 20 74 68 65 0a 2a 2a 20 74  duct of the.** t
9c10: 77 6f 20 61 72 67 75 6d 65 6e 74 73 20 67 69 76  wo arguments giv
9c20: 65 6e 20 61 62 6f 76 65 2e 20 20 54 68 69 73 20  en above.  This 
9c30: 69 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72  is used to gener
9c40: 61 74 65 20 6f 76 65 72 66 6c 6f 77 20 61 6e 64  ate overflow and
9c50: 20 75 6e 64 65 72 66 6c 6f 77 0a 2a 2a 20 64 6f   underflow.** do
9c60: 75 62 6c 65 73 20 74 6f 20 74 65 73 74 20 74 68  ubles to test th
9c70: 61 74 20 74 68 65 79 20 61 72 65 20 63 6f 6e 76  at they are conv
9c80: 65 72 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 0a  erted properly..
9c90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
9ca0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63  lite3_mprintf_sc
9cb0: 61 6c 65 64 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  aled(.  void *No
9cc0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
9cd0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
9ce0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
9cf0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
9d00: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
9d10: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
9d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9d30: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
9d40: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
9d50: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
9d60: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
9d70: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
9d80: 20 69 6e 74 20 69 3b 0a 20 20 64 6f 75 62 6c 65   int i;.  double
9d90: 20 72 5b 32 5d 3b 0a 20 20 63 68 61 72 20 2a 7a   r[2];.  char *z
9da0: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34 20  ;.  if( argc!=4 
9db0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
9dc0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
9dd0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
9de0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
9df0: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
9e00: 46 4f 52 4d 41 54 20 44 4f 55 42 4c 45 20 44 4f  FORMAT DOUBLE DO
9e10: 55 42 4c 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20  UBLE\"", 0);.   
9e20: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9e30: 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32  R;.  }.  for(i=2
9e40: 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<4; i++){.   
9e50: 20 69 66 28 20 54 63 6c 5f 47 65 74 44 6f 75 62   if( Tcl_GetDoub
9e60: 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  le(interp, argv[
9e70: 69 5d 2c 20 26 72 5b 69 2d 32 5d 29 20 29 20 72  i], &r[i-2]) ) r
9e80: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9e90: 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74  .  }.  z = sqlit
9ea0: 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b  e3_mprintf(argv[
9eb0: 31 5d 2c 20 72 5b 30 5d 2a 72 5b 31 5d 29 3b 0a  1], r[0]*r[1]);.
9ec0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
9ed0: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29  lt(interp, z, 0)
9ee0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
9ef0: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  (z);.  return TC
9f00: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
9f10: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
9f20: 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 20 46  printf_stronly F
9f30: 4f 52 4d 41 54 20 53 54 52 49 4e 47 0a 2a 2a 0a  ORMAT STRING.**.
9f40: 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20  ** Call mprintf 
9f50: 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 64 6f  with a single do
9f60: 75 62 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68  uble argument wh
9f70: 69 63 68 20 69 73 20 74 68 65 20 70 72 6f 64 75  ich is the produ
9f80: 63 74 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f  ct of the.** two
9f90: 20 61 72 67 75 6d 65 6e 74 73 20 67 69 76 65 6e   arguments given
9fa0: 20 61 62 6f 76 65 2e 20 20 54 68 69 73 20 69 73   above.  This is
9fb0: 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74   used to generat
9fc0: 65 20 6f 76 65 72 66 6c 6f 77 20 61 6e 64 20 75  e overflow and u
9fd0: 6e 64 65 72 66 6c 6f 77 0a 2a 2a 20 64 6f 75 62  nderflow.** doub
9fe0: 6c 65 73 20 74 6f 20 74 65 73 74 20 74 68 61 74  les to test that
9ff0: 20 74 68 65 79 20 61 72 65 20 63 6f 6e 76 65 72   they are conver
a000: 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f  ted properly..*/
a010: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
a020: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f  te3_mprintf_stro
a030: 6e 6c 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  nly(.  void *Not
a040: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
a050: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
a060: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
a070: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
a080: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
a090: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
a0a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
a0b0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
a0c0: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
a0d0: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
a0e0: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
a0f0: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
a100: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61  char *z;.  if( a
a110: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
a120: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
a130: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
a140: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
a150: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
a160: 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 53 54       " FORMAT ST
a170: 52 49 4e 47 5c 22 22 2c 20 30 29 3b 0a 20 20 20  RING\"", 0);.   
a180: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a190: 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c  R;.  }.  z = sql
a1a0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67  ite3_mprintf(arg
a1b0: 76 5b 31 5d 2c 20 61 72 67 76 5b 32 5d 29 3b 0a  v[1], argv[2]);.
a1c0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
a1d0: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29  lt(interp, z, 0)
a1e0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
a1f0: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  (z);.  return TC
a200: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
a210: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
a220: 70 72 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65  printf_hexdouble
a230: 20 46 4f 52 4d 41 54 20 48 45 58 0a 2a 2a 0a 2a   FORMAT HEX.**.*
a240: 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77  * Call mprintf w
a250: 69 74 68 20 61 20 73 69 6e 67 6c 65 20 64 6f 75  ith a single dou
a260: 62 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69  ble argument whi
a270: 63 68 20 69 73 20 64 65 72 69 76 65 64 20 66 72  ch is derived fr
a280: 6f 6d 20 74 68 65 0a 2a 2a 20 68 65 78 61 64 65  om the.** hexade
a290: 63 69 6d 61 6c 20 65 6e 63 6f 64 69 6e 67 20 6f  cimal encoding o
a2a0: 66 20 61 6e 20 49 45 45 45 20 64 6f 75 62 6c 65  f an IEEE double
a2b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a2c0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
a2d0: 68 65 78 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69  hexdouble(.  voi
a2e0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
a2f0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
a300: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
a310: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
a320: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
a330: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
a340: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
a350: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
a360: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
a370: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
a380: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
a390: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
a3a0: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  .){.  char *z;. 
a3b0: 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 75 6e 73   double r;.  uns
a3c0: 69 67 6e 65 64 20 69 6e 74 20 78 31 2c 20 78 32  igned int x1, x2
a3d0: 3b 0a 20 20 73 71 6c 69 74 65 5f 75 69 6e 74 36  ;.  sqlite_uint6
a3e0: 34 20 64 3b 0a 20 20 69 66 28 20 61 72 67 63 21  4 d;.  if( argc!
a3f0: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
a400: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
a410: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
a420: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
a430: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
a440: 20 22 20 46 4f 52 4d 41 54 20 53 54 52 49 4e 47   " FORMAT STRING
a450: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
a460: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
a470: 20 7d 0a 20 20 69 66 28 20 73 73 63 61 6e 66 28   }.  if( sscanf(
a480: 61 72 67 76 5b 32 5d 2c 20 22 25 30 38 78 25 30  argv[2], "%08x%0
a490: 38 78 22 2c 20 26 78 32 2c 20 26 78 31 29 21 3d  8x", &x2, &x1)!=
a4a0: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
a4b0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
a4c0: 2c 20 22 32 6e 64 20 61 72 67 75 6d 65 6e 74 20  , "2nd argument 
a4d0: 73 68 6f 75 6c 64 20 62 65 20 31 36 2d 63 68 61  should be 16-cha
a4e0: 72 61 63 74 65 72 73 20 6f 66 20 68 65 78 22 2c  racters of hex",
a4f0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
a500: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
a510: 20 64 20 3d 20 78 32 3b 0a 20 20 64 20 3d 20 28   d = x2;.  d = (
a520: 64 3c 3c 33 32 29 20 2b 20 78 31 3b 0a 20 20 6d  d<<32) + x1;.  m
a530: 65 6d 63 70 79 28 26 72 2c 20 26 64 2c 20 73 69  emcpy(&r, &d, si
a540: 7a 65 6f 66 28 72 29 29 3b 0a 20 20 7a 20 3d 20  zeof(r));.  z = 
a550: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
a560: 61 72 67 76 5b 31 5d 2c 20 72 29 3b 0a 20 20 54  argv[1], r);.  T
a570: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
a580: 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20  interp, z, 0);. 
a590: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
a5a0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
a5b0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
a5c0: 65 3a 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  e: sqlite3_enabl
a5d0: 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 20 3f  e_shared_cache ?
a5e0: 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 0a 2a 2f 0a 23  BOOLEAN?.**.*/.#
a5f0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
a600: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
a610: 41 43 48 45 29 0a 73 74 61 74 69 63 20 69 6e 74  ACHE).static int
a620: 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f 73 68 61   test_enable_sha
a630: 72 65 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  red(.  ClientDat
a640: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
a650: 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
a660: 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
a670: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
a680: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
a690: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
a6a0: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
a6b0: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
a6c0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
a6d0: 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
a6e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
a6f0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
a700: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
a710: 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
a720: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
a730: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 65   int rc;.  int e
a740: 6e 61 62 6c 65 3b 0a 20 20 69 6e 74 20 72 65 74  nable;.  int ret
a750: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a   = 0;..  if( obj
a760: 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 31 20  c!=2 && objc!=1 
a770: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
a780: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
a790: 31 2c 20 6f 62 6a 76 2c 20 22 3f 42 4f 4f 4c 45  1, objv, "?BOOLE
a7a0: 41 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72  AN?");.    retur
a7b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
a7c0: 0a 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33  .  ret = sqlite3
a7d0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61  GlobalConfig.sha
a7e0: 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 3b  redCacheEnabled;
a7f0: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20  ..  if( objc==2 
a800: 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  ){.    if( Tcl_G
a810: 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
a820: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
a830: 2c 20 26 65 6e 61 62 6c 65 29 20 29 7b 0a 20 20  , &enable) ){.  
a840: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
a850: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
a860: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 6e 61  rc = sqlite3_ena
a870: 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65  ble_shared_cache
a880: 28 65 6e 61 62 6c 65 29 3b 0a 20 20 20 20 69 66  (enable);.    if
a890: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
a8a0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
a8b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
a8c0: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72  char *)sqlite3Er
a8d0: 72 53 74 72 28 72 63 29 2c 20 54 43 4c 5f 53 54  rStr(rc), TCL_ST
a8e0: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 72 65 74  ATIC);.      ret
a8f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
a900: 20 20 20 7d 0a 20 20 7d 0a 20 20 54 63 6c 5f 53     }.  }.  Tcl_S
a910: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
a920: 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65  rp, Tcl_NewBoole
a930: 61 6e 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20 72  anObj(ret));.  r
a940: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
a950: 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  #endif..../*.** 
a960: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65  Usage: sqlite3_e
a970: 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63  xtended_result_c
a980: 6f 64 65 73 20 20 20 44 42 20 20 20 20 42 4f 4f  odes   DB    BOO
a990: 4c 45 41 4e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  LEAN.**.*/.stati
a9a0: 63 20 69 6e 74 20 74 65 73 74 5f 65 78 74 65 6e  c int test_exten
a9b0: 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73  ded_result_codes
a9c0: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
a9d0: 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
a9e0: 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
a9f0: 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
aa00: 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
aa10: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
aa20: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
aa30: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
aa40: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
aa50: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
aa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aa70: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
aa80: 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
aa90: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
aaa0: 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
aab0: 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ments */.){.  in
aac0: 74 20 65 6e 61 62 6c 65 3b 0a 20 20 73 71 6c 69  t enable;.  sqli
aad0: 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  te3 *db;..  if( 
aae0: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
aaf0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
ab00: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
ab10: 20 22 44 42 20 42 4f 4f 4c 45 41 4e 22 29 3b 0a   "DB BOOLEAN");.
ab20: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
ab30: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
ab40: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
ab50: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
ab60: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
ab70: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
ab80: 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
ab90: 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
aba0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
abb0: 5d 2c 20 26 65 6e 61 62 6c 65 29 20 29 20 72 65  ], &enable) ) re
abc0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
abd0: 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64    sqlite3_extend
abe0: 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28  ed_result_codes(
abf0: 64 62 2c 20 65 6e 61 62 6c 65 29 3b 0a 20 20 72  db, enable);.  r
ac00: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
ac10: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
ac20: 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e  lite3_libversion
ac30: 5f 6e 75 6d 62 65 72 0a 2a 2a 0a 2a 2f 0a 73 74  _number.**.*/.st
ac40: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 69  atic int test_li
ac50: 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28  bversion_number(
ac60: 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
ac70: 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
ac80: 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
ac90: 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
aca0: 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
acb0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
acc0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
acd0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
ace0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
acf0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
ad00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ad10: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
ad20: 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
ad30: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
ad40: 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
ad50: 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c  ents */.){.  Tcl
ad60: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
ad70: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
ad80: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 6c 69 62 76  Obj(sqlite3_libv
ad90: 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 29 29  ersion_number())
ada0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
adb0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
adc0: 67 65 3a 20 73 71 6c 69 74 65 33 5f 74 61 62 6c  ge: sqlite3_tabl
add0: 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
ade0: 61 20 44 42 20 64 62 6e 61 6d 65 20 74 62 6c 6e  a DB dbname tbln
adf0: 61 6d 65 20 63 6f 6c 6e 61 6d 65 0a 2a 2a 0a 2a  ame colname.**.*
ae00: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
ae10: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
ae20: 54 41 44 41 54 41 0a 73 74 61 74 69 63 20 69 6e  TADATA.static in
ae30: 74 20 74 65 73 74 5f 74 61 62 6c 65 5f 63 6f 6c  t test_table_col
ae40: 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20  umn_metadata(.  
ae50: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
ae60: 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
ae70: 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
ae80: 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
ae90: 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
aea0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
aeb0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
aec0: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
aed0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
aee0: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
aef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
af00: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
af10: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
af20: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
af30: 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
af40: 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
af50: 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
af60: 68 61 72 20 2a 7a 44 62 3b 0a 20 20 63 6f 6e 73  har *zDb;.  cons
af70: 74 20 63 68 61 72 20 2a 7a 54 62 6c 3b 0a 20 20  t char *zTbl;.  
af80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
af90: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 63  ;.  int rc;.  Tc
afa0: 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a 20 20  l_Obj *pRet;..  
afb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74  const char *zDat
afc0: 61 74 79 70 65 3b 0a 20 20 63 6f 6e 73 74 20 63  atype;.  const c
afd0: 68 61 72 20 2a 7a 43 6f 6c 6c 73 65 71 3b 0a 20  har *zCollseq;. 
afe0: 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20   int notnull;.  
aff0: 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a  int primarykey;.
b000: 20 20 69 6e 74 20 61 75 74 6f 69 6e 63 72 65 6d    int autoincrem
b010: 65 6e 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  ent;..  if( objc
b020: 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=5 ){.    Tcl_W
b030: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
b040: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
b050: 20 64 62 6e 61 6d 65 20 74 62 6c 6e 61 6d 65 20   dbname tblname 
b060: 63 6f 6c 6e 61 6d 65 22 29 3b 0a 20 20 20 20 72  colname");.    r
b070: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b080: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
b090: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
b0a0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
b0b0: 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
b0c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b0d0: 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74  .  zDb = Tcl_Get
b0e0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
b0f0: 0a 20 20 7a 54 62 6c 20 3d 20 54 63 6c 5f 47 65  .  zTbl = Tcl_Ge
b100: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29  tString(objv[3])
b110: 3b 0a 20 20 7a 43 6f 6c 20 3d 20 54 63 6c 5f 47  ;.  zCol = Tcl_G
b120: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d  etString(objv[4]
b130: 29 3b 0a 0a 20 20 69 66 28 20 73 74 72 6c 65 6e  );..  if( strlen
b140: 28 7a 44 62 29 3d 3d 30 20 29 20 7a 44 62 20 3d  (zDb)==0 ) zDb =
b150: 20 30 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   0;..  rc = sqli
b160: 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  te3_table_column
b170: 5f 6d 65 74 61 64 61 74 61 28 64 62 2c 20 7a 44  _metadata(db, zD
b180: 62 2c 20 7a 54 62 6c 2c 20 7a 43 6f 6c 2c 20 0a  b, zTbl, zCol, .
b190: 20 20 20 20 20 20 26 7a 44 61 74 61 74 79 70 65        &zDatatype
b1a0: 2c 20 26 7a 43 6f 6c 6c 73 65 71 2c 20 26 6e 6f  , &zCollseq, &no
b1b0: 74 6e 75 6c 6c 2c 20 26 70 72 69 6d 61 72 79 6b  tnull, &primaryk
b1c0: 65 79 2c 20 26 61 75 74 6f 69 6e 63 72 65 6d 65  ey, &autoincreme
b1d0: 6e 74 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d  nt);..  if( rc!=
b1e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b1f0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
b200: 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65  t(interp, sqlite
b210: 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29  3_errmsg(db), 0)
b220: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
b230: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70  _ERROR;.  }..  p
b240: 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  Ret = Tcl_NewObj
b250: 28 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ();.  Tcl_ListOb
b260: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
b270: 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53  , pRet, Tcl_NewS
b280: 74 72 69 6e 67 4f 62 6a 28 7a 44 61 74 61 74 79  tringObj(zDataty
b290: 70 65 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  pe, -1));.  Tcl_
b2a0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
b2b0: 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63  ment(0, pRet, Tc
b2c0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
b2d0: 43 6f 6c 6c 73 65 71 2c 20 2d 31 29 29 3b 0a 20  Collseq, -1));. 
b2e0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
b2f0: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65  ndElement(0, pRe
b300: 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  t, Tcl_NewIntObj
b310: 28 6e 6f 74 6e 75 6c 6c 29 29 3b 0a 20 20 54 63  (notnull));.  Tc
b320: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
b330: 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20  lement(0, pRet, 
b340: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 70 72  Tcl_NewIntObj(pr
b350: 69 6d 61 72 79 6b 65 79 29 29 3b 0a 20 20 54 63  imarykey));.  Tc
b360: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
b370: 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20  lement(0, pRet, 
b380: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 75  Tcl_NewIntObj(au
b390: 74 6f 69 6e 63 72 65 6d 65 6e 74 29 29 3b 0a 20  toincrement));. 
b3a0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
b3b0: 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b  t(interp, pRet);
b3c0: 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
b3d0: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  K;.}.#endif..#if
b3e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b3f0: 5f 49 4e 43 52 42 4c 4f 42 0a 0a 73 74 61 74 69  _INCRBLOB..stati
b400: 63 20 69 6e 74 20 62 6c 6f 62 48 61 6e 64 6c 65  c int blobHandle
b410: 46 72 6f 6d 4f 62 6a 28 0a 20 20 54 63 6c 5f 49  FromObj(.  Tcl_I
b420: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a  nterp *interp, .
b430: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 2c    Tcl_Obj *pObj,
b440: 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20  .  sqlite3_blob 
b450: 2a 2a 70 70 42 6c 6f 62 0a 29 7b 0a 20 20 63 68  **ppBlob.){.  ch
b460: 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 3b 0a  ar *z;.  int n;.
b470: 0a 20 20 7a 20 3d 20 54 63 6c 5f 47 65 74 53 74  .  z = Tcl_GetSt
b480: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 4f 62 6a  ringFromObj(pObj
b490: 2c 20 26 6e 29 3b 0a 20 20 69 66 28 20 6e 3d 3d  , &n);.  if( n==
b4a0: 30 20 29 7b 0a 20 20 20 20 2a 70 70 42 6c 6f 62  0 ){.    *ppBlob
b4b0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
b4c0: 20 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a     int notUsed;.
b4d0: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20      Tcl_Channel 
b4e0: 63 68 61 6e 6e 65 6c 3b 0a 20 20 20 20 43 6c 69  channel;.    Cli
b4f0: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65  entData instance
b500: 44 61 74 61 3b 0a 20 20 20 20 0a 20 20 20 20 63  Data;.    .    c
b510: 68 61 6e 6e 65 6c 20 3d 20 54 63 6c 5f 47 65 74  hannel = Tcl_Get
b520: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
b530: 7a 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20  z, &notUsed);.  
b540: 20 20 69 66 28 20 21 63 68 61 6e 6e 65 6c 20 29    if( !channel )
b550: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b560: 52 3b 0a 0a 20 20 20 20 54 63 6c 5f 46 6c 75 73  R;..    Tcl_Flus
b570: 68 28 63 68 61 6e 6e 65 6c 29 3b 0a 20 20 20 20  h(channel);.    
b580: 54 63 6c 5f 53 65 65 6b 28 63 68 61 6e 6e 65 6c  Tcl_Seek(channel
b590: 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a  , 0, SEEK_SET);.
b5a0: 0a 20 20 20 20 69 6e 73 74 61 6e 63 65 44 61 74  .    instanceDat
b5b0: 61 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  a = Tcl_GetChann
b5c0: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63  elInstanceData(c
b5d0: 68 61 6e 6e 65 6c 29 3b 0a 20 20 20 20 2a 70 70  hannel);.    *pp
b5e0: 42 6c 6f 62 20 3d 20 2a 28 28 73 71 6c 69 74 65  Blob = *((sqlite
b5f0: 33 5f 62 6c 6f 62 20 2a 2a 29 69 6e 73 74 61 6e  3_blob **)instan
b600: 63 65 44 61 74 61 29 3b 0a 20 20 7d 0a 0a 20 20  ceData);.  }..  
b610: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
b620: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  ..static int tes
b630: 74 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 0a 20  t_blob_reopen(. 
b640: 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
b650: 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75  ntData, /* Not u
b660: 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  sed */.  Tcl_Int
b670: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
b680: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
b690: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
b6a0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
b6b0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
b6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b6d0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
b6e0: 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
b6f0: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
b700: 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
b710: 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c  ents */.){.  Tcl
b720: 5f 57 69 64 65 49 6e 74 20 69 52 6f 77 69 64 3b  _WideInt iRowid;
b730: 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20  .  sqlite3_blob 
b740: 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 72 63  *pBlob;.  int rc
b750: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
b760: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
b770: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
b780: 20 31 2c 20 6f 62 6a 76 2c 20 22 43 48 41 4e 4e   1, objv, "CHANN
b790: 45 4c 20 52 4f 57 49 44 22 29 3b 0a 20 20 20 20  EL ROWID");.    
b7a0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
b7b0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 6c 6f  ;.  }..  if( blo
b7c0: 62 48 61 6e 64 6c 65 46 72 6f 6d 4f 62 6a 28 69  bHandleFromObj(i
b7d0: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
b7e0: 26 70 42 6c 6f 62 29 20 29 20 72 65 74 75 72 6e  &pBlob) ) return
b7f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
b800: 28 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74  ( Tcl_GetWideInt
b810: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
b820: 6f 62 6a 76 5b 32 5d 2c 20 26 69 52 6f 77 69 64  objv[2], &iRowid
b830: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
b840: 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
b850: 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65  lite3_blob_reope
b860: 6e 28 70 42 6c 6f 62 2c 20 69 52 6f 77 69 64 29  n(pBlob, iRowid)
b870: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
b880: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  TE_OK ){.    Tcl
b890: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
b8a0: 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
b8b0: 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 54  e3ErrName(rc), T
b8c0: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
b8d0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d  }..  return (rc=
b8e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 43 4c  =SQLITE_OK ? TCL
b8f0: 5f 4f 4b 20 3a 20 54 43 4c 5f 45 52 52 4f 52 29  _OK : TCL_ERROR)
b900: 3b 0a 7d 0a 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ;.}..#endif../*.
b910: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
b920: 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
b930: 6f 6e 5f 76 32 20 44 42 2d 48 41 4e 44 4c 45 20  on_v2 DB-HANDLE 
b940: 4e 41 4d 45 20 43 4d 50 2d 50 52 4f 43 20 44 45  NAME CMP-PROC DE
b950: 4c 2d 50 52 4f 43 0a 2a 2a 0a 2a 2a 20 20 20 54  L-PROC.**.**   T
b960: 68 69 73 20 54 63 6c 20 70 72 6f 63 20 69 73 20  his Tcl proc is 
b970: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
b980: 20 74 68 65 20 65 78 70 65 72 69 6d 65 6e 74 61   the experimenta
b990: 6c 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 63  l.**   sqlite3_c
b9a0: 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  reate_collation_
b9b0: 76 32 28 29 20 69 6e 74 65 72 66 61 63 65 2e 0a  v2() interface..
b9c0: 2a 2f 0a 73 74 72 75 63 74 20 54 65 73 74 43 6f  */.struct TestCo
b9d0: 6c 6c 61 74 69 6f 6e 58 20 7b 0a 20 20 54 63 6c  llationX {.  Tcl
b9e0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
b9f0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 70  .  Tcl_Obj *pCmp
ba00: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 44 65  ;.  Tcl_Obj *pDe
ba10: 6c 3b 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74  l;.};.typedef st
ba20: 72 75 63 74 20 54 65 73 74 43 6f 6c 6c 61 74 69  ruct TestCollati
ba30: 6f 6e 58 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f  onX TestCollatio
ba40: 6e 58 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  nX;.static void 
ba50: 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74  testCreateCollat
ba60: 69 6f 6e 44 65 6c 28 76 6f 69 64 20 2a 70 43 74  ionDel(void *pCt
ba70: 78 29 7b 0a 20 20 54 65 73 74 43 6f 6c 6c 61 74  x){.  TestCollat
ba80: 69 6f 6e 58 20 2a 70 20 3d 20 28 54 65 73 74 43  ionX *p = (TestC
ba90: 6f 6c 6c 61 74 69 6f 6e 58 20 2a 29 70 43 74 78  ollationX *)pCtx
baa0: 3b 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 54 63  ;..  int rc = Tc
bab0: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69  l_EvalObjEx(p->i
bac0: 6e 74 65 72 70 2c 20 70 2d 3e 70 44 65 6c 2c 20  nterp, p->pDel, 
bad0: 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 7c  TCL_EVAL_DIRECT|
bae0: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29  TCL_EVAL_GLOBAL)
baf0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f  ;.  if( rc!=TCL_
bb00: 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61  OK ){.    Tcl_Ba
bb10: 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 2d  ckgroundError(p-
bb20: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 0a 20  >interp);.  }.. 
bb30: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
bb40: 74 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 54 63  t(p->pCmp);.  Tc
bb50: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
bb60: 2d 3e 70 44 65 6c 29 3b 0a 20 20 73 71 6c 69 74  ->pDel);.  sqlit
bb70: 65 33 5f 66 72 65 65 28 28 76 6f 69 64 20 2a 29  e3_free((void *)
bb80: 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  p);.}.static int
bb90: 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61   testCreateColla
bba0: 74 69 6f 6e 43 6d 70 28 0a 20 20 76 6f 69 64 20  tionCmp(.  void 
bbb0: 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 4c 65  *pCtx,.  int nLe
bbc0: 66 74 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  ft,.  const void
bbd0: 20 2a 7a 4c 65 66 74 2c 0a 20 20 69 6e 74 20 6e   *zLeft,.  int n
bbe0: 52 69 67 68 74 2c 0a 20 20 63 6f 6e 73 74 20 76  Right,.  const v
bbf0: 6f 69 64 20 2a 7a 52 69 67 68 74 0a 29 7b 0a 20  oid *zRight.){. 
bc00: 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20   TestCollationX 
bc10: 2a 70 20 3d 20 28 54 65 73 74 43 6f 6c 6c 61 74  *p = (TestCollat
bc20: 69 6f 6e 58 20 2a 29 70 43 74 78 3b 0a 20 20 54  ionX *)pCtx;.  T
bc30: 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 20  cl_Obj *pScript 
bc40: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
bc50: 62 6a 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 69  bj(p->pCmp);.  i
bc60: 6e 74 20 69 52 65 73 20 3d 20 30 3b 0a 0a 20 20  nt iRes = 0;..  
bc70: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
bc80: 28 70 53 63 72 69 70 74 29 3b 0a 20 20 54 63 6c  (pScript);.  Tcl
bc90: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
bca0: 65 6d 65 6e 74 28 30 2c 20 70 53 63 72 69 70 74  ement(0, pScript
bcb0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
bcc0: 62 6a 28 28 63 68 61 72 20 2a 29 7a 4c 65 66 74  bj((char *)zLeft
bcd0: 2c 20 6e 4c 65 66 74 29 29 3b 0a 20 20 54 63 6c  , nLeft));.  Tcl
bce0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
bcf0: 65 6d 65 6e 74 28 30 2c 20 70 53 63 72 69 70 74  ement(0, pScript
bd00: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
bd10: 62 6a 28 28 63 68 61 72 20 2a 29 7a 52 69 67 68  bj((char *)zRigh
bd20: 74 2c 6e 52 69 67 68 74 29 29 3b 0a 0a 20 20 69  t,nRight));..  i
bd30: 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 45  f( TCL_OK!=Tcl_E
bd40: 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65  valObjEx(p->inte
bd50: 72 70 2c 20 70 53 63 72 69 70 74 2c 20 54 43 4c  rp, pScript, TCL
bd60: 5f 45 56 41 4c 5f 44 49 52 45 43 54 7c 54 43 4c  _EVAL_DIRECT|TCL
bd70: 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 0a 20 20  _EVAL_GLOBAL).  
bd80: 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f   || TCL_OK!=Tcl_
bd90: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 70 2d  GetIntFromObj(p-
bda0: 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  >interp, Tcl_Get
bdb0: 4f 62 6a 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74  ObjResult(p->int
bdc0: 65 72 70 29 2c 20 26 69 52 65 73 29 0a 20 20 29  erp), &iRes).  )
bdd0: 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72  {.    Tcl_Backgr
bde0: 6f 75 6e 64 45 72 72 6f 72 28 70 2d 3e 69 6e 74  oundError(p->int
bdf0: 65 72 70 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  erp);.  }.  Tcl_
be00: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63  DecrRefCount(pSc
be10: 72 69 70 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e  ript);..  return
be20: 20 69 52 65 73 3b 0a 7d 0a 73 74 61 74 69 63 20   iRes;.}.static 
be30: 69 6e 74 20 74 65 73 74 5f 63 72 65 61 74 65 5f  int test_create_
be40: 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20 20  collation_v2(.  
be50: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
be60: 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73  tData, /* Not us
be70: 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
be80: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
be90: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
bea0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
beb0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
bec0: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
bed0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
bee0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
bef0: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
bf00: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
bf10: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
bf20: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 65 73 74  nts */.){.  Test
bf30: 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 70 3b 0a 20  CollationX *p;. 
bf40: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
bf50: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
bf60: 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63  bjc!=5 ){.    Tc
bf70: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
bf80: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
bf90: 22 44 42 2d 48 41 4e 44 4c 45 20 4e 41 4d 45 20  "DB-HANDLE NAME 
bfa0: 43 4d 50 2d 50 52 4f 43 20 44 45 4c 2d 50 52 4f  CMP-PROC DEL-PRO
bfb0: 43 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  C");.    return 
bfc0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
bfd0: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
bfe0: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
bff0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
c000: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
c010: 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 70 20  TCL_ERROR;..  p 
c020: 3d 20 28 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e  = (TestCollation
c030: 58 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  X *)sqlite3_mall
c040: 6f 63 28 73 69 7a 65 6f 66 28 54 65 73 74 43 6f  oc(sizeof(TestCo
c050: 6c 6c 61 74 69 6f 6e 58 29 29 3b 0a 20 20 70 2d  llationX));.  p-
c060: 3e 70 43 6d 70 20 3d 20 6f 62 6a 76 5b 33 5d 3b  >pCmp = objv[3];
c070: 0a 20 20 70 2d 3e 70 44 65 6c 20 3d 20 6f 62 6a  .  p->pDel = obj
c080: 76 5b 34 5d 3b 0a 20 20 70 2d 3e 69 6e 74 65 72  v[4];.  p->inter
c090: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 54 63  p = interp;.  Tc
c0a0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
c0b0: 2d 3e 70 43 6d 70 29 3b 0a 20 20 54 63 6c 5f 49  ->pCmp);.  Tcl_I
c0c0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70  ncrRefCount(p->p
c0d0: 44 65 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  Del);..  rc = sq
c0e0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
c0f0: 6c 61 74 69 6f 6e 5f 76 32 28 64 62 2c 20 54 63  lation_v2(db, Tc
c100: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
c110: 5b 32 5d 29 2c 20 31 36 2c 20 0a 20 20 20 20 20  [2]), 16, .     
c120: 20 28 76 6f 69 64 20 2a 29 70 2c 20 74 65 73 74   (void *)p, test
c130: 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 43  CreateCollationC
c140: 6d 70 2c 20 74 65 73 74 43 72 65 61 74 65 43 6f  mp, testCreateCo
c150: 6c 6c 61 74 69 6f 6e 44 65 6c 0a 20 20 29 3b 0a  llationDel.  );.
c160: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
c170: 5f 4d 49 53 55 53 45 20 29 7b 0a 20 20 20 20 54  _MISUSE ){.    T
c180: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
c190: 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33  interp, "sqlite3
c1a0: 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 65 5f  _create_collate_
c1b0: 76 32 28 29 20 66 61 69 6c 65 64 20 74 6f 20 64  v2() failed to d
c1c0: 65 74 65 63 74 20 22 0a 20 20 20 20 20 20 22 61  etect ".      "a
c1d0: 6e 20 69 6e 76 61 6c 69 64 20 65 6e 63 6f 64 69  n invalid encodi
c1e0: 6e 67 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ng", (char*)0);.
c1f0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
c200: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  RROR;.  }.  rc =
c210: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
c220: 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64 62 2c  collation_v2(db,
c230: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
c240: 62 6a 76 5b 32 5d 29 2c 20 53 51 4c 49 54 45 5f  bjv[2]), SQLITE_
c250: 55 54 46 38 2c 20 0a 20 20 20 20 20 20 28 76 6f  UTF8, .      (vo
c260: 69 64 20 2a 29 70 2c 20 74 65 73 74 43 72 65 61  id *)p, testCrea
c270: 74 65 43 6f 6c 6c 61 74 69 6f 6e 43 6d 70 2c 20  teCollationCmp, 
c280: 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74  testCreateCollat
c290: 69 6f 6e 44 65 6c 0a 20 20 29 3b 0a 20 20 72 65  ionDel.  );.  re
c2a0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
c2b0: 2f 2a 0a 2a 2a 20 55 53 41 47 45 3a 20 73 71 6c  /*.** USAGE: sql
c2c0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
c2d0: 74 69 6f 6e 5f 76 32 20 44 42 20 4e 41 4d 45 20  tion_v2 DB NAME 
c2e0: 4e 41 52 47 20 45 4e 43 20 3f 53 57 49 54 43 48  NARG ENC ?SWITCH
c2f0: 45 53 3f 0a 2a 2a 0a 2a 2a 20 41 76 61 69 6c 61  ES?.**.** Availa
c300: 62 6c 65 20 73 77 69 74 63 68 65 73 20 61 72 65  ble switches are
c310: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2d 66 75 6e 63 20  :.**.**   -func 
c320: 20 20 20 53 43 52 49 50 54 0a 2a 2a 20 20 20 2d     SCRIPT.**   -
c330: 73 74 65 70 20 20 20 20 53 43 52 49 50 54 0a 2a  step    SCRIPT.*
c340: 2a 20 20 20 2d 66 69 6e 61 6c 20 20 20 53 43 52  *   -final   SCR
c350: 49 50 54 0a 2a 2a 20 20 20 2d 64 65 73 74 72 6f  IPT.**   -destro
c360: 79 20 53 43 52 49 50 54 0a 2a 2f 0a 74 79 70 65  y SCRIPT.*/.type
c370: 64 65 66 20 73 74 72 75 63 74 20 43 72 65 61 74  def struct Creat
c380: 65 46 75 6e 63 74 69 6f 6e 56 32 20 43 72 65 61  eFunctionV2 Crea
c390: 74 65 46 75 6e 63 74 69 6f 6e 56 32 3b 0a 73 74  teFunctionV2;.st
c3a0: 72 75 63 74 20 43 72 65 61 74 65 46 75 6e 63 74  ruct CreateFunct
c3b0: 69 6f 6e 56 32 20 7b 0a 20 20 54 63 6c 5f 49 6e  ionV2 {.  Tcl_In
c3c0: 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20  terp *interp;.  
c3d0: 54 63 6c 5f 4f 62 6a 20 2a 70 46 75 6e 63 3b 20  Tcl_Obj *pFunc; 
c3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3f0: 2f 2a 20 53 63 72 69 70 74 20 66 6f 72 20 66 75  /* Script for fu
c400: 6e 63 74 69 6f 6e 20 69 6e 76 6f 63 61 74 69 6f  nction invocatio
c410: 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  n */.  Tcl_Obj *
c420: 70 53 74 65 70 3b 20 20 20 20 20 20 20 20 20 20  pStep;          
c430: 20 20 20 20 20 20 20 2f 2a 20 53 63 72 69 70 74         /* Script
c440: 20 66 6f 72 20 61 67 67 2e 20 73 74 65 70 20 69   for agg. step i
c450: 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 54  nvocation */.  T
c460: 63 6c 5f 4f 62 6a 20 2a 70 46 69 6e 61 6c 3b 20  cl_Obj *pFinal; 
c470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c480: 2a 20 53 63 72 69 70 74 20 66 6f 72 20 61 67 67  * Script for agg
c490: 2e 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 69  . finalization i
c4a0: 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 54  nvocation */.  T
c4b0: 63 6c 5f 4f 62 6a 20 2a 70 44 65 73 74 72 6f 79  cl_Obj *pDestroy
c4c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
c4d0: 2a 20 44 65 73 74 72 75 63 74 6f 72 20 73 63 72  * Destructor scr
c4e0: 69 70 74 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63  ipt */.};.static
c4f0: 20 76 6f 69 64 20 63 66 32 46 75 6e 63 28 73 71   void cf2Func(sq
c500: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
c510: 74 78 2c 20 69 6e 74 20 6e 41 72 67 2c 20 73 71  tx, int nArg, sq
c520: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 41  lite3_value **aA
c530: 72 67 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  rg){.}.static vo
c540: 69 64 20 63 66 32 53 74 65 70 28 73 71 6c 69 74  id cf2Step(sqlit
c550: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c  e3_context *ctx,
c560: 20 69 6e 74 20 6e 41 72 67 2c 20 73 71 6c 69 74   int nArg, sqlit
c570: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 41 72 67 29  e3_value **aArg)
c580: 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  {.}.static void 
c590: 63 66 32 46 69 6e 61 6c 28 73 71 6c 69 74 65 33  cf2Final(sqlite3
c5a0: 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 29 7b 0a  _context *ctx){.
c5b0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 66  }.static void cf
c5c0: 32 44 65 73 74 72 6f 79 28 76 6f 69 64 20 2a 70  2Destroy(void *p
c5d0: 55 73 65 72 29 7b 0a 20 20 43 72 65 61 74 65 46  User){.  CreateF
c5e0: 75 6e 63 74 69 6f 6e 56 32 20 2a 70 20 3d 20 28  unctionV2 *p = (
c5f0: 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32  CreateFunctionV2
c600: 20 2a 29 70 55 73 65 72 3b 0a 0a 20 20 69 66 28   *)pUser;..  if(
c610: 20 70 2d 3e 69 6e 74 65 72 70 20 26 26 20 70 2d   p->interp && p-
c620: 3e 70 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20  >pDestroy ){.   
c630: 20 69 6e 74 20 72 63 20 3d 20 54 63 6c 5f 45 76   int rc = Tcl_Ev
c640: 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72  alObjEx(p->inter
c650: 70 2c 20 70 2d 3e 70 44 65 73 74 72 6f 79 2c 20  p, p->pDestroy, 
c660: 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
c670: 54 43 4c 5f 4f 4b 20 29 20 54 63 6c 5f 42 61 63  TCL_OK ) Tcl_Bac
c680: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 2d 3e  kgroundError(p->
c690: 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 0a 20 20  interp);.  }..  
c6a0: 69 66 28 20 70 2d 3e 70 46 75 6e 63 20 29 20 54  if( p->pFunc ) T
c6b0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
c6c0: 70 2d 3e 70 46 75 6e 63 29 3b 20 0a 20 20 69 66  p->pFunc); .  if
c6d0: 28 20 70 2d 3e 70 53 74 65 70 20 29 20 54 63 6c  ( p->pStep ) Tcl
c6e0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d  _DecrRefCount(p-
c6f0: 3e 70 53 74 65 70 29 3b 20 0a 20 20 69 66 28 20  >pStep); .  if( 
c700: 70 2d 3e 70 46 69 6e 61 6c 20 29 20 54 63 6c 5f  p->pFinal ) Tcl_
c710: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e  DecrRefCount(p->
c720: 70 46 69 6e 61 6c 29 3b 20 0a 20 20 69 66 28 20  pFinal); .  if( 
c730: 70 2d 3e 70 44 65 73 74 72 6f 79 20 29 20 54 63  p->pDestroy ) Tc
c740: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
c750: 2d 3e 70 44 65 73 74 72 6f 79 29 3b 20 0a 20 20  ->pDestroy); .  
c760: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
c770: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  .}.static int te
c780: 73 74 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  st_create_functi
c790: 6f 6e 5f 76 32 28 0a 20 20 43 6c 69 65 6e 74 44  on_v2(.  ClientD
c7a0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
c7b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
c7c0: 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  used */.  Tcl_In
c7d0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
c7e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
c7f0: 20 69 6e 76 6f 6b 69 6e 67 20 54 43 4c 20 69 6e   invoking TCL in
c800: 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 69  terpreter */.  i
c810: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
c820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c830: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
c840: 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
c850: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
c860: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
c870: 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
c880: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
c890: 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db;.  const cha
c8a0: 72 20 2a 7a 46 75 6e 63 3b 0a 20 20 69 6e 74 20  r *zFunc;.  int 
c8b0: 6e 41 72 67 3b 0a 20 20 69 6e 74 20 65 6e 63 3b  nArg;.  int enc;
c8c0: 0a 20 20 43 72 65 61 74 65 46 75 6e 63 74 69 6f  .  CreateFunctio
c8d0: 6e 56 32 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  nV2 *p;.  int i;
c8e0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73 74  .  int rc;..  st
c8f0: 72 75 63 74 20 45 6e 63 54 61 62 6c 65 20 7b 0a  ruct EncTable {.
c900: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
c910: 7a 45 6e 63 3b 0a 20 20 20 20 69 6e 74 20 65 6e  zEnc;.    int en
c920: 63 3b 0a 20 20 7d 20 61 45 6e 63 5b 5d 20 3d 20  c;.  } aEnc[] = 
c930: 7b 0a 20 20 20 20 7b 22 75 74 66 38 22 2c 20 20  {.    {"utf8",  
c940: 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7d 2c    SQLITE_UTF8 },
c950: 0a 20 20 20 20 7b 22 75 74 66 31 36 22 2c 20 20  .    {"utf16",  
c960: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 7d 2c   SQLITE_UTF16 },
c970: 0a 20 20 20 20 7b 22 75 74 66 31 36 6c 65 22 2c  .    {"utf16le",
c980: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20   SQLITE_UTF16LE 
c990: 7d 2c 0a 20 20 20 20 7b 22 75 74 66 31 36 62 65  },.    {"utf16be
c9a0: 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  ", SQLITE_UTF16B
c9b0: 45 20 7d 2c 0a 20 20 20 20 7b 22 61 6e 79 22 2c  E },.    {"any",
c9c0: 20 20 20 20 20 53 51 4c 49 54 45 5f 41 4e 59 20       SQLITE_ANY 
c9d0: 7d 2c 0a 20 20 20 20 7b 22 30 22 2c 20 30 20 7d  },.    {"0", 0 }
c9e0: 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  .  };..  if( obj
c9f0: 63 3c 35 20 7c 7c 20 28 6f 62 6a 63 25 32 29 3d  c<5 || (objc%2)=
ca00: 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =0 ){.    Tcl_Wr
ca10: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
ca20: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
ca30: 4e 41 4d 45 20 4e 41 52 47 20 45 4e 43 20 53 57  NAME NARG ENC SW
ca40: 49 54 43 48 45 53 2e 2e 2e 22 29 3b 0a 20 20 20  ITCHES...");.   
ca50: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
ca60: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
ca70: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
ca80: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
ca90: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
caa0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
cab0: 4f 52 3b 0a 20 20 7a 46 75 6e 63 20 3d 20 54 63  OR;.  zFunc = Tc
cac0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
cad0: 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f  [2]);.  if( Tcl_
cae0: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
caf0: 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
cb00: 6e 41 72 67 29 20 29 20 72 65 74 75 72 6e 20 54  nArg) ) return T
cb10: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
cb20: 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
cb30: 4f 62 6a 53 74 72 75 63 74 28 69 6e 74 65 72 70  ObjStruct(interp
cb40: 2c 20 6f 62 6a 76 5b 34 5d 2c 20 61 45 6e 63 2c  , objv[4], aEnc,
cb50: 20 73 69 7a 65 6f 66 28 61 45 6e 63 5b 30 5d 29   sizeof(aEnc[0])
cb60: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 65 6e  , .          "en
cb70: 63 6f 64 69 6e 67 22 2c 20 30 2c 20 26 65 6e 63  coding", 0, &enc
cb80: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
cb90: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
cba0: 0a 20 20 65 6e 63 20 3d 20 61 45 6e 63 5b 65 6e  .  enc = aEnc[en
cbb0: 63 5d 2e 65 6e 63 3b 0a 0a 20 20 70 20 3d 20 73  c].enc;..  p = s
cbc0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
cbd0: 7a 65 6f 66 28 43 72 65 61 74 65 46 75 6e 63 74  zeof(CreateFunct
cbe0: 69 6f 6e 56 32 29 29 3b 0a 20 20 61 73 73 65 72  ionV2));.  asser
cbf0: 74 28 20 70 20 29 3b 0a 20 20 6d 65 6d 73 65 74  t( p );.  memset
cc00: 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 43 72  (p, 0, sizeof(Cr
cc10: 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 29 29  eateFunctionV2))
cc20: 3b 0a 20 20 70 2d 3e 69 6e 74 65 72 70 20 3d 20  ;.  p->interp = 
cc30: 69 6e 74 65 72 70 3b 0a 0a 20 20 66 6f 72 28 69  interp;..  for(i
cc40: 3d 35 3b 20 69 3c 6f 62 6a 63 3b 20 69 2b 3d 32  =5; i<objc; i+=2
cc50: 29 7b 0a 20 20 20 20 69 6e 74 20 69 53 77 69 74  ){.    int iSwit
cc60: 63 68 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  ch;.    const ch
cc70: 61 72 20 2a 61 7a 53 77 69 74 63 68 5b 5d 20 3d  ar *azSwitch[] =
cc80: 20 7b 22 2d 66 75 6e 63 22 2c 20 22 2d 73 74 65   {"-func", "-ste
cc90: 70 22 2c 20 22 2d 66 69 6e 61 6c 22 2c 20 22 2d  p", "-final", "-
cca0: 64 65 73 74 72 6f 79 22 2c 20 30 7d 3b 0a 20 20  destroy", 0};.  
ccb0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64    if( Tcl_GetInd
ccc0: 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
ccd0: 2c 20 6f 62 6a 76 5b 69 5d 2c 20 61 7a 53 77 69  , objv[i], azSwi
cce0: 74 63 68 2c 20 22 73 77 69 74 63 68 22 2c 20 30  tch, "switch", 0
ccf0: 2c 20 26 69 53 77 69 74 63 68 29 20 29 7b 0a 20  , &iSwitch) ){. 
cd00: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
cd10: 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(p);.      retu
cd20: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
cd30: 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 28    }..    switch(
cd40: 20 69 53 77 69 74 63 68 20 29 7b 0a 20 20 20 20   iSwitch ){.    
cd50: 20 20 63 61 73 65 20 30 3a 20 70 2d 3e 70 46 75    case 0: p->pFu
cd60: 6e 63 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d 3b 20  nc = objv[i+1]; 
cd70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
cd80: 20 20 63 61 73 65 20 31 3a 20 70 2d 3e 70 53 74    case 1: p->pSt
cd90: 65 70 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d 3b 20  ep = objv[i+1]; 
cda0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
cdb0: 20 20 63 61 73 65 20 32 3a 20 70 2d 3e 70 46 69    case 2: p->pFi
cdc0: 6e 61 6c 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d 3b  nal = objv[i+1];
cdd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
cde0: 20 20 63 61 73 65 20 33 3a 20 70 2d 3e 70 44 65    case 3: p->pDe
cdf0: 73 74 72 6f 79 20 3d 20 6f 62 6a 76 5b 69 2b 31  stroy = objv[i+1
ce00: 5d 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ];   break;.    
ce10: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  }.  }.  if( p->p
ce20: 46 75 6e 63 20 29 20 70 2d 3e 70 46 75 6e 63 20  Func ) p->pFunc 
ce30: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
ce40: 62 6a 28 70 2d 3e 70 46 75 6e 63 29 3b 20 0a 20  bj(p->pFunc); . 
ce50: 20 69 66 28 20 70 2d 3e 70 53 74 65 70 20 29 20   if( p->pStep ) 
ce60: 70 2d 3e 70 53 74 65 70 20 3d 20 54 63 6c 5f 44  p->pStep = Tcl_D
ce70: 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70  uplicateObj(p->p
ce80: 53 74 65 70 29 3b 20 0a 20 20 69 66 28 20 70 2d  Step); .  if( p-
ce90: 3e 70 46 69 6e 61 6c 20 29 20 70 2d 3e 70 46 69  >pFinal ) p->pFi
cea0: 6e 61 6c 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  nal = Tcl_Duplic
ceb0: 61 74 65 4f 62 6a 28 70 2d 3e 70 46 69 6e 61 6c  ateObj(p->pFinal
cec0: 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 44 65  ); .  if( p->pDe
ced0: 73 74 72 6f 79 20 29 20 70 2d 3e 70 44 65 73 74  stroy ) p->pDest
cee0: 72 6f 79 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  roy = Tcl_Duplic
cef0: 61 74 65 4f 62 6a 28 70 2d 3e 70 44 65 73 74 72  ateObj(p->pDestr
cf00: 6f 79 29 3b 20 0a 0a 20 20 69 66 28 20 70 2d 3e  oy); ..  if( p->
cf10: 70 46 75 6e 63 20 29 20 54 63 6c 5f 49 6e 63 72  pFunc ) Tcl_Incr
cf20: 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 46 75 6e  RefCount(p->pFun
cf30: 63 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 53  c); .  if( p->pS
cf40: 74 65 70 20 29 20 54 63 6c 5f 49 6e 63 72 52 65  tep ) Tcl_IncrRe
cf50: 66 43 6f 75 6e 74 28 70 2d 3e 70 53 74 65 70 29  fCount(p->pStep)
cf60: 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 46 69 6e  ; .  if( p->pFin
cf70: 61 6c 20 29 20 54 63 6c 5f 49 6e 63 72 52 65 66  al ) Tcl_IncrRef
cf80: 43 6f 75 6e 74 28 70 2d 3e 70 46 69 6e 61 6c 29  Count(p->pFinal)
cf90: 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 44 65 73  ; .  if( p->pDes
cfa0: 74 72 6f 79 20 29 20 54 63 6c 5f 49 6e 63 72 52  troy ) Tcl_IncrR
cfb0: 65 66 43 6f 75 6e 74 28 70 2d 3e 70 44 65 73 74  efCount(p->pDest
cfc0: 72 6f 79 29 3b 20 0a 0a 20 20 72 63 20 3d 20 73  roy); ..  rc = s
cfd0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
cfe0: 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 46  nction_v2(db, zF
cff0: 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20  unc, nArg, enc, 
d000: 28 76 6f 69 64 20 2a 29 70 2c 20 0a 20 20 20 20  (void *)p, .    
d010: 20 20 28 70 2d 3e 70 46 75 6e 63 20 3f 20 63 66    (p->pFunc ? cf
d020: 32 46 75 6e 63 20 3a 20 30 29 2c 0a 20 20 20 20  2Func : 0),.    
d030: 20 20 28 70 2d 3e 70 53 74 65 70 20 3f 20 63 66    (p->pStep ? cf
d040: 32 53 74 65 70 20 3a 20 30 29 2c 0a 20 20 20 20  2Step : 0),.    
d050: 20 20 28 70 2d 3e 70 46 69 6e 61 6c 20 3f 20 63    (p->pFinal ? c
d060: 66 32 46 69 6e 61 6c 20 3a 20 30 29 2c 0a 20 20  f2Final : 0),.  
d070: 20 20 20 20 63 66 32 44 65 73 74 72 6f 79 0a 20      cf2Destroy. 
d080: 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   );.  if( rc!=SQ
d090: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
d0a0: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
d0b0: 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
d0c0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
d0d0: 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  erp, sqlite3ErrN
d0e0: 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20  ame(rc), 0);.   
d0f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
d100: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
d110: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
d120: 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
d130: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 20 44  load_extension D
d140: 42 2d 48 41 4e 44 4c 45 20 46 49 4c 45 20 3f 50  B-HANDLE FILE ?P
d150: 52 4f 43 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ROC?.*/.static i
d160: 6e 74 20 74 65 73 74 5f 6c 6f 61 64 5f 65 78 74  nt test_load_ext
d170: 65 6e 73 69 6f 6e 28 0a 20 20 43 6c 69 65 6e 74  ension(.  Client
d180: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
d190: 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a   /* Not used */.
d1a0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
d1b0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
d1c0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
d1d0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
d1e0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
d1f0: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
d200: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
d210: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
d220: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
d230: 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
d240: 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
d250: 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66  .){.  Tcl_CmdInf
d260: 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 73 71 6c  o cmdInfo;.  sql
d270: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
d280: 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b  rc;.  char *zDb;
d290: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a  .  char *zFile;.
d2a0: 20 20 63 68 61 72 20 2a 7a 50 72 6f 63 20 3d 20    char *zProc = 
d2b0: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20  0;.  char *zErr 
d2c0: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  = 0;..  if( objc
d2d0: 21 3d 34 20 26 26 20 6f 62 6a 63 21 3d 33 20 29  !=4 && objc!=3 )
d2e0: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
d2f0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
d300: 2c 20 6f 62 6a 76 2c 20 22 44 42 2d 48 41 4e 44  , objv, "DB-HAND
d310: 4c 45 20 46 49 4c 45 20 3f 50 52 4f 43 3f 22 29  LE FILE ?PROC?")
d320: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
d330: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44  _ERROR;.  }.  zD
d340: 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  b = Tcl_GetStrin
d350: 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 7a 46  g(objv[1]);.  zF
d360: 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ile = Tcl_GetStr
d370: 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
d380: 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20  if( objc==4 ){. 
d390: 20 20 20 7a 50 72 6f 63 20 3d 20 54 63 6c 5f 47     zProc = Tcl_G
d3a0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
d3b0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 74  );.  }..  /* Ext
d3c0: 72 61 63 74 20 74 68 65 20 43 20 64 61 74 61 62  ract the C datab
d3d0: 61 73 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20  ase handle from 
d3e0: 74 68 65 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20  the Tcl command 
d3f0: 6e 61 6d 65 20 2a 2f 0a 20 20 69 66 28 20 21 54  name */.  if( !T
d400: 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66  cl_GetCommandInf
d410: 6f 28 69 6e 74 65 72 70 2c 20 7a 44 62 2c 20 26  o(interp, zDb, &
d420: 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  cmdInfo) ){.    
d430: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d440: 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e  (interp, "comman
d450: 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 20  d not found: ", 
d460: 7a 44 62 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  zDb, (char*)0);.
d470: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
d480: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 64 62 20 3d  RROR;.  }.  db =
d490: 20 28 28 73 74 72 75 63 74 20 53 71 6c 69 74 65   ((struct Sqlite
d4a0: 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43  Db*)cmdInfo.objC
d4b0: 6c 69 65 6e 74 44 61 74 61 29 2d 3e 64 62 3b 0a  lientData)->db;.
d4c0: 20 20 61 73 73 65 72 74 28 64 62 29 3b 0a 0a 20    assert(db);.. 
d4d0: 20 2f 2a 20 43 61 6c 6c 20 74 68 65 20 75 6e 64   /* Call the und
d4e0: 65 72 6c 79 69 6e 67 20 43 20 66 75 6e 63 74 69  erlying C functi
d4f0: 6f 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  on. If an error 
d500: 6f 63 63 75 72 73 2c 20 73 65 74 20 72 63 20 74  occurs, set rc t
d510: 6f 20 0a 20 20 2a 2a 20 54 43 4c 5f 45 52 52 4f  o .  ** TCL_ERRO
d520: 52 20 61 6e 64 20 6c 6f 61 64 20 61 6e 79 20 65  R and load any e
d530: 72 72 6f 72 20 73 74 72 69 6e 67 20 69 6e 74 6f  rror string into
d540: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
d550: 2e 20 49 66 20 6e 6f 20 0a 20 20 2a 2a 20 65 72  . If no .  ** er
d560: 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
d570: 72 63 20 74 6f 20 54 43 4c 5f 4f 4b 2e 0a 20 20  rc to TCL_OK..  
d580: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
d590: 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
d5a0: 53 49 4f 4e 0a 20 20 72 63 20 3d 20 53 51 4c 49  SION.  rc = SQLI
d5b0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7a 45 72 72  TE_ERROR;.  zErr
d5c0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
d5d0: 74 66 28 22 74 68 69 73 20 62 75 69 6c 64 20 6f  tf("this build o
d5e0: 6d 69 74 73 20 73 71 6c 69 74 65 33 5f 6c 6f 61  mits sqlite3_loa
d5f0: 64 5f 65 78 74 65 6e 73 69 6f 6e 28 29 22 29 3b  d_extension()");
d600: 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d 20 73 71  .#else.  rc = sq
d610: 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e  lite3_load_exten
d620: 73 69 6f 6e 28 64 62 2c 20 7a 46 69 6c 65 2c 20  sion(db, zFile, 
d630: 7a 50 72 6f 63 2c 20 26 7a 45 72 72 29 3b 0a 23  zProc, &zErr);.#
d640: 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 21 3d  endif.  if( rc!=
d650: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d660: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
d670: 6e 74 65 72 70 2c 20 7a 45 72 72 20 3f 20 7a 45  nterp, zErr ? zE
d680: 72 72 20 3a 20 22 22 2c 20 54 43 4c 5f 56 4f 4c  rr : "", TCL_VOL
d690: 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 63 20 3d  ATILE);.    rc =
d6a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65   TCL_ERROR;.  }e
d6b0: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 54 43  lse{.    rc = TC
d6c0: 4c 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  L_OK;.  }.  sqli
d6d0: 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a  te3_free(zErr);.
d6e0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d6f0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
d700: 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61  lite3_enable_loa
d710: 64 5f 65 78 74 65 6e 73 69 6f 6e 20 44 42 2d 48  d_extension DB-H
d720: 41 4e 44 4c 45 20 4f 4e 4f 46 46 0a 2a 2f 0a 73  ANDLE ONOFF.*/.s
d730: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65  tatic int test_e
d740: 6e 61 62 6c 65 5f 6c 6f 61 64 28 0a 20 20 43 6c  nable_load(.  Cl
d750: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
d760: 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64  ata, /* Not used
d770: 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
d780: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
d790: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
d7a0: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
d7b0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
d7c0: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
d7d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
d7e0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
d7f0: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
d800: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
d810: 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
d820: 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d  s */.){.  Tcl_Cm
d830: 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20  dInfo cmdInfo;. 
d840: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
d850: 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 69 6e 74  char *zDb;.  int
d860: 20 6f 6e 6f 66 66 3b 0a 0a 20 20 69 66 28 20 6f   onoff;..  if( o
d870: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
d880: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
d890: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
d8a0: 22 44 42 2d 48 41 4e 44 4c 45 20 4f 4e 4f 46 46  "DB-HANDLE ONOFF
d8b0: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
d8c0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
d8d0: 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  zDb = Tcl_GetStr
d8e0: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 0a 20  ing(objv[1]);.. 
d8f0: 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20   /* Extract the 
d900: 43 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  C database handl
d910: 65 20 66 72 6f 6d 20 74 68 65 20 54 63 6c 20 63  e from the Tcl c
d920: 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 2a 2f 0a 20  ommand name */. 
d930: 20 69 66 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d   if( !Tcl_GetCom
d940: 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c  mandInfo(interp,
d950: 20 7a 44 62 2c 20 26 63 6d 64 49 6e 66 6f 29 20   zDb, &cmdInfo) 
d960: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
d970: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
d980: 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f 75  "command not fou
d990: 6e 64 3a 20 22 2c 20 7a 44 62 2c 20 28 63 68 61  nd: ", zDb, (cha
d9a0: 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
d9b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
d9c0: 0a 20 20 64 62 20 3d 20 28 28 73 74 72 75 63 74  .  db = ((struct
d9d0: 20 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e   SqliteDb*)cmdIn
d9e0: 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61  fo.objClientData
d9f0: 29 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  )->db;.  assert(
da00: 64 62 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74  db);..  /* Get t
da10: 68 65 20 6f 6e 6f 66 66 20 70 61 72 61 6d 65 74  he onoff paramet
da20: 65 72 20 2a 2f 0a 20 20 69 66 28 20 54 63 6c 5f  er */.  if( Tcl_
da30: 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
da40: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
da50: 5d 2c 20 26 6f 6e 6f 66 66 29 20 29 7b 0a 20 20  ], &onoff) ){.  
da60: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
da70: 4f 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20  OR;.  }..#ifdef 
da80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
da90: 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 54 63 6c  _EXTENSION.  Tcl
daa0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
dab0: 74 65 72 70 2c 20 22 74 68 69 73 20 62 75 69 6c  terp, "this buil
dac0: 64 20 6f 6d 69 74 73 20 73 71 6c 69 74 65 33 5f  d omits sqlite3_
dad0: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 29  load_extension()
dae0: 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ");.  return TCL
daf0: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20  _ERROR;.#else.  
db00: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c  sqlite3_enable_l
db10: 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 64 62  oad_extension(db
db20: 2c 20 6f 6e 6f 66 66 29 3b 0a 20 20 72 65 74 75  , onoff);.  retu
db30: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 23 65 6e 64 69  rn TCL_OK;.#endi
db40: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  f.}../*.** Usage
db50: 3a 20 20 73 71 6c 69 74 65 5f 61 62 6f 72 74 0a  :  sqlite_abort.
db60: 2a 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  **.** Shutdown t
db70: 68 65 20 70 72 6f 63 65 73 73 20 69 6d 6d 65 64  he process immed
db80: 69 61 74 65 6c 79 2e 20 20 54 68 69 73 20 69 73  iately.  This is
db90: 20 6e 6f 74 20 61 20 63 6c 65 61 6e 20 73 68 75   not a clean shu
dba0: 74 64 6f 77 6e 2e 0a 2a 2a 20 54 68 69 73 20 63  tdown..** This c
dbb0: 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74  ommand is used t
dbc0: 6f 20 74 65 73 74 20 74 68 65 20 72 65 63 6f 76  o test the recov
dbd0: 65 72 61 62 69 6c 69 74 79 20 6f 66 20 61 20 64  erability of a d
dbe0: 61 74 61 62 61 73 65 20 69 6e 0a 2a 2a 20 74 68  atabase in.** th
dbf0: 65 20 65 76 65 6e 74 20 6f 66 20 61 20 70 72 6f  e event of a pro
dc00: 67 72 61 6d 20 63 72 61 73 68 2e 0a 2a 2f 0a 73  gram crash..*/.s
dc10: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
dc20: 5f 61 62 6f 72 74 28 0a 20 20 76 6f 69 64 20 2a  _abort(.  void *
dc30: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
dc40: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
dc50: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
dc60: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
dc70: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
dc80: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
dc90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
dca0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
dcb0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
dcc0: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
dcd0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
dce0: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
dcf0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 4d 53  .#if defined(_MS
dd00: 43 5f 56 45 52 29 0a 20 20 2f 2a 20 57 65 20 64  C_VER).  /* We d
dd10: 6f 20 74 68 69 73 2c 20 6f 74 68 65 72 77 69 73  o this, otherwis
dd20: 65 20 74 68 65 20 74 65 73 74 20 77 69 6c 6c 20  e the test will 
dd30: 68 61 6c 74 20 77 69 74 68 20 61 20 70 6f 70 75  halt with a popu
dd40: 70 20 6d 65 73 73 61 67 65 0a 20 20 20 2a 20 74  p message.   * t
dd50: 68 61 74 20 77 65 20 68 61 76 65 20 74 6f 20 63  hat we have to c
dd60: 6c 69 63 6b 20 61 77 61 79 20 62 65 66 6f 72 65  lick away before
dd70: 20 74 68 65 20 74 65 73 74 20 77 69 6c 6c 20 63   the test will c
dd80: 6f 6e 74 69 6e 75 65 2e 0a 20 20 20 2a 2f 0a 20  ontinue..   */. 
dd90: 20 5f 73 65 74 5f 61 62 6f 72 74 5f 62 65 68 61   _set_abort_beha
dda0: 76 69 6f 72 28 20 30 2c 20 5f 43 41 4c 4c 5f 52  vior( 0, _CALL_R
ddb0: 45 50 4f 52 54 46 41 55 4c 54 20 29 3b 0a 23 65  EPORTFAULT );.#e
ddc0: 6e 64 69 66 0a 20 20 65 78 69 74 28 32 35 35 29  ndif.  exit(255)
ddd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 74 65  ;.  assert( inte
dde0: 72 70 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 54 68  rp==0 );   /* Th
ddf0: 69 73 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66  is will always f
de00: 61 69 6c 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ail */.  return 
de10: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
de20: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
de30: 6f 75 74 69 6e 65 20 69 73 20 61 20 75 73 65 72  outine is a user
de40: 2d 64 65 66 69 6e 65 64 20 53 51 4c 20 66 75 6e  -defined SQL fun
de50: 63 74 69 6f 6e 20 77 68 6f 73 65 20 70 75 72 70  ction whose purp
de60: 6f 73 65 0a 2a 2a 20 69 73 20 74 6f 20 74 65 73  ose.** is to tes
de70: 74 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 74  t the sqlite_set
de80: 5f 72 65 73 75 6c 74 28 29 20 41 50 49 2e 0a 2a  _result() API..*
de90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  /.static void te
dea0: 73 74 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  stFunc(sqlite3_c
deb0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
dec0: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
ded0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29  e3_value **argv)
dee0: 7b 0a 20 20 77 68 69 6c 65 28 20 61 72 67 63 3e  {.  while( argc>
def0: 3d 32 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =2 ){.    const 
df00: 63 68 61 72 20 2a 7a 41 72 67 30 20 3d 20 28 63  char *zArg0 = (c
df10: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
df20: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
df30: 3b 0a 20 20 20 20 69 66 28 20 7a 41 72 67 30 20  ;.    if( zArg0 
df40: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ){.      if( 0==
df50: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
df60: 41 72 67 30 2c 20 22 69 6e 74 22 29 20 29 7b 0a  Arg0, "int") ){.
df70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
df80: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
df90: 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  xt, sqlite3_valu
dfa0: 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 29 3b  e_int(argv[1]));
dfb0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
dfc0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
dfd0: 7a 41 72 67 30 2c 22 69 6e 74 36 34 22 29 3d 3d  zArg0,"int64")==
dfe0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
dff0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
e000: 34 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74  4(context, sqlit
e010: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61  e3_value_int64(a
e020: 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20  rgv[1]));.      
e030: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
e040: 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22  3StrICmp(zArg0,"
e050: 73 74 72 69 6e 67 22 29 3d 3d 30 20 29 7b 0a 20  string")==0 ){. 
e060: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
e070: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
e080: 78 74 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74  xt, (char*)sqlit
e090: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
e0a0: 67 76 5b 31 5d 29 2c 20 2d 31 2c 0a 20 20 20 20  gv[1]), -1,.    
e0b0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54          SQLITE_T
e0c0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
e0d0: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
e0e0: 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c  e3StrICmp(zArg0,
e0f0: 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a  "double")==0 ){.
e100: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
e110: 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f  result_double(co
e120: 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76  ntext, sqlite3_v
e130: 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76  alue_double(argv
e140: 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  [1]));.      }el
e150: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  se if( sqlite3St
e160: 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 6e 75 6c  rICmp(zArg0,"nul
e170: 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  l")==0 ){.      
e180: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
e190: 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 0a  _null(context);.
e1a0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
e1b0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
e1c0: 41 72 67 30 2c 22 76 61 6c 75 65 22 29 3d 3d 30  Arg0,"value")==0
e1d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
e1e0: 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65  te3_result_value
e1f0: 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 73  (context, argv[s
e200: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
e210: 28 61 72 67 76 5b 31 5d 29 5d 29 3b 0a 20 20 20  (argv[1])]);.   
e220: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e230: 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74    goto error_out
e240: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
e250: 6c 73 65 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  lse{.      goto 
e260: 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 7d  error_out;.    }
e270: 0a 20 20 20 20 61 72 67 63 20 2d 3d 20 32 3b 0a  .    argc -= 2;.
e280: 20 20 20 20 61 72 67 76 20 2b 3d 20 32 3b 0a 20      argv += 2;. 
e290: 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 65 72   }.  return;..er
e2a0: 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ror_out:.  sqlit
e2b0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
e2c0: 63 6f 6e 74 65 78 74 2c 22 66 69 72 73 74 20 61  context,"first a
e2d0: 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62  rgument should b
e2e0: 65 20 6f 6e 65 20 6f 66 3a 20 22 0a 20 20 20 20  e one of: ".    
e2f0: 20 20 22 69 6e 74 20 69 6e 74 36 34 20 73 74 72    "int int64 str
e300: 69 6e 67 20 64 6f 75 62 6c 65 20 6e 75 6c 6c 20  ing double null 
e310: 76 61 6c 75 65 22 2c 20 2d 31 29 3b 0a 7d 0a 0a  value", -1);.}..
e320: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
e330: 71 6c 69 74 65 5f 72 65 67 69 73 74 65 72 5f 74  qlite_register_t
e340: 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 20 44 42  est_function  DB
e350: 20 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 67    NAME.**.** Reg
e360: 69 73 74 65 72 20 74 68 65 20 74 65 73 74 20 53  ister the test S
e370: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74  QL function on t
e380: 68 65 20 64 61 74 61 62 61 73 65 20 44 42 20 75  he database DB u
e390: 6e 64 65 72 20 74 68 65 20 6e 61 6d 65 20 4e 41  nder the name NA
e3a0: 4d 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ME..*/.static in
e3b0: 74 20 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f  t test_register_
e3c0: 66 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  func(.  void *No
e3d0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
e3e0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
e3f0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
e400: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
e410: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
e420: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
e430: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e440: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
e450: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
e460: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
e470: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
e480: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
e490: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
e4a0: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72  int rc;.  if( ar
e4b0: 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=3 ){.    Tcl
e4c0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
e4d0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
e4e0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
e4f0: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20  "", argv[0], .  
e500: 20 20 20 20 20 22 20 44 42 20 46 55 4e 43 54 49       " DB FUNCTI
e510: 4f 4e 2d 4e 41 4d 45 22 2c 20 30 29 3b 0a 20 20  ON-NAME", 0);.  
e520: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
e530: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
e540: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
e550: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
e560: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
e570: 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
e580: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
e590: 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c  ion(db, argv[2],
e5a0: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
e5b0: 2c 20 30 2c 20 0a 20 20 20 20 20 20 74 65 73 74  , 0, .      test
e5c0: 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 69  Func, 0, 0);.  i
e5d0: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
e5e0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
e5f0: 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
e600: 45 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a  ErrStr(rc), 0);.
e610: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
e620: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
e630: 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
e640: 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
e650: 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
e660: 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20  ERROR;.  return 
e670: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
e680: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
e690: 5f 66 69 6e 61 6c 69 7a 65 20 20 53 54 4d 54 20  _finalize  STMT 
e6a0: 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20  .**.** Finalize 
e6b0: 61 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64  a statement hand
e6c0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
e6d0: 74 20 74 65 73 74 5f 66 69 6e 61 6c 69 7a 65 28  t test_finalize(
e6e0: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
e6f0: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
e700: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
e710: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
e720: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
e730: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
e740: 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
e750: 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  rc;.  sqlite3 *d
e760: 62 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62  b = 0;..  if( ob
e770: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
e780: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
e790: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
e7a0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
e7b0: 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
e7c0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
e7d0: 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
e7e0: 3c 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20  <STMT>", 0);.   
e7f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
e800: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
e810: 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
e820: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
e830: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
e840: 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
e850: 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20  L_ERROR;..  if( 
e860: 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 64 62 20  pStmt ){.    db 
e870: 3d 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74  = StmtToDb(pStmt
e880: 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
e890: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
e8a0: 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74  Stmt);.  Tcl_Set
e8b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
e8c0: 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
e8d0: 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
e8e0: 49 43 29 3b 0a 20 20 69 66 28 20 64 62 20 26 26  IC);.  if( db &&
e8f0: 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
e900: 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20  ode(interp, db, 
e910: 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
e920: 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e  _ERROR;.  return
e930: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
e940: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
e950: 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 20 20 53  3_stmt_status  S
e960: 54 4d 54 20 20 43 4f 44 45 20 20 52 45 53 45 54  TMT  CODE  RESET
e970: 46 4c 41 47 0a 2a 2a 0a 2a 2a 20 47 65 74 20 74  FLAG.**.** Get t
e980: 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73 74  he value of a st
e990: 61 74 75 73 20 63 6f 75 6e 74 65 72 20 66 72 6f  atus counter fro
e9a0: 6d 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  m a statement..*
e9b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
e9c0: 74 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 0a 20  t_stmt_status(. 
e9d0: 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
e9e0: 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
e9f0: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
ea00: 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
ea10: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
ea20: 0a 20 20 69 6e 74 20 69 56 61 6c 75 65 3b 0a 20  .  int iValue;. 
ea30: 20 69 6e 74 20 69 2c 20 6f 70 2c 20 72 65 73 65   int i, op, rese
ea40: 74 46 6c 61 67 3b 0a 20 20 63 6f 6e 73 74 20 63  tFlag;.  const c
ea50: 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20  har *zOpName;.  
ea60: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
ea70: 74 6d 74 3b 0a 0a 20 20 73 74 61 74 69 63 20 63  tmt;..  static c
ea80: 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
ea90: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
eaa0: 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 6f 70 3b  ame;.    int op;
eab0: 0a 20 20 7d 20 61 4f 70 5b 5d 20 3d 20 7b 0a 20  .  } aOp[] = {. 
eac0: 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 53 54 4d     { "SQLITE_STM
ead0: 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e  TSTATUS_FULLSCAN
eae0: 5f 53 54 45 50 22 2c 20 20 20 53 51 4c 49 54 45  _STEP",   SQLITE
eaf0: 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c  _STMTSTATUS_FULL
eb00: 53 43 41 4e 5f 53 54 45 50 20 20 20 7d 2c 0a 20  SCAN_STEP   },. 
eb10: 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 53 54 4d     { "SQLITE_STM
eb20: 54 53 54 41 54 55 53 5f 53 4f 52 54 22 2c 20 20  TSTATUS_SORT",  
eb30: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
eb40: 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54  _STMTSTATUS_SORT
eb50: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
eb60: 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 53 54 4d     { "SQLITE_STM
eb70: 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45  TSTATUS_AUTOINDE
eb80: 58 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45  X",       SQLITE
eb90: 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f  _STMTSTATUS_AUTO
eba0: 49 4e 44 45 58 20 20 20 20 20 20 20 7d 2c 0a 20  INDEX       },. 
ebb0: 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 53 54 4d     { "SQLITE_STM
ebc0: 54 53 54 41 54 55 53 5f 56 4d 5f 53 54 45 50 22  TSTATUS_VM_STEP"
ebd0: 2c 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  ,         SQLITE
ebe0: 5f 53 54 4d 54 53 54 41 54 55 53 5f 56 4d 5f 53  _STMTSTATUS_VM_S
ebf0: 54 45 50 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  TEP         },. 
ec00: 20 7d 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d   };.  if( objc!=
ec10: 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  4 ){.    Tcl_Wro
ec20: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
ec30: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54  , 1, objv, "STMT
ec40: 20 50 41 52 41 4d 45 54 45 52 20 52 45 53 45 54   PARAMETER RESET
ec50: 46 4c 41 47 22 29 3b 0a 20 20 20 20 72 65 74 75  FLAG");.    retu
ec60: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ec70: 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
ec80: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
ec90: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
eca0: 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
ecb0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
ecc0: 52 3b 0a 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 54  R;.  zOpName = T
ecd0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
ece0: 76 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30  v[2]);.  for(i=0
ecf0: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 4f  ; i<ArraySize(aO
ed00: 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  p); i++){.    if
ed10: 28 20 73 74 72 63 6d 70 28 61 4f 70 5b 69 5d 2e  ( strcmp(aOp[i].
ed20: 7a 4e 61 6d 65 2c 20 7a 4f 70 4e 61 6d 65 29 3d  zName, zOpName)=
ed30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 70 20 3d  =0 ){.      op =
ed40: 20 61 4f 70 5b 69 5d 2e 6f 70 3b 0a 20 20 20 20   aOp[i].op;.    
ed50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
ed60: 20 7d 0a 20 20 69 66 28 20 69 3e 3d 41 72 72 61   }.  if( i>=Arra
ed70: 79 53 69 7a 65 28 61 4f 70 29 20 29 7b 0a 20 20  ySize(aOp) ){.  
ed80: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
ed90: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
eda0: 6f 62 6a 76 5b 32 5d 2c 20 26 6f 70 29 20 29 20  objv[2], &op) ) 
edb0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
edc0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
edd0: 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
ede0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
edf0: 5d 2c 20 26 72 65 73 65 74 46 6c 61 67 29 20 29  ], &resetFlag) )
ee00: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
ee10: 52 3b 0a 20 20 69 56 61 6c 75 65 20 3d 20 73 71  R;.  iValue = sq
ee20: 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
ee30: 73 28 70 53 74 6d 74 2c 20 6f 70 2c 20 72 65 73  s(pStmt, op, res
ee40: 65 74 46 6c 61 67 29 3b 0a 20 20 54 63 6c 5f 53  etFlag);.  Tcl_S
ee50: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
ee60: 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
ee70: 6a 28 69 56 61 6c 75 65 29 29 3b 0a 20 20 72 65  j(iValue));.  re
ee80: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
ee90: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
eea0: 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
eeb0: 41 54 55 53 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ATUS./*.** Usage
eec0: 3a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f  :  sqlite3_stmt_
eed0: 73 63 61 6e 73 74 61 74 75 73 20 53 54 4d 54 20  scanstatus STMT 
eee0: 49 44 58 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  IDX.*/.static in
eef0: 74 20 74 65 73 74 5f 73 74 6d 74 5f 73 63 61 6e  t test_stmt_scan
ef00: 73 74 61 74 75 73 28 0a 20 20 76 6f 69 64 20 2a  status(.  void *
ef10: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
ef20: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
ef30: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
ef40: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
ef50: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
ef60: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
ef70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
ef80: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 2a 2f  irst argument */
ef90: 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20  .  int idx;     
efa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efb0: 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 61 72 67     /* Second arg
efc0: 75 6d 65 6e 74 20 2a 2f 0a 0a 20 20 63 6f 6e 73  ument */..  cons
efd0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  t char *zName;. 
efe0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 78   const char *zEx
eff0: 70 6c 61 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33  plain;.  sqlite3
f000: 5f 69 6e 74 36 34 20 6e 4c 6f 6f 70 3b 0a 20 20  _int64 nLoop;.  
f010: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 56  sqlite3_int64 nV
f020: 69 73 69 74 3b 0a 20 20 64 6f 75 62 6c 65 20 72  isit;.  double r
f030: 45 73 74 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  Est;.  int res;.
f040: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
f050: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
f060: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
f070: 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20 49 44  , objv, "STMT ID
f080: 58 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  X");.    return 
f090: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
f0a0: 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
f0b0: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
f0c0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
f0d0: 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
f0e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
f0f0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
f100: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
f110: 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29  objv[2], &idx) )
f120: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f130: 52 3b 0a 0a 20 20 72 65 73 20 3d 20 73 71 6c 69  R;..  res = sqli
f140: 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
f150: 74 75 73 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  tus(pStmt, idx, 
f160: 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f  SQLITE_SCANSTAT_
f170: 4e 4c 4f 4f 50 2c 20 28 76 6f 69 64 2a 29 26 6e  NLOOP, (void*)&n
f180: 4c 6f 6f 70 29 3b 0a 20 20 69 66 28 20 72 65 73  Loop);.  if( res
f190: 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 4f  ==0 ){.    Tcl_O
f1a0: 62 6a 20 2a 70 52 65 74 20 3d 20 54 63 6c 5f 4e  bj *pRet = Tcl_N
f1b0: 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 54 63 6c  ewObj();.    Tcl
f1c0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
f1d0: 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54  ement(0, pRet, T
f1e0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
f1f0: 22 6e 4c 6f 6f 70 22 2c 20 2d 31 29 29 3b 0a 20  "nLoop", -1));. 
f200: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
f210: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
f220: 52 65 74 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65  Ret, Tcl_NewWide
f230: 49 6e 74 4f 62 6a 28 6e 4c 6f 6f 70 29 29 3b 0a  IntObj(nLoop));.
f240: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
f250: 5f 73 63 61 6e 73 74 61 74 75 73 28 70 53 74 6d  _scanstatus(pStm
f260: 74 2c 20 69 64 78 2c 20 53 51 4c 49 54 45 5f 53  t, idx, SQLITE_S
f270: 43 41 4e 53 54 41 54 5f 4e 56 49 53 49 54 2c 20  CANSTAT_NVISIT, 
f280: 28 76 6f 69 64 2a 29 26 6e 56 69 73 69 74 29 3b  (void*)&nVisit);
f290: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
f2a0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
f2b0: 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74   pRet, Tcl_NewSt
f2c0: 72 69 6e 67 4f 62 6a 28 22 6e 56 69 73 69 74 22  ringObj("nVisit"
f2d0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
f2e0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
f2f0: 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63  ment(0, pRet, Tc
f300: 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
f310: 6e 56 69 73 69 74 29 29 3b 0a 20 20 20 20 73 71  nVisit));.    sq
f320: 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73  lite3_stmt_scans
f330: 74 61 74 75 73 28 70 53 74 6d 74 2c 20 69 64 78  tatus(pStmt, idx
f340: 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41  , SQLITE_SCANSTA
f350: 54 5f 45 53 54 2c 20 28 76 6f 69 64 2a 29 26 72  T_EST, (void*)&r
f360: 45 73 74 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  Est);.    Tcl_Li
f370: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
f380: 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f  nt(0, pRet, Tcl_
f390: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6e 45  NewStringObj("nE
f3a0: 73 74 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  st", -1));.    T
f3b0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
f3c0: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c  Element(0, pRet,
f3d0: 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62   Tcl_NewDoubleOb
f3e0: 6a 28 72 45 73 74 29 29 3b 0a 20 20 20 20 73 71  j(rEst));.    sq
f3f0: 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73  lite3_stmt_scans
f400: 74 61 74 75 73 28 70 53 74 6d 74 2c 20 69 64 78  tatus(pStmt, idx
f410: 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41  , SQLITE_SCANSTA
f420: 54 5f 4e 41 4d 45 2c 20 28 76 6f 69 64 2a 29 26  T_NAME, (void*)&
f430: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 54 63 6c 5f  zName);.    Tcl_
f440: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
f450: 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63  ment(0, pRet, Tc
f460: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
f470: 7a 4e 61 6d 65 22 2c 20 2d 31 29 29 3b 0a 20 20  zName", -1));.  
f480: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
f490: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
f4a0: 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  et, Tcl_NewStrin
f4b0: 67 4f 62 6a 28 7a 4e 61 6d 65 2c 20 2d 31 29 29  gObj(zName, -1))
f4c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
f4d0: 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 70 53  mt_scanstatus(pS
f4e0: 74 6d 74 2c 20 69 64 78 2c 20 53 51 4c 49 54 45  tmt, idx, SQLITE
f4f0: 5f 53 43 41 4e 53 54 41 54 5f 45 58 50 4c 41 49  _SCANSTAT_EXPLAI
f500: 4e 2c 20 28 76 6f 69 64 2a 29 26 7a 45 78 70 6c  N, (void*)&zExpl
f510: 61 69 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  ain);.    Tcl_Li
f520: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
f530: 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f  nt(0, pRet, Tcl_
f540: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 7a 45  NewStringObj("zE
f550: 78 70 6c 61 69 6e 22 2c 20 2d 31 29 29 3b 0a 20  xplain", -1));. 
f560: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
f570: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
f580: 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ret, Tcl_NewStri
f590: 6e 67 4f 62 6a 28 7a 45 78 70 6c 61 69 6e 2c 20  ngObj(zExplain, 
f5a0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  -1));.    Tcl_Se
f5b0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
f5c0: 70 2c 20 70 52 65 74 29 3b 0a 20 20 7d 65 6c 73  p, pRet);.  }els
f5d0: 65 7b 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74  e{.    Tcl_Reset
f5e0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
f5f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
f600: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
f610: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 74  age:  sqlite3_st
f620: 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 5f 72 65  mt_scanstatus_re
f630: 73 65 74 20 20 53 54 4d 54 0a 2a 2f 0a 73 74 61  set  STMT.*/.sta
f640: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d  tic int test_stm
f650: 74 5f 73 63 61 6e 73 74 61 74 75 73 5f 72 65 73  t_scanstatus_res
f660: 65 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  et(.  void * cli
f670: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
f680: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
f690: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
f6a0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
f6b0: 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
f6c0: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20  stmt *pStmt;    
f6d0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
f6e0: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 20 20 69   argument */.  i
f6f0: 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
f700: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
f710: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
f720: 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20  jv, "STMT");.   
f730: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f740: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
f750: 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
f760: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
f770: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
f780: 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
f790: 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65  _ERROR;.  sqlite
f7a0: 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75  3_stmt_scanstatu
f7b0: 73 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  s_reset(pStmt);.
f7c0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
f7d0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
f7e0: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
f7f0: 5f 6e 65 78 74 5f 73 74 6d 74 20 20 44 42 20 20  _next_stmt  DB  
f800: 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  STMT.**.** Retur
f810: 6e 20 74 68 65 20 6e 65 78 74 20 73 74 61 74 6d  n the next statm
f820: 65 6e 74 20 69 6e 20 73 65 71 75 65 6e 63 65 20  ent in sequence 
f830: 61 66 74 65 72 20 53 54 4d 54 2e 0a 2a 2f 0a 73  after STMT..*/.s
f840: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6e  tatic int test_n
f850: 65 78 74 5f 73 74 6d 74 28 0a 20 20 76 6f 69 64  ext_stmt(.  void
f860: 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
f870: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
f880: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
f890: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
f8a0: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
f8b0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
f8c0: 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
f8d0: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75   = 0;.  char zBu
f8e0: 66 5b 35 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62  f[50];..  if( ob
f8f0: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
f900: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
f910: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
f920: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
f930: 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
f940: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
f950: 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
f960: 44 42 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20  DB STMT", 0);.  
f970: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
f980: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
f990: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
f9a0: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
f9b0: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
f9c0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
f9d0: 52 4f 52 3b 0a 20 20 69 66 28 20 67 65 74 53 74  ROR;.  if( getSt
f9e0: 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
f9f0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
fa00: 6f 62 6a 76 5b 32 5d 29 2c 20 26 70 53 74 6d 74  objv[2]), &pStmt
fa10: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
fa20: 52 52 4f 52 3b 0a 20 20 70 53 74 6d 74 20 3d 20  RROR;.  pStmt = 
fa30: 73 71 6c 69 74 65 33 5f 6e 65 78 74 5f 73 74 6d  sqlite3_next_stm
fa40: 74 28 64 62 2c 20 70 53 74 6d 74 29 3b 0a 20 20  t(db, pStmt);.  
fa50: 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20  if( pStmt ){.   
fa60: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
fa70: 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69  MakePointerStr(i
fa80: 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74  nterp, zBuf, pSt
fa90: 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
faa0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f  _ERROR;.    Tcl_
fab0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
fac0: 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  erp, zBuf, 0);. 
fad0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
fae0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
faf0: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ge:  sqlite3_stm
fb00: 74 5f 72 65 61 64 6f 6e 6c 79 20 20 53 54 4d 54  t_readonly  STMT
fb10: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  .**.** Return tr
fb20: 75 65 20 69 66 20 53 54 4d 54 20 69 73 20 61 20  ue if STMT is a 
fb30: 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 6f 72 20  NULL pointer or 
fb40: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
fb50: 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 68 61 74  tatement.** that
fb60: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
fb70: 6f 20 6c 65 61 76 65 20 74 68 65 20 64 61 74 61  o leave the data
fb80: 62 61 73 65 20 75 6e 6d 6f 64 69 66 69 65 64 2e  base unmodified.
fb90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
fba0: 65 73 74 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c  est_stmt_readonl
fbb0: 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  y(.  void * clie
fbc0: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
fbd0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
fbe0: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
fbf0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
fc00: 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
fc10: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
fc20: 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
fc30: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
fc40: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
fc50: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
fc60: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
fc70: 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
fc80: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
fc90: 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53  objv[0], 0), " S
fca0: 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  TMT", 0);.    re
fcb0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
fcc0: 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
fcd0: 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
fce0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
fcf0: 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
fd00: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
fd10: 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
fd20: 69 74 65 33 5f 73 74 6d 74 5f 72 65 61 64 6f 6e  ite3_stmt_readon
fd30: 6c 79 28 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c  ly(pStmt);.  Tcl
fd40: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
fd50: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f  terp, Tcl_NewBoo
fd60: 6c 65 61 6e 4f 62 6a 28 72 63 29 29 3b 0a 20 20  leanObj(rc));.  
fd70: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
fd80: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
fd90: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75 73  sqlite3_stmt_bus
fda0: 79 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65  y  STMT.**.** Re
fdb0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 53 54 4d  turn true if STM
fdc0: 54 20 69 73 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20  T is a non-NULL 
fdd0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 61  pointer to a sta
fde0: 74 65 6d 65 6e 74 0a 2a 2a 20 74 68 61 74 20 68  tement.** that h
fdf0: 61 73 20 62 65 65 6e 20 73 74 65 70 70 65 64 20  as been stepped 
fe00: 62 75 74 20 6e 6f 74 20 74 6f 20 63 6f 6d 70 6c  but not to compl
fe10: 65 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  etion..*/.static
fe20: 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 62   int test_stmt_b
fe30: 75 73 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  usy(.  void * cl
fe40: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
fe50: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
fe60: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
fe70: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
fe80: 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
fe90: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
fea0: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
feb0: 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
fec0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
fed0: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
fee0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
fef0: 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
ff00: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
ff10: 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
ff20: 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20   STMT", 0);.    
ff30: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
ff40: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
ff50: 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
ff60: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
ff70: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
ff80: 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
ff90: 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
ffa0: 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75 73 79  qlite3_stmt_busy
ffb0: 28 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53  (pStmt);.  Tcl_S
ffc0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
ffd0: 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65  rp, Tcl_NewBoole
ffe0: 61 6e 4f 62 6a 28 72 63 29 29 3b 0a 20 20 72 65  anObj(rc));.  re
fff0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
10000 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 75 73  /*.** Usage:  us
10010 65 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 20  es_stmt_journal 
10020 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75   STMT.**.** Retu
10030 72 6e 20 74 72 75 65 20 69 66 20 53 54 4d 54 20  rn true if STMT 
10040 75 73 65 73 20 61 20 73 74 61 74 65 6d 65 6e 74  uses a statement
10050 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61   journal..*/.sta
10060 74 69 63 20 69 6e 74 20 75 73 65 73 5f 73 74 6d  tic int uses_stm
10070 74 5f 6a 6f 75 72 6e 61 6c 28 0a 20 20 76 6f 69  t_journal(.  voi
10080 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
10090 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
100a0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
100b0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
100c0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
100d0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
100e0 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  mt;..  if( objc!
100f0 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
10100 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
10110 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
10120 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
10130 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
10140 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
10150 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d  jv[0], 0), " STM
10160 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  T", 0);.    retu
10170 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10180 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
10190 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
101a0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
101b0 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
101c0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
101d0 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  OR;.  sqlite3_st
101e0 6d 74 5f 72 65 61 64 6f 6e 6c 79 28 70 53 74 6d  mt_readonly(pStm
101f0 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  t);.  Tcl_SetObj
10200 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
10210 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a  cl_NewBooleanObj
10220 28 28 28 56 64 62 65 20 2a 29 70 53 74 6d 74 29  (((Vdbe *)pStmt)
10230 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61  ->usesStmtJourna
10240 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  l));.  return TC
10250 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
10260 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
10270 72 65 73 65 74 20 20 53 54 4d 54 20 0a 2a 2a 0a  reset  STMT .**.
10280 2a 2a 20 52 65 73 65 74 20 61 20 73 74 61 74 65  ** Reset a state
10290 6d 65 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  ment handle..*/.
102a0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
102b0 72 65 73 65 74 28 0a 20 20 76 6f 69 64 20 2a 20  reset(.  void * 
102c0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
102d0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
102e0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
102f0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
10300 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
10310 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
10320 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
10330 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
10340 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
10350 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
10360 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
10370 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
10380 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
10390 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
103a0 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30 29 3b 0a   " <STMT>", 0);.
103b0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
103c0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
103d0 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
103e0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
103f0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
10400 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
10410 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
10420 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
10430 74 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20  t(pStmt);.  if( 
10440 70 53 74 6d 74 20 26 26 20 73 71 6c 69 74 65 33  pStmt && sqlite3
10450 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
10460 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74  rp, StmtToDb(pSt
10470 6d 74 29 2c 20 72 63 29 20 29 7b 0a 20 20 20 20  mt), rc) ){.    
10480 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10490 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 52  ;.  }.  Tcl_SetR
104a0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
104b0 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
104c0 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
104d0 43 29 3b 0a 2f 2a 0a 20 20 69 66 28 20 72 63 20  C);./*.  if( rc 
104e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
104f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 2a 2f 0a  L_ERROR;.  }.*/.
10500 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
10510 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
10520 20 20 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65    sqlite3_expire
10530 64 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65  d STMT .**.** Re
10540 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 20 72  turn TRUE if a r
10550 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20  ecompilation of 
10560 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
10570 20 72 65 63 6f 6d 6d 65 6e 64 65 64 2e 0a 2a 2f   recommended..*/
10580 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
10590 5f 65 78 70 69 72 65 64 28 0a 20 20 76 6f 69 64  _expired(.  void
105a0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
105b0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
105c0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
105d0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
105e0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e  T objv[].){.#ifn
105f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10600 44 45 50 52 45 43 41 54 45 44 0a 20 20 73 71 6c  DEPRECATED.  sql
10610 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
10620 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ;.  if( objc!=2 
10630 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
10640 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
10650 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
10660 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
10670 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
10680 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
10690 30 5d 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54 3e  0], 0), " <STMT>
106a0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
106b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
106c0 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
106d0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
106e0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
106f0 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
10700 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10710 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
10720 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
10730 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 73  _NewBooleanObj(s
10740 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64 28 70  qlite3_expired(p
10750 53 74 6d 74 29 29 29 3b 0a 23 65 6e 64 69 66 0a  Stmt)));.#endif.
10760 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
10770 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
10780 20 20 73 71 6c 69 74 65 33 5f 74 72 61 6e 73 66    sqlite3_transf
10790 65 72 5f 62 69 6e 64 69 6e 67 73 20 46 52 4f 4d  er_bindings FROM
107a0 53 54 4d 54 20 54 4f 53 54 4d 54 0a 2a 2a 0a 2a  STMT TOSTMT.**.*
107b0 2a 20 54 72 61 6e 73 66 65 72 20 61 6c 6c 20 62  * Transfer all b
107c0 69 6e 64 69 6e 67 73 20 66 72 6f 6d 20 46 52 4f  indings from FRO
107d0 4d 53 54 4d 54 20 6f 76 65 72 20 74 6f 20 54 4f  MSTMT over to TO
107e0 53 54 4d 54 0a 2a 2f 0a 73 74 61 74 69 63 20 69  STMT.*/.static i
107f0 6e 74 20 74 65 73 74 5f 74 72 61 6e 73 66 65 72  nt test_transfer
10800 5f 62 69 6e 64 28 0a 20 20 76 6f 69 64 20 2a 20  _bind(.  void * 
10810 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
10820 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
10830 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
10840 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
10850 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66  bjv[].){.#ifndef
10860 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
10870 52 45 43 41 54 45 44 0a 20 20 73 71 6c 69 74 65  RECATED.  sqlite
10880 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 31 2c 20  3_stmt *pStmt1, 
10890 2a 70 53 74 6d 74 32 3b 0a 20 20 69 66 28 20 6f  *pStmt2;.  if( o
108a0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
108b0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
108c0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
108d0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
108e0 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
108f0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
10900 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
10910 20 46 52 4f 4d 2d 53 54 4d 54 20 54 4f 2d 53 54   FROM-STMT TO-ST
10920 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  MT", 0);.    ret
10930 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10940 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74   }.  if( getStmt
10950 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
10960 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
10970 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 31 29  jv[1]), &pStmt1)
10980 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
10990 4f 52 3b 0a 20 20 69 66 28 20 67 65 74 53 74 6d  OR;.  if( getStm
109a0 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
109b0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
109c0 62 6a 76 5b 32 5d 29 2c 20 26 70 53 74 6d 74 32  bjv[2]), &pStmt2
109d0 29 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  )) return TCL_ER
109e0 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ROR;.  Tcl_SetOb
109f0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
10a00 0a 20 20 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74  .     Tcl_NewInt
10a10 4f 62 6a 28 73 71 6c 69 74 65 33 5f 74 72 61 6e  Obj(sqlite3_tran
10a20 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 28 70 53  sfer_bindings(pS
10a30 74 6d 74 31 2c 70 53 74 6d 74 32 29 29 29 3b 0a  tmt1,pStmt2)));.
10a40 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
10a50 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
10a60 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
10a70 5f 63 68 61 6e 67 65 73 20 44 42 0a 2a 2a 0a 2a  _changes DB.**.*
10a80 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
10a90 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 6d  ber of changes m
10aa0 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  ade to the datab
10ab0 61 73 65 20 62 79 20 74 68 65 20 6c 61 73 74 20  ase by the last 
10ac0 53 51 4c 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e  SQL.** execution
10ad0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10ae0 74 65 73 74 5f 63 68 61 6e 67 65 73 28 0a 20 20  test_changes(.  
10af0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
10b00 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
10b10 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
10b20 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
10b30 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
10b40 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
10b50 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
10b60 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
10b70 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
10b80 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
10b90 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
10ba0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
10bb0 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c  objv[0]), " DB",
10bc0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
10bd0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
10be0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
10bf0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
10c00 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
10c10 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
10c20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c  TCL_ERROR;.  Tcl
10c30 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
10c40 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
10c50 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 68 61 6e  Obj(sqlite3_chan
10c60 67 65 73 28 64 62 29 29 29 3b 0a 20 20 72 65 74  ges(db)));.  ret
10c70 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
10c80 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
10c90 20 22 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61   "static_bind_va
10ca0 6c 75 65 22 20 74 68 61 74 20 76 61 72 69 61 62  lue" that variab
10cb0 6c 65 73 20 61 72 65 20 62 6f 75 6e 64 20 74 6f  les are bound to
10cc0 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 46 4c 41   when.** the FLA
10cd0 47 20 6f 70 74 69 6f 6e 20 6f 66 20 73 71 6c 69  G option of sqli
10ce0 74 65 33 5f 62 69 6e 64 20 69 73 20 22 73 74 61  te3_bind is "sta
10cf0 74 69 63 22 0a 2a 2f 0a 73 74 61 74 69 63 20 63  tic".*/.static c
10d00 68 61 72 20 2a 73 71 6c 69 74 65 5f 73 74 61 74  har *sqlite_stat
10d10 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 20 3d 20  ic_bind_value = 
10d20 30 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  0;.static int sq
10d30 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64  lite_static_bind
10d40 5f 6e 62 79 74 65 20 3d 20 30 3b 0a 0a 2f 2a 0a  _nbyte = 0;../*.
10d50 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
10d60 65 33 5f 62 69 6e 64 20 20 56 4d 20 20 49 44 58  e3_bind  VM  IDX
10d70 20 20 56 41 4c 55 45 20 20 46 4c 41 47 53 0a 2a    VALUE  FLAGS.*
10d80 2a 0a 2a 2a 20 53 65 74 73 20 74 68 65 20 76 61  *.** Sets the va
10d90 6c 75 65 20 6f 66 20 74 68 65 20 49 44 58 2d 74  lue of the IDX-t
10da0 68 20 6f 63 63 75 72 72 65 6e 63 65 20 6f 66 20  h occurrence of 
10db0 22 3f 22 20 69 6e 20 74 68 65 20 6f 72 69 67 69  "?" in the origi
10dc0 6e 61 6c 20 53 51 4c 0a 2a 2a 20 73 74 72 69 6e  nal SQL.** strin
10dd0 67 2e 20 20 56 41 4c 55 45 20 69 73 20 74 68 65  g.  VALUE is the
10de0 20 6e 65 77 20 76 61 6c 75 65 2e 20 20 49 66 20   new value.  If 
10df0 46 4c 41 47 53 3d 3d 22 6e 75 6c 6c 22 20 74 68  FLAGS=="null" th
10e00 65 6e 20 56 41 4c 55 45 20 69 73 0a 2a 2a 20 69  en VALUE is.** i
10e10 67 6e 6f 72 65 64 20 61 6e 64 20 74 68 65 20 76  gnored and the v
10e20 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20 4e  alue is set to N
10e30 55 4c 4c 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d  ULL.  If FLAGS==
10e40 22 73 74 61 74 69 63 22 20 74 68 65 6e 0a 2a 2a  "static" then.**
10e50 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 73 65   the value is se
10e60 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 6f  t to the value o
10e70 66 20 61 20 73 74 61 74 69 63 20 76 61 72 69 61  f a static varia
10e80 62 6c 65 20 6e 61 6d 65 64 0a 2a 2a 20 22 73 71  ble named.** "sq
10e90 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64  lite_static_bind
10ea0 5f 76 61 6c 75 65 22 2e 20 20 49 66 20 46 4c 41  _value".  If FLA
10eb0 47 53 3d 3d 22 6e 6f 72 6d 61 6c 22 20 74 68 65  GS=="normal" the
10ec0 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 74  n a copy.** of t
10ed0 68 65 20 56 41 4c 55 45 20 69 73 20 6d 61 64 65  he VALUE is made
10ee0 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d 22 62 6c  .  If FLAGS=="bl
10ef0 6f 62 31 30 22 20 74 68 65 6e 20 61 20 56 41 4c  ob10" then a VAL
10f00 55 45 20 69 73 20 69 67 6e 6f 72 65 64 0a 2a 2a  UE is ignored.**
10f10 20 61 6e 20 61 20 31 30 2d 62 79 74 65 20 62 6c   an a 10-byte bl
10f20 6f 62 20 22 61 62 63 5c 30 30 30 78 79 7a 5c 30  ob "abc\000xyz\0
10f30 30 30 70 71 22 20 69 73 20 69 6e 73 65 72 74 65  00pq" is inserte
10f40 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
10f50 20 74 65 73 74 5f 62 69 6e 64 28 0a 20 20 76 6f   test_bind(.  vo
10f60 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
10f70 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
10f80 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
10f90 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
10fa0 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
10fb0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
10fc0 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
10fd0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
10fe0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
10ff0 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
11000 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
11010 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
11020 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  /.){.  sqlite3_s
11030 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
11040 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b  t rc;.  int idx;
11050 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35 20 29  .  if( argc!=5 )
11060 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
11070 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
11080 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
11090 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
110a0 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20  v[0], .       " 
110b0 56 4d 20 49 44 58 20 56 41 4c 55 45 20 28 6e 75  VM IDX VALUE (nu
110c0 6c 6c 7c 73 74 61 74 69 63 7c 6e 6f 72 6d 61 6c  ll|static|normal
110d0 29 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  )\"", 0);.    re
110e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
110f0 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d    }.  if( getStm
11100 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
11110 20 61 72 67 76 5b 31 5d 2c 20 26 70 53 74 6d 74   argv[1], &pStmt
11120 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
11130 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
11140 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
11150 72 67 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  rgv[2], &idx) ) 
11160 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11170 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 61  ;.  if( strcmp(a
11180 72 67 76 5b 34 5d 2c 22 6e 75 6c 6c 22 29 3d 3d  rgv[4],"null")==
11190 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 ){.    rc = sq
111a0 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28  lite3_bind_null(
111b0 70 53 74 6d 74 2c 20 69 64 78 29 3b 0a 20 20 7d  pStmt, idx);.  }
111c0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
111d0 61 72 67 76 5b 34 5d 2c 22 73 74 61 74 69 63 22  argv[4],"static"
111e0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
111f0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
11200 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 73  xt(pStmt, idx, s
11210 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e  qlite_static_bin
11220 64 5f 76 61 6c 75 65 2c 20 2d 31 2c 20 30 29 3b  d_value, -1, 0);
11230 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
11240 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 73 74 61  cmp(argv[4],"sta
11250 74 69 63 2d 6e 62 79 74 65 73 22 29 3d 3d 30 20  tic-nbytes")==0 
11260 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
11270 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
11280 74 6d 74 2c 20 69 64 78 2c 20 73 71 6c 69 74 65  tmt, idx, sqlite
11290 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c  _static_bind_val
112a0 75 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue,.            
112b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112c0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
112d0 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62  e_static_bind_nb
112e0 79 74 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  yte, 0);.  }else
112f0 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
11300 5b 34 5d 2c 22 6e 6f 72 6d 61 6c 22 29 3d 3d 30  [4],"normal")==0
11310 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
11320 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
11330 53 74 6d 74 2c 20 69 64 78 2c 20 61 72 67 76 5b  Stmt, idx, argv[
11340 33 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54  3], -1, SQLITE_T
11350 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c  RANSIENT);.  }el
11360 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72  se if( strcmp(ar
11370 67 76 5b 34 5d 2c 22 62 6c 6f 62 31 30 22 29 3d  gv[4],"blob10")=
11380 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
11390 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
113a0 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 22 61 62  (pStmt, idx, "ab
113b0 63 5c 30 30 30 78 79 7a 5c 30 30 30 70 71 22 2c  c\000xyz\000pq",
113c0 20 31 30 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   10, SQLITE_STAT
113d0 49 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  IC);.  }else{.  
113e0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
113f0 6c 74 28 69 6e 74 65 72 70 2c 20 22 34 74 68 20  lt(interp, "4th 
11400 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20  argument should 
11410 62 65 20 22 0a 20 20 20 20 20 20 20 20 22 5c 22  be ".        "\"
11420 6e 75 6c 6c 5c 22 20 6f 72 20 5c 22 73 74 61 74  null\" or \"stat
11430 69 63 5c 22 20 6f 72 20 5c 22 6e 6f 72 6d 61 6c  ic\" or \"normal
11440 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
11450 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
11460 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
11470 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
11480 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74  rp, StmtToDb(pSt
11490 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72  mt), rc) ) retur
114a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
114b0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 63 68 61  f( rc ){.    cha
114c0 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 20 20  r zBuf[50];.    
114d0 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 28  sprintf(zBuf, "(
114e0 25 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20  %d) ", rc);.    
114f0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
11500 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73  (interp, zBuf, s
11510 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29  qlite3ErrStr(rc)
11520 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
11530 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
11540 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
11550 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
11560 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
11570 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64 64 5f 74  .** Usage: add_t
11580 65 73 74 5f 63 6f 6c 6c 61 74 65 20 3c 64 62 20  est_collate <db 
11590 70 74 72 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66  ptr> <utf8> <utf
115a0 31 36 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 0a  16le> <utf16be>.
115b0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
115c0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 74  ion is used to t
115d0 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20  est that SQLite 
115e0 73 65 6c 65 63 74 73 20 74 68 65 20 63 6f 72 72  selects the corr
115f0 65 63 74 20 63 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a  ect collation.**
11600 20 73 65 71 75 65 6e 63 65 20 63 61 6c 6c 62 61   sequence callba
11610 63 6b 20 77 68 65 6e 20 6d 75 6c 74 69 70 6c 65  ck when multiple
11620 20 76 65 72 73 69 6f 6e 73 20 28 66 6f 72 20 64   versions (for d
11630 69 66 66 65 72 65 6e 74 20 74 65 78 74 20 65 6e  ifferent text en
11640 63 6f 64 69 6e 67 73 29 0a 2a 2a 20 61 72 65 20  codings).** are 
11650 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  available..**.**
11660 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   Calling this ro
11670 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 20  utine registers 
11680 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
11690 71 75 65 6e 63 65 20 22 74 65 73 74 5f 63 6f 6c  quence "test_col
116a0 6c 61 74 65 22 0a 2a 2a 20 77 69 74 68 20 64 61  late".** with da
116b0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 64  tabase handle <d
116c0 62 3e 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  b>. The second a
116d0 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20  rgument must be 
116e0 61 20 6c 69 73 74 20 6f 66 20 74 68 72 65 65 0a  a list of three.
116f0 2a 2a 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65  ** boolean value
11700 73 2e 20 49 66 20 74 68 65 20 66 69 72 73 74 20  s. If the first 
11710 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 20  is true, then a 
11720 76 65 72 73 69 6f 6e 20 6f 66 20 74 65 73 74 5f  version of test_
11730 63 6f 6c 6c 61 74 65 20 69 73 0a 2a 2a 20 72 65  collate is.** re
11740 67 69 73 74 65 72 65 64 20 66 6f 72 20 55 54 46  gistered for UTF
11750 2d 38 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e  -8, if the secon
11760 64 20 69 73 20 74 72 75 65 2c 20 61 20 76 65 72  d is true, a ver
11770 73 69 6f 6e 20 69 73 20 72 65 67 69 73 74 65 72  sion is register
11780 65 64 20 66 6f 72 0a 2a 2a 20 55 54 46 2d 31 36  ed for.** UTF-16
11790 6c 65 2c 20 69 66 20 74 68 65 20 74 68 69 72 64  le, if the third
117a0 20 69 73 20 74 72 75 65 2c 20 61 20 55 54 46 2d   is true, a UTF-
117b0 31 36 62 65 20 76 65 72 73 69 6f 6e 20 69 73 20  16be version is 
117c0 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 20 50 72  available..** Pr
117d0 65 76 69 6f 75 73 20 76 65 72 73 69 6f 6e 73 20  evious versions 
117e0 6f 66 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20  of test_collate 
117f0 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a  are deleted..**.
11800 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ** The collation
11810 20 73 65 71 75 65 6e 63 65 20 74 65 73 74 5f 63   sequence test_c
11820 6f 6c 6c 61 74 65 20 69 73 20 69 6d 70 6c 65 6d  ollate is implem
11830 65 6e 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67  ented by calling
11840 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   the.** followin
11850 67 20 54 43 4c 20 73 63 72 69 70 74 3a 0a 2a 2a  g TCL script:.**
11860 0a 2a 2a 20 20 20 22 74 65 73 74 5f 63 6f 6c 6c  .**   "test_coll
11870 61 74 65 20 3c 65 6e 63 3e 20 3c 6c 68 73 3e 20  ate <enc> <lhs> 
11880 3c 72 68 73 3e 22 0a 2a 2a 0a 2a 2a 20 54 68 65  <rhs>".**.** The
11890 20 3c 6c 68 73 3e 20 61 6e 64 20 3c 72 68 73 3e   <lhs> and <rhs>
118a0 20 61 72 65 20 74 68 65 20 74 77 6f 20 76 61 6c   are the two val
118b0 75 65 73 20 62 65 69 6e 67 20 63 6f 6d 70 61 72  ues being compar
118c0 65 64 2c 20 65 6e 63 6f 64 65 64 20 69 6e 20 55  ed, encoded in U
118d0 54 46 2d 38 2e 0a 2a 2a 20 54 68 65 20 3c 65 6e  TF-8..** The <en
118e0 63 3e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  c> parameter is 
118f0 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  the encoding of 
11900 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  the collation fu
11910 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 53  nction that.** S
11920 51 4c 69 74 65 20 73 65 6c 65 63 74 65 64 20 74  QLite selected t
11930 6f 20 63 61 6c 6c 2e 20 54 68 65 20 54 43 4c 20  o call. The TCL 
11940 74 65 73 74 20 73 63 72 69 70 74 20 69 6d 70 6c  test script impl
11950 65 6d 65 6e 74 73 20 74 68 65 0a 2a 2a 20 22 74  ements the.** "t
11960 65 73 74 5f 63 6f 6c 6c 61 74 65 22 20 70 72 6f  est_collate" pro
11970 63 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  c..**.** Note th
11980 61 74 20 74 68 69 73 20 77 69 6c 6c 20 6f 6e 6c  at this will onl
11990 79 20 77 6f 72 6b 20 77 69 74 68 20 6f 6e 65 20  y work with one 
119a0 69 6e 74 65 72 70 72 65 74 65 72 20 61 74 20 61  interpreter at a
119b0 20 74 69 6d 65 2c 20 61 73 20 74 68 65 0a 2a 2a   time, as the.**
119c0 20 69 6e 74 65 72 70 20 70 6f 69 6e 74 65 72 20   interp pointer 
119d0 74 6f 20 75 73 65 20 77 68 65 6e 20 65 76 61 6c  to use when eval
119e0 75 61 74 69 6e 67 20 74 68 65 20 54 43 4c 20 73  uating the TCL s
119f0 63 72 69 70 74 20 69 73 20 73 74 6f 72 65 64 20  cript is stored 
11a00 69 6e 0a 2a 2a 20 70 54 65 73 74 43 6f 6c 6c 61  in.** pTestColla
11a10 74 65 49 6e 74 65 72 70 2e 0a 2a 2f 0a 73 74 61  teInterp..*/.sta
11a20 74 69 63 20 54 63 6c 5f 49 6e 74 65 72 70 2a 20  tic Tcl_Interp* 
11a30 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65  pTestCollateInte
11a40 72 70 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 74  rp;.static int t
11a50 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63  est_collate_func
11a60 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20  (.  void *pCtx, 
11a70 0a 20 20 69 6e 74 20 6e 41 2c 20 63 6f 6e 73 74  .  int nA, const
11a80 20 76 6f 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74   void *zA,.  int
11a90 20 6e 42 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20   nB, const void 
11aa0 2a 7a 42 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74  *zB.){.  Tcl_Int
11ab0 65 72 70 20 2a 69 20 3d 20 70 54 65 73 74 43 6f  erp *i = pTestCo
11ac0 6c 6c 61 74 65 49 6e 74 65 72 70 3b 0a 20 20 69  llateInterp;.  i
11ad0 6e 74 20 65 6e 63 69 6e 20 3d 20 53 51 4c 49 54  nt encin = SQLIT
11ae0 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 43 74  E_PTR_TO_INT(pCt
11af0 78 29 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  x);.  int res;. 
11b00 20 69 6e 74 20 6e 3b 0a 0a 20 20 73 71 6c 69 74   int n;..  sqlit
11b10 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
11b20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 0a    Tcl_Obj *pX;..
11b30 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74    pX = Tcl_NewSt
11b40 72 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f 63 6f  ringObj("test_co
11b50 6c 6c 61 74 65 22 2c 20 2d 31 29 3b 0a 20 20 54  llate", -1);.  T
11b60 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
11b70 70 58 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  pX);..  switch( 
11b80 65 6e 63 69 6e 20 29 7b 0a 20 20 20 20 63 61 73  encin ){.    cas
11b90 65 20 53 51 4c 49 54 45 5f 55 54 46 38 3a 0a 20  e SQLITE_UTF8:. 
11ba0 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a       Tcl_ListObj
11bb0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c  AppendElement(i,
11bc0 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  pX,Tcl_NewString
11bd0 4f 62 6a 28 22 55 54 46 2d 38 22 2c 2d 31 29 29  Obj("UTF-8",-1))
11be0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
11bf0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55     case SQLITE_U
11c00 54 46 31 36 4c 45 3a 0a 20 20 20 20 20 20 54 63  TF16LE:.      Tc
11c10 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
11c20 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f  lement(i,pX,Tcl_
11c30 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54  NewStringObj("UT
11c40 46 2d 31 36 4c 45 22 2c 2d 31 29 29 3b 0a 20 20  F-16LE",-1));.  
11c50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
11c60 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46 31 36  ase SQLITE_UTF16
11c70 42 45 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69  BE:.      Tcl_Li
11c80 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
11c90 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53  nt(i,pX,Tcl_NewS
11ca0 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36  tringObj("UTF-16
11cb0 42 45 22 2c 2d 31 29 29 3b 0a 20 20 20 20 20 20  BE",-1));.      
11cc0 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
11cd0 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  lt:.      assert
11ce0 28 30 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  (0);.  }..  sqli
11cf0 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
11d00 6c 6c 6f 63 28 29 3b 0a 20 20 70 56 61 6c 20 3d  lloc();.  pVal =
11d10 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
11d20 28 30 29 3b 0a 20 20 69 66 28 20 70 56 61 6c 20  (0);.  if( pVal 
11d30 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  ){.    sqlite3Va
11d40 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20  lueSetStr(pVal, 
11d50 6e 41 2c 20 7a 41 2c 20 65 6e 63 69 6e 2c 20 53  nA, zA, encin, S
11d60 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
11d70 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76     n = sqlite3_v
11d80 61 6c 75 65 5f 62 79 74 65 73 28 70 56 61 6c 29  alue_bytes(pVal)
11d90 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
11da0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
11db0 2c 70 58 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  ,pX,.        Tcl
11dc0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
11dd0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
11de0 75 65 5f 74 65 78 74 28 70 56 61 6c 29 2c 6e 29  ue_text(pVal),n)
11df0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  );.    sqlite3Va
11e00 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20  lueSetStr(pVal, 
11e10 6e 42 2c 20 7a 42 2c 20 65 6e 63 69 6e 2c 20 53  nB, zB, encin, S
11e20 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
11e30 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76     n = sqlite3_v
11e40 61 6c 75 65 5f 62 79 74 65 73 28 70 56 61 6c 29  alue_bytes(pVal)
11e50 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
11e60 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
11e70 2c 70 58 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  ,pX,.        Tcl
11e80 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
11e90 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
11ea0 75 65 5f 74 65 78 74 28 70 56 61 6c 29 2c 6e 29  ue_text(pVal),n)
11eb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  );.    sqlite3Va
11ec0 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20  lueFree(pVal);. 
11ed0 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42   }.  sqlite3EndB
11ee0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a  enignMalloc();..
11ef0 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28    Tcl_EvalObjEx(
11f00 69 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c  i, pX, 0);.  Tcl
11f10 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58  _DecrRefCount(pX
11f20 29 3b 0a 20 20 54 63 6c 5f 47 65 74 49 6e 74 46  );.  Tcl_GetIntF
11f30 72 6f 6d 4f 62 6a 28 69 2c 20 54 63 6c 5f 47 65  romObj(i, Tcl_Ge
11f40 74 4f 62 6a 52 65 73 75 6c 74 28 69 29 2c 20 26  tObjResult(i), &
11f50 72 65 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  res);.  return r
11f60 65 73 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  es;.}.static int
11f70 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 28 0a 20   test_collate(. 
11f80 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
11f90 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
11fa0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
11fb0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
11fc0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
11fd0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
11fe0 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20 73 71 6c    int val;.  sql
11ff0 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
12000 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
12010 66 28 20 6f 62 6a 63 21 3d 35 20 29 20 67 6f 74  f( objc!=5 ) got
12020 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 70 54  o bad_args;.  pT
12030 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70  estCollateInterp
12040 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 69 66 28   = interp;.  if(
12050 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
12060 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
12070 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
12080 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
12090 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20 54 43  ERROR;..  if( TC
120a0 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f  L_OK!=Tcl_GetBoo
120b0 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
120c0 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61  rp, objv[2], &va
120d0 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
120e0 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
120f0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
12100 6c 61 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74  lation(db, "test
12110 5f 63 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54  _collate", SQLIT
12120 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20 20  E_UTF8, .       
12130 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c 49 54     (void *)SQLIT
12140 45 5f 55 54 46 38 2c 20 76 61 6c 3f 74 65 73 74  E_UTF8, val?test
12150 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29  _collate_func:0)
12160 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
12170 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e  TE_OK ){.    con
12180 73 74 20 76 6f 69 64 20 2a 7a 55 74 66 31 36 3b  st void *zUtf16;
12190 0a 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21  .    if( TCL_OK!
121a0 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46  =Tcl_GetBooleanF
121b0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
121c0 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20  bjv[3], &val) ) 
121d0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
121e0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
121f0 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
12200 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 63 6f  ion(db, "test_co
12210 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 55  llate", SQLITE_U
12220 54 46 31 36 4c 45 2c 20 0a 20 20 20 20 20 20 20  TF16LE, .       
12230 20 20 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c       (void *)SQL
12240 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 76 61 6c  ITE_UTF16LE, val
12250 3f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75  ?test_collate_fu
12260 6e 63 3a 30 29 3b 0a 20 20 20 20 69 66 28 20 54  nc:0);.    if( T
12270 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f  CL_OK!=Tcl_GetBo
12280 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
12290 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 76  erp, objv[4], &v
122a0 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  al) ) return TCL
122b0 5f 45 52 52 4f 52 3b 0a 0a 23 69 66 20 30 0a 20  _ERROR;..#if 0. 
122c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69     if( sqlite3_i
122d0 4d 61 6c 6c 6f 63 46 61 69 6c 3e 30 20 29 7b 0a  MallocFail>0 ){.
122e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 4d        sqlite3_iM
122f0 61 6c 6c 6f 63 46 61 69 6c 2b 2b 3b 0a 20 20 20  allocFail++;.   
12300 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71   }.#endif.    sq
12310 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
12320 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
12330 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
12340 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20 20  ValueNew(db);.  
12350 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
12360 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 22  tStr(pVal, -1, "
12370 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53  test_collate", S
12380 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
12390 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
123a0 7a 55 74 66 31 36 20 3d 20 73 71 6c 69 74 65 33  zUtf16 = sqlite3
123b0 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20  ValueText(pVal, 
123c0 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
123d0 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  VE);.    if( db-
123e0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
123f0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
12400 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
12410 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
12420 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
12430 6f 6c 6c 61 74 69 6f 6e 31 36 28 64 62 2c 20 7a  ollation16(db, z
12440 55 74 66 31 36 2c 20 53 51 4c 49 54 45 5f 55 54  Utf16, SQLITE_UT
12450 46 31 36 42 45 2c 20 0a 20 20 20 20 20 20 20 20  F16BE, .        
12460 20 20 28 76 6f 69 64 20 2a 29 53 51 4c 49 54 45    (void *)SQLITE
12470 5f 55 54 46 31 36 42 45 2c 20 76 61 6c 3f 74 65  _UTF16BE, val?te
12480 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a  st_collate_func:
12490 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  0);.    }.    sq
124a0 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
124b0 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Val);.    sqlite
124c0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
124d0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20  ->mutex);.  }.  
124e0 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
124f0 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
12500 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
12510 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 0a 20 20  TCL_ERROR;.  .  
12520 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12530 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  K ){.    Tcl_App
12540 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
12550 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
12560 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (rc), 0);.    re
12570 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12580 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
12590 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67 73 3a 0a  _OK;..bad_args:.
125a0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
125b0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
125c0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
125d0 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 54   be \"",.      T
125e0 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
125f0 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
12600 20 22 20 3c 44 42 3e 20 3c 75 74 66 38 3e 20 3c   " <DB> <utf8> <
12610 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36 62  utf16le> <utf16b
12620 65 3e 22 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  e>", 0);.  retur
12630 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  n TCL_ERROR;.}..
12640 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64 64  /*.** Usage: add
12650 5f 74 65 73 74 5f 75 74 66 31 36 62 69 6e 5f 63  _test_utf16bin_c
12660 6f 6c 6c 61 74 65 20 3c 64 62 20 70 74 72 3e 0a  ollate <db ptr>.
12670 2a 2a 0a 2a 2a 20 41 64 64 20 61 20 75 74 66 2d  **.** Add a utf-
12680 31 36 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  16 collation seq
12690 75 65 6e 63 65 20 6e 61 6d 65 64 20 22 75 74 66  uence named "utf
126a0 31 36 62 69 6e 22 20 74 6f 20 74 68 65 20 64 61  16bin" to the da
126b0 74 61 62 61 73 65 0a 2a 2a 20 68 61 6e 64 6c 65  tabase.** handle
126c0 2e 20 54 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e  . This collation
126d0 20 73 65 71 75 65 6e 63 65 20 63 6f 6d 70 61 72   sequence compar
126e0 65 73 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20  es arguments in 
126f0 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73 20  the same way as 
12700 74 68 65 0a 2a 2a 20 62 75 69 6c 74 2d 69 6e 20  the.** built-in 
12710 63 6f 6c 6c 61 74 69 6f 6e 20 22 62 69 6e 61 72  collation "binar
12720 79 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  y"..*/.static in
12730 74 20 74 65 73 74 5f 75 74 66 31 36 62 69 6e 5f  t test_utf16bin_
12740 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 28 0a 20 20  collate_func(.  
12750 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 69  void *pCtx, .  i
12760 6e 74 20 6e 41 2c 20 63 6f 6e 73 74 20 76 6f 69  nt nA, const voi
12770 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42 2c  d *zA,.  int nB,
12780 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 0a   const void *zB.
12790 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20  ){.  int nCmp = 
127a0 28 6e 41 3e 6e 42 20 3f 20 6e 42 20 3a 20 6e 41  (nA>nB ? nB : nA
127b0 29 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 6d  );.  int res = m
127c0 65 6d 63 6d 70 28 7a 41 2c 20 7a 42 2c 20 6e 43  emcmp(zA, zB, nC
127d0 6d 70 29 3b 0a 20 20 69 66 28 20 72 65 73 3d 3d  mp);.  if( res==
127e0 30 20 29 20 72 65 73 20 3d 20 6e 41 20 2d 20 6e  0 ) res = nA - n
127f0 42 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  B;.  return res;
12800 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  .}.static int te
12810 73 74 5f 75 74 66 31 36 62 69 6e 5f 63 6f 6c 6c  st_utf16bin_coll
12820 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ate(.  void * cl
12830 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
12840 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
12850 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
12860 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
12870 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
12880 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
12890 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
128a0 20 67 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a   goto bad_args;.
128b0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
128c0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
128d0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
128e0 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
128f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
12900 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
12910 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  te_collation(db,
12920 20 22 75 74 66 31 36 62 69 6e 22 2c 20 53 51 4c   "utf16bin", SQL
12930 49 54 45 5f 55 54 46 31 36 2c 20 30 2c 20 0a 20  ITE_UTF16, 0, . 
12940 20 20 20 20 20 74 65 73 74 5f 75 74 66 31 36 62       test_utf16b
12950 69 6e 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 0a  in_collate_func.
12960 20 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74    );.  if( sqlit
12970 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
12980 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
12990 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
129a0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
129b0 4b 3b 0a 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20  K;..bad_args:.  
129c0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
129d0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
129e0 2c 20 22 44 42 22 29 3b 0a 20 20 72 65 74 75 72  , "DB");.  retur
129f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  n TCL_ERROR;.}..
12a00 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 63  /*.** When the c
12a10 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64 20  ollation needed 
12a20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f  callback is invo
12a30 6b 65 64 2c 20 72 65 63 6f 72 64 20 74 68 65 20  ked, record the 
12a40 6e 61 6d 65 20 6f 66 20 0a 2a 2a 20 74 68 65 20  name of .** the 
12a50 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74  requested collat
12a60 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 68 65 72  ing function her
12a70 65 2e 20 20 54 68 65 20 72 65 63 6f 72 64 65 64  e.  The recorded
12a80 20 6e 61 6d 65 20 69 73 20 6c 69 6e 6b 65 64 0a   name is linked.
12a90 2a 2a 20 74 6f 20 61 20 54 43 4c 20 76 61 72 69  ** to a TCL vari
12aa0 61 62 6c 65 20 61 6e 64 20 75 73 65 64 20 74 6f  able and used to
12ab0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
12ac0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
12ad0 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 6e 61 6d 65 20  llation.** name 
12ae0 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73  is correct..*/.s
12af0 74 61 74 69 63 20 63 68 61 72 20 7a 4e 65 65 64  tatic char zNeed
12b00 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 32 30 30 5d  edCollation[200]
12b10 3b 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 70  ;.static char *p
12b20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e  zNeededCollation
12b30 20 3d 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74   = zNeededCollat
12b40 69 6f 6e 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  ion;.../*.** Cal
12b50 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6c 6c 61  led when a colla
12b60 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  ting sequence is
12b70 20 6e 65 65 64 65 64 2e 20 20 52 65 67 69 73 74   needed.  Regist
12b80 65 72 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71  ered using.** sq
12b90 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  lite3_collation_
12ba0 6e 65 65 64 65 64 31 36 28 29 2e 0a 2a 2f 0a 73  needed16()..*/.s
12bb0 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f  tatic void test_
12bc0 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 5f 63  collate_needed_c
12bd0 62 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  b(.  void *pCtx,
12be0 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c   .  sqlite3 *db,
12bf0 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65 70 2c  .  int eTextRep,
12c00 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
12c10 4e 61 6d 65 0a 29 7b 0a 20 20 69 6e 74 20 65 6e  Name.){.  int en
12c20 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 69  c = ENC(db);.  i
12c30 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  nt i;.  char *z;
12c40 0a 20 20 66 6f 72 28 7a 20 3d 20 28 63 68 61 72  .  for(z = (char
12c50 2a 29 70 4e 61 6d 65 2c 20 69 3d 30 3b 20 2a 7a  *)pName, i=0; *z
12c60 20 7c 7c 20 7a 5b 31 5d 3b 20 7a 2b 2b 29 7b 0a   || z[1]; z++){.
12c70 20 20 20 20 69 66 28 20 2a 7a 20 29 20 7a 4e 65      if( *z ) zNe
12c80 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 69 2b  ededCollation[i+
12c90 2b 5d 20 3d 20 2a 7a 3b 0a 20 20 7d 0a 20 20 7a  +] = *z;.  }.  z
12ca0 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b  NeededCollation[
12cb0 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  i] = 0;.  sqlite
12cc0 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
12cd0 6f 6e 28 0a 20 20 20 20 20 20 64 62 2c 20 22 74  on(.      db, "t
12ce0 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 45 4e  est_collate", EN
12cf0 43 28 64 62 29 2c 20 53 51 4c 49 54 45 5f 49 4e  C(db), SQLITE_IN
12d00 54 5f 54 4f 5f 50 54 52 28 65 6e 63 29 2c 20 74  T_TO_PTR(enc), t
12d10 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63  est_collate_func
12d20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  );.}../*.** Usag
12d30 65 3a 20 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c  e: add_test_coll
12d40 61 74 65 5f 6e 65 65 64 65 64 20 44 42 0a 2a 2f  ate_needed DB.*/
12d50 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
12d60 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 28  _collate_needed(
12d70 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
12d80 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
12d90 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
12da0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
12db0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
12dc0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
12dd0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
12de0 66 28 20 6f 62 6a 63 21 3d 32 20 29 20 67 6f 74  f( objc!=2 ) got
12df0 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 69 66  o bad_args;.  if
12e00 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
12e10 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
12e20 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
12e30 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
12e40 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
12e50 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e  qlite3_collation
12e60 5f 6e 65 65 64 65 64 31 36 28 64 62 2c 20 30 2c  _needed16(db, 0,
12e70 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65   test_collate_ne
12e80 65 64 65 64 5f 63 62 29 3b 0a 20 20 7a 4e 65 65  eded_cb);.  zNee
12e90 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 30 5d 20  dedCollation[0] 
12ea0 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  = 0;.  if( sqlit
12eb0 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
12ec0 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
12ed0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12ee0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
12ef0 4b 3b 0a 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20  K;..bad_args:.  
12f00 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
12f10 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
12f20 2c 20 22 44 42 22 29 3b 0a 20 20 72 65 74 75 72  , "DB");.  retur
12f30 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  n TCL_ERROR;.}..
12f40 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
12f50 61 64 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65  add_alignment_te
12f60 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73 20 20 44  st_collations  D
12f70 42 0a 2a 2a 0a 2a 2a 20 41 64 64 20 74 77 6f 20  B.**.** Add two 
12f80 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  new collating se
12f90 71 75 65 6e 63 65 73 20 74 6f 20 74 68 65 20 64  quences to the d
12fa0 61 74 61 62 61 73 65 20 44 42 0a 2a 2a 0a 2a 2a  atabase DB.**.**
12fb0 20 20 20 20 20 75 74 66 31 36 5f 61 6c 69 67 6e       utf16_align
12fc0 65 64 0a 2a 2a 20 20 20 20 20 75 74 66 31 36 5f  ed.**     utf16_
12fd0 75 6e 61 6c 69 67 6e 65 64 0a 2a 2a 0a 2a 2a 20  unaligned.**.** 
12fe0 42 6f 74 68 20 63 6f 6c 6c 61 74 69 6e 67 20 73  Both collating s
12ff0 65 71 75 65 6e 63 65 73 20 75 73 65 20 74 68 65  equences use the
13000 20 73 61 6d 65 20 73 6f 72 74 20 6f 72 64 65 72   same sort order
13010 20 61 73 20 42 49 4e 41 52 59 2e 0a 2a 2a 20 54   as BINARY..** T
13020 68 65 20 6f 6e 6c 79 20 64 69 66 66 65 72 65 6e  he only differen
13030 63 65 20 69 73 20 74 68 61 74 20 74 68 65 20 75  ce is that the u
13040 74 66 31 36 5f 61 6c 69 67 6e 65 64 20 63 6f 6c  tf16_aligned col
13050 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e  lating.** sequen
13060 63 65 20 69 73 20 64 65 63 6c 61 72 65 64 20 77  ce is declared w
13070 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 55  ith the SQLITE_U
13080 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 66 6c 61  TF16_ALIGNED fla
13090 67 2e 0a 2a 2a 20 42 6f 74 68 20 63 6f 6c 6c 61  g..** Both colla
130a0 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 69  ting functions i
130b0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 75 6e 61  ncrement the una
130c0 6c 69 67 6e 65 64 20 75 74 66 31 36 20 63 6f 75  ligned utf16 cou
130d0 6e 74 65 72 0a 2a 2a 20 77 68 65 6e 65 76 65 72  nter.** whenever
130e0 20 74 68 65 79 20 73 65 65 20 61 20 73 74 72 69   they see a stri
130f0 6e 67 20 74 68 61 74 20 62 65 67 69 6e 73 20 6f  ng that begins o
13100 6e 20 61 6e 20 6f 64 64 20 62 79 74 65 20 62 6f  n an odd byte bo
13110 75 6e 64 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  undary..*/.stati
13120 63 20 69 6e 74 20 75 6e 61 6c 69 67 6e 65 64 5f  c int unaligned_
13130 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 20 3d  string_counter =
13140 20 30 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 61   0;.static int a
13150 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63  lignmentCollFunc
13160 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
13170 64 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  d,.  int nKey1, 
13180 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
13190 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20  1,.  int nKey2, 
131a0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
131b0 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e  2.){.  int rc, n
131c0 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b  ;.  n = nKey1<nK
131d0 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b  ey2 ? nKey1 : nK
131e0 65 79 32 3b 0a 20 20 69 66 28 20 6e 4b 65 79 31  ey2;.  if( nKey1
131f0 3e 30 20 26 26 20 31 3d 3d 28 31 26 28 53 51 4c  >0 && 1==(1&(SQL
13200 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70  ITE_PTR_TO_INT(p
13210 4b 65 79 31 29 29 29 20 29 20 75 6e 61 6c 69 67  Key1))) ) unalig
13220 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74  ned_string_count
13230 65 72 2b 2b 3b 0a 20 20 69 66 28 20 6e 4b 65 79  er++;.  if( nKey
13240 32 3e 30 20 26 26 20 31 3d 3d 28 31 26 28 53 51  2>0 && 1==(1&(SQ
13250 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
13260 70 4b 65 79 32 29 29 29 20 29 20 75 6e 61 6c 69  pKey2))) ) unali
13270 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e  gned_string_coun
13280 74 65 72 2b 2b 3b 0a 20 20 72 63 20 3d 20 6d 65  ter++;.  rc = me
13290 6d 63 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65 79  mcmp(pKey1, pKey
132a0 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d  2, n);.  if( rc=
132b0 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6e  =0 ){.    rc = n
132c0 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20  Key1 - nKey2;.  
132d0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
132e0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 5f  .static int add_
132f0 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63  alignment_test_c
13300 6f 6c 6c 61 74 69 6f 6e 73 28 0a 20 20 76 6f 69  ollations(.  voi
13310 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
13320 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
13330 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
13340 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
13350 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
13360 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66  qlite3 *db;.  if
13370 28 20 6f 62 6a 63 3e 3d 32 20 29 7b 0a 20 20 20  ( objc>=2 ){.   
13380 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
13390 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
133a0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
133b0 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
133c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  TCL_ERROR;.    s
133d0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
133e0 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 75 74 66  llation(db, "utf
133f0 31 36 5f 75 6e 61 6c 69 67 6e 65 64 22 2c 20 53  16_unaligned", S
13400 51 4c 49 54 45 5f 55 54 46 31 36 2c 20 0a 20 20  QLITE_UTF16, .  
13410 20 20 20 20 20 20 30 2c 20 61 6c 69 67 6e 6d 65        0, alignme
13420 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b 0a 20 20 20  ntCollFunc);.   
13430 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
13440 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 75  collation(db, "u
13450 74 66 31 36 5f 61 6c 69 67 6e 65 64 22 2c 20 53  tf16_aligned", S
13460 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47  QLITE_UTF16_ALIG
13470 4e 45 44 2c 20 0a 20 20 20 20 20 20 20 20 30 2c  NED, .        0,
13480 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c 46 75   alignmentCollFu
13490 6e 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  nc);.  }.  retur
134a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
134b0 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
134c0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  d(SQLITE_OMIT_UT
134d0 46 31 36 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 55  F16) */../*.** U
134e0 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 66  sage: add_test_f
134f0 75 6e 63 74 69 6f 6e 20 3c 64 62 20 70 74 72 3e  unction <db ptr>
13500 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65   <utf8> <utf16le
13510 3e 20 3c 75 74 66 31 36 62 65 3e 0a 2a 2a 0a 2a  > <utf16be>.**.*
13520 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
13530 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20  is used to test 
13540 74 68 61 74 20 53 51 4c 69 74 65 20 73 65 6c 65  that SQLite sele
13550 63 74 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  cts the correct 
13560 75 73 65 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  user.** function
13570 20 63 61 6c 6c 62 61 63 6b 20 77 68 65 6e 20 6d   callback when m
13580 75 6c 74 69 70 6c 65 20 76 65 72 73 69 6f 6e 73  ultiple versions
13590 20 28 66 6f 72 20 64 69 66 66 65 72 65 6e 74 20   (for different 
135a0 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 73 29 0a  text encodings).
135b0 2a 2a 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ** are available
135c0 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20  ..**.** Calling 
135d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 67  this routine reg
135e0 69 73 74 65 72 73 20 75 70 20 74 6f 20 74 68 72  isters up to thr
135f0 65 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  ee versions of t
13600 68 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e  he user function
13610 0a 2a 2a 20 22 74 65 73 74 5f 66 75 6e 63 74 69  .** "test_functi
13620 6f 6e 22 20 77 69 74 68 20 64 61 74 61 62 61 73  on" with databas
13630 65 20 68 61 6e 64 6c 65 20 3c 64 62 3e 2e 20 20  e handle <db>.  
13640 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
13650 67 75 6d 65 6e 74 20 69 73 0a 2a 2a 20 74 72 75  gument is.** tru
13660 65 2c 20 74 68 65 6e 20 61 20 76 65 72 73 69 6f  e, then a versio
13670 6e 20 6f 66 20 74 65 73 74 5f 66 75 6e 63 74 69  n of test_functi
13680 6f 6e 20 69 73 20 72 65 67 69 73 74 65 72 65 64  on is registered
13690 20 66 6f 72 20 55 54 46 2d 38 2c 20 69 66 20 74   for UTF-8, if t
136a0 68 65 0a 2a 2a 20 74 68 69 72 64 20 69 73 20 74  he.** third is t
136b0 72 75 65 2c 20 61 20 76 65 72 73 69 6f 6e 20 69  rue, a version i
136c0 73 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72  s registered for
136d0 20 55 54 46 2d 31 36 6c 65 2c 20 69 66 20 74 68   UTF-16le, if th
136e0 65 20 66 6f 75 72 74 68 20 69 73 0a 2a 2a 20 74  e fourth is.** t
136f0 72 75 65 2c 20 61 20 55 54 46 2d 31 36 62 65 20  rue, a UTF-16be 
13700 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c  version is avail
13710 61 62 6c 65 2e 20 20 50 72 65 76 69 6f 75 73 20  able.  Previous 
13720 76 65 72 73 69 6f 6e 73 20 6f 66 0a 2a 2a 20 74  versions of.** t
13730 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 61 72 65  est_function are
13740 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   deleted..**.** 
13750 54 68 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f  The user functio
13760 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  n is implemented
13770 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 20   by calling the 
13780 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c 20 73 63  following TCL sc
13790 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 74  ript:.**.**   "t
137a0 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 3c 65 6e  est_function <en
137b0 63 3e 20 3c 61 72 67 3e 22 0a 2a 2a 0a 2a 2a 20  c> <arg>".**.** 
137c0 57 68 65 72 65 20 3c 65 6e 63 3e 20 69 73 20 6f  Where <enc> is o
137d0 6e 65 20 6f 66 20 55 54 46 2d 38 2c 20 55 54 46  ne of UTF-8, UTF
137e0 2d 31 36 4c 45 20 6f 72 20 55 54 46 31 36 42 45  -16LE or UTF16BE
137f0 2c 20 61 6e 64 20 3c 61 72 67 3e 20 69 73 20 74  , and <arg> is t
13800 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67  he.** single arg
13810 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
13820 74 68 65 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  the SQL function
13830 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  . The value retu
13840 72 6e 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 54  rned by.** the T
13850 43 4c 20 73 63 72 69 70 74 20 69 73 20 75 73 65  CL script is use
13860 64 20 61 73 20 74 68 65 20 72 65 74 75 72 6e 20  d as the return 
13870 76 61 6c 75 65 20 6f 66 20 74 68 65 20 53 51 4c  value of the SQL
13880 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 0a 2a 2a   function. It.**
13890 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 53 51   is passed to SQ
138a0 4c 69 74 65 20 75 73 69 6e 67 20 55 54 46 2d 31  Lite using UTF-1
138b0 36 42 45 20 66 6f 72 20 61 20 55 54 46 2d 38 20  6BE for a UTF-8 
138c0 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 28 29 2c  test_function(),
138d0 20 55 54 46 2d 38 0a 2a 2a 20 66 6f 72 20 61 20   UTF-8.** for a 
138e0 55 54 46 2d 31 36 4c 45 20 74 65 73 74 5f 66 75  UTF-16LE test_fu
138f0 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 64 20 55 54  nction(), and UT
13900 46 2d 31 36 4c 45 20 66 6f 72 20 61 6e 20 69 6d  F-16LE for an im
13910 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61  plementation tha
13920 74 0a 2a 2a 20 70 72 65 66 65 72 73 20 55 54 46  t.** prefers UTF
13930 2d 31 36 42 45 2e 0a 2a 2f 0a 23 69 66 6e 64 65  -16BE..*/.#ifnde
13940 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
13950 46 31 36 0a 73 74 61 74 69 63 20 76 6f 69 64 20  F16.static void 
13960 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74  test_function_ut
13970 66 38 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  f8(.  sqlite3_co
13980 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20  ntext *pCtx, .  
13990 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69  int nArg,.  sqli
139a0 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
139b0 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  .){.  Tcl_Interp
139c0 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f   *interp;.  Tcl_
139d0 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74  Obj *pX;.  sqlit
139e0 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
139f0 20 20 69 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f    interp = (Tcl_
13a00 49 6e 74 65 72 70 20 2a 29 73 71 6c 69 74 65 33  Interp *)sqlite3
13a10 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29  _user_data(pCtx)
13a20 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77  ;.  pX = Tcl_New
13a30 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f  StringObj("test_
13a40 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a  function", -1);.
13a50 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
13a60 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f 4c 69  nt(pX);.  Tcl_Li
13a70 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
13a80 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 54  nt(interp, pX, T
13a90 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
13aa0 22 55 54 46 2d 38 22 2c 20 2d 31 29 29 3b 0a 20  "UTF-8", -1));. 
13ab0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
13ac0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
13ad0 2c 20 70 58 2c 20 0a 20 20 20 20 20 20 54 63 6c  , pX, .      Tcl
13ae0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
13af0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
13b00 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
13b10 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76  , -1));.  Tcl_Ev
13b20 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20  alObjEx(interp, 
13b30 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65  pX, 0);.  Tcl_De
13b40 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a  crRefCount(pX);.
13b50 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
13b60 5f 74 65 78 74 28 70 43 74 78 2c 20 54 63 6c 5f  _text(pCtx, Tcl_
13b70 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
13b80 69 6e 74 65 72 70 29 2c 20 2d 31 2c 20 53 51 4c  interp), -1, SQL
13b90 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
13ba0 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
13bb0 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73  ValueNew(0);.  s
13bc0 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
13bd0 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54 63 6c 5f  r(pVal, -1, Tcl_
13be0 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
13bf0 69 6e 74 65 72 70 29 2c 20 0a 20 20 20 20 20 20  interp), .      
13c00 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
13c10 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73  ITE_STATIC);.  s
13c20 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
13c30 78 74 31 36 62 65 28 70 43 74 78 2c 20 73 71 6c  xt16be(pCtx, sql
13c40 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
13c50 36 62 65 28 70 56 61 6c 29 2c 0a 20 20 20 20 20  6be(pVal),.     
13c60 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
13c70 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65  SIENT);.  sqlite
13c80 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
13c90 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
13ca0 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74  test_function_ut
13cb0 66 31 36 6c 65 28 0a 20 20 73 71 6c 69 74 65 33  f16le(.  sqlite3
13cc0 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
13cd0 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73  .  int nArg,.  s
13ce0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
13cf0 72 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74  rgv.){.  Tcl_Int
13d00 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54  erp *interp;.  T
13d10 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71  cl_Obj *pX;.  sq
13d20 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
13d30 6c 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 28 54  l;.  interp = (T
13d40 63 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c 69  cl_Interp *)sqli
13d50 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43  te3_user_data(pC
13d60 74 78 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f  tx);.  pX = Tcl_
13d70 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65  NewStringObj("te
13d80 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31  st_function", -1
13d90 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
13da0 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c  Count(pX);.  Tcl
13db0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
13dc0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58  ement(interp, pX
13dd0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
13de0 62 6a 28 22 55 54 46 2d 31 36 4c 45 22 2c 20 2d  bj("UTF-16LE", -
13df0 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  1));.  Tcl_ListO
13e00 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
13e10 69 6e 74 65 72 70 2c 20 70 58 2c 20 0a 20 20 20  interp, pX, .   
13e20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
13e30 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74  Obj((char*)sqlit
13e40 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
13e50 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20  gv[0]), -1));.  
13e60 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e  Tcl_EvalObjEx(in
13e70 74 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20  terp, pX, 0);.  
13e80 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
13e90 28 70 58 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73  (pX);.  pVal = s
13ea0 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30  qlite3ValueNew(0
13eb0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
13ec0 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31  eSetStr(pVal, -1
13ed0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  , Tcl_GetStringR
13ee0 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a  esult(interp), .
13ef0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46        SQLITE_UTF
13f00 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  8, SQLITE_STATIC
13f10 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
13f20 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 28 63  ult_text(pCtx,(c
13f30 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
13f40 75 65 5f 74 65 78 74 28 70 56 61 6c 29 2c 2d 31  ue_text(pVal),-1
13f50 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e  ,SQLITE_TRANSIEN
13f60 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  T);.  sqlite3Val
13f70 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a  ueFree(pVal);.}.
13f80 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74  static void test
13f90 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 62  _function_utf16b
13fa0 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  e(.  sqlite3_con
13fb0 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69  text *pCtx, .  i
13fc0 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74  nt nArg,.  sqlit
13fd0 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
13fe0 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  ){.  Tcl_Interp 
13ff0 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f  *interp;.  Tcl_O
14000 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65  bj *pX;.  sqlite
14010 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20  3_value *pVal;. 
14020 20 69 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f 49   interp = (Tcl_I
14030 6e 74 65 72 70 20 2a 29 73 71 6c 69 74 65 33 5f  nterp *)sqlite3_
14040 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b  user_data(pCtx);
14050 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53  .  pX = Tcl_NewS
14060 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f 66  tringObj("test_f
14070 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20  unction", -1);. 
14080 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
14090 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  t(pX);.  Tcl_Lis
140a0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
140b0 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 54 63  t(interp, pX, Tc
140c0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
140d0 55 54 46 2d 31 36 42 45 22 2c 20 2d 31 29 29 3b  UTF-16BE", -1));
140e0 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
140f0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
14100 72 70 2c 20 70 58 2c 20 0a 20 20 20 20 20 20 54  rp, pX, .      T
14110 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
14120 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
14130 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
14140 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  ]), -1));.  Tcl_
14150 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70  EvalObjEx(interp
14160 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  , pX, 0);.  Tcl_
14170 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29  DecrRefCount(pX)
14180 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74  ;.  pVal = sqlit
14190 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20  e3ValueNew(0);. 
141a0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
141b0 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54 63  Str(pVal, -1, Tc
141c0 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
141d0 74 28 69 6e 74 65 72 70 29 2c 20 0a 20 20 20 20  t(interp), .    
141e0 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53    SQLITE_UTF8, S
141f0 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
14200 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
14210 74 65 78 74 31 36 28 70 43 74 78 2c 20 73 71 6c  text16(pCtx, sql
14220 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
14230 36 6c 65 28 70 56 61 6c 29 2c 0a 20 20 20 20 20  6le(pVal),.     
14240 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
14250 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65  SIENT);.  sqlite
14260 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36 62  3_result_text16b
14270 65 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f  e(pCtx, sqlite3_
14280 76 61 6c 75 65 5f 74 65 78 74 31 36 6c 65 28 70  value_text16le(p
14290 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20  Val),.      -1, 
142a0 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
142b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
142c0 75 6c 74 5f 74 65 78 74 31 36 6c 65 28 70 43 74  ult_text16le(pCt
142d0 78 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  x, sqlite3_value
142e0 5f 74 65 78 74 31 36 6c 65 28 70 56 61 6c 29 2c  _text16le(pVal),
142f0 0a 20 20 20 20 20 20 2d 31 2c 20 53 51 4c 49 54  .      -1, SQLIT
14300 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
14310 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
14320 28 70 56 61 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66  (pVal);.}.#endif
14330 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
14340 55 54 46 31 36 20 2a 2f 0a 73 74 61 74 69 63 20  UTF16 */.static 
14350 69 6e 74 20 74 65 73 74 5f 66 75 6e 63 74 69 6f  int test_functio
14360 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  n(.  void * clie
14370 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
14380 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
14390 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
143a0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
143b0 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ].){.#ifndef SQL
143c0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
143d0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
143e0 69 6e 74 20 76 61 6c 3b 0a 0a 20 20 69 66 28 20  int val;..  if( 
143f0 6f 62 6a 63 21 3d 35 20 29 20 67 6f 74 6f 20 62  objc!=5 ) goto b
14400 61 64 5f 61 72 67 73 3b 0a 20 20 69 66 28 20 67  ad_args;.  if( g
14410 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
14420 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
14430 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
14440 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
14450 52 4f 52 3b 0a 0a 20 20 69 66 28 20 54 43 4c 5f  ROR;..  if( TCL_
14460 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  OK!=Tcl_GetBoole
14470 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
14480 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61 6c 29  , objv[2], &val)
14490 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
144a0 52 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c 20 29  ROR;.  if( val )
144b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  {.    sqlite3_cr
144c0 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
144d0 2c 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  , "test_function
144e0 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
144f0 38 2c 20 0a 20 20 20 20 20 20 20 20 69 6e 74 65  8, .        inte
14500 72 70 2c 20 74 65 73 74 5f 66 75 6e 63 74 69 6f  rp, test_functio
14510 6e 5f 75 74 66 38 2c 20 30 2c 20 30 29 3b 0a 20  n_utf8, 0, 0);. 
14520 20 7d 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21   }.  if( TCL_OK!
14530 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46  =Tcl_GetBooleanF
14540 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
14550 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20  bjv[3], &val) ) 
14560 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14570 3b 0a 20 20 69 66 28 20 76 61 6c 20 29 7b 0a 20  ;.  if( val ){. 
14580 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
14590 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
145a0 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20  test_function", 
145b0 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  1, SQLITE_UTF16L
145c0 45 2c 20 0a 20 20 20 20 20 20 20 20 69 6e 74 65  E, .        inte
145d0 72 70 2c 20 74 65 73 74 5f 66 75 6e 63 74 69 6f  rp, test_functio
145e0 6e 5f 75 74 66 31 36 6c 65 2c 20 30 2c 20 30 29  n_utf16le, 0, 0)
145f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 43 4c 5f  ;.  }.  if( TCL_
14600 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  OK!=Tcl_GetBoole
14610 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
14620 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 76 61 6c 29  , objv[4], &val)
14630 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
14640 52 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c 20 29  ROR;.  if( val )
14650 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  {.    sqlite3_cr
14660 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
14670 2c 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  , "test_function
14680 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
14690 31 36 42 45 2c 20 0a 20 20 20 20 20 20 20 20 69  16BE, .        i
146a0 6e 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e 63  nterp, test_func
146b0 74 69 6f 6e 5f 75 74 66 31 36 62 65 2c 20 30 2c  tion_utf16be, 0,
146c0 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75   0);.  }..  retu
146d0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 62 61 64 5f 61  rn TCL_OK;.bad_a
146e0 72 67 73 3a 0a 20 20 54 63 6c 5f 41 70 70 65 6e  rgs:.  Tcl_Appen
146f0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
14700 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
14710 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
14720 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
14730 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
14740 2c 20 30 29 2c 20 22 20 3c 44 42 3e 20 3c 75 74  , 0), " <DB> <ut
14750 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75  f8> <utf16le> <u
14760 74 66 31 36 62 65 3e 22 2c 20 30 29 3b 0a 23 65  tf16be>", 0);.#e
14770 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
14780 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72  MIT_UTF16 */.  r
14790 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
147a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
147b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
147c0 5f 74 65 73 74 5f 65 72 72 73 74 72 20 3c 65 72  _test_errstr <er
147d0 72 20 63 6f 64 65 3e 0a 2a 2a 0a 2a 2a 20 54 65  r code>.**.** Te
147e0 73 74 20 74 68 61 74 20 74 68 65 20 65 6e 67 6c  st that the engl
147f0 69 73 68 20 6c 61 6e 67 75 61 67 65 20 73 74 72  ish language str
14800 69 6e 67 20 65 71 75 69 76 61 6c 65 6e 74 73 20  ing equivalents 
14810 66 6f 72 20 73 71 6c 69 74 65 20 65 72 72 6f 72  for sqlite error
14820 20 63 6f 64 65 73 0a 2a 2a 20 61 72 65 20 73 61   codes.** are sa
14830 6e 65 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65  ne. The paramete
14840 72 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  r is an integer 
14850 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61 6e 20  representing an 
14860 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  sqlite error cod
14870 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  e..** The result
14880 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 77   is a list of tw
14890 6f 20 65 6c 65 6d 65 6e 74 73 2c 20 74 68 65 20  o elements, the 
148a0 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74  string represent
148b0 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  ation of the.** 
148c0 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 74  error code and t
148d0 68 65 20 65 6e 67 6c 69 73 68 20 6c 61 6e 67 75  he english langu
148e0 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 2e  age explanation.
148f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
14900 65 73 74 5f 65 72 72 73 74 72 28 0a 20 20 76 6f  est_errstr(.  vo
14910 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
14920 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
14930 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
14940 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
14950 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
14960 63 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 69  char *zCode;.  i
14970 6e 74 20 69 3b 0a 20 20 69 66 28 20 6f 62 6a 63  nt i;.  if( objc
14980 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=1 ){.    Tcl_W
14990 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
149a0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3c 65  rp, 1, objv, "<e
149b0 72 72 6f 72 20 63 6f 64 65 3e 22 29 3b 0a 20 20  rror code>");.  
149c0 7d 0a 0a 20 20 7a 43 6f 64 65 20 3d 20 54 63 6c  }..  zCode = Tcl
149d0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
149e0 31 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  1]);.  for(i=0; 
149f0 69 3c 32 30 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<200; i++){.   
14a00 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 74   if( 0==strcmp(t
14a10 31 45 72 72 6f 72 4e 61 6d 65 28 69 29 2c 20 7a  1ErrorName(i), z
14a20 43 6f 64 65 29 20 29 20 62 72 65 61 6b 3b 0a 20  Code) ) break;. 
14a30 20 7d 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75   }.  Tcl_SetResu
14a40 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
14a50 20 2a 29 73 71 6c 69 74 65 33 45 72 72 53 74 72   *)sqlite3ErrStr
14a60 28 69 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  (i), 0);.  retur
14a70 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
14a80 2a 2a 20 55 73 61 67 65 3a 20 20 20 20 62 72 65  ** Usage:    bre
14a90 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68  akpoint.**.** Th
14aa0 69 73 20 72 6f 75 74 69 6e 65 20 65 78 69 73 74  is routine exist
14ab0 73 20 66 6f 72 20 6f 6e 65 20 70 75 72 70 6f 73  s for one purpos
14ac0 65 20 2d 20 74 6f 20 70 72 6f 76 69 64 65 20 61  e - to provide a
14ad0 20 70 6c 61 63 65 20 74 6f 20 70 75 74 20 61 0a   place to put a.
14ae0 2a 2a 20 62 72 65 61 6b 70 6f 69 6e 74 20 77 69  ** breakpoint wi
14af0 74 68 20 47 44 42 20 74 68 61 74 20 63 61 6e 20  th GDB that can 
14b00 62 65 20 74 72 69 67 67 65 72 65 64 20 75 73 69  be triggered usi
14b10 6e 67 20 54 43 4c 20 63 6f 64 65 2e 20 20 54 68  ng TCL code.  Th
14b20 65 20 75 73 65 0a 2a 2a 20 66 6f 72 20 74 68 69  e use.** for thi
14b30 73 20 69 73 20 77 68 65 6e 20 61 20 70 61 72 74  s is when a part
14b40 69 63 75 6c 61 72 20 74 65 73 74 20 66 61 69 6c  icular test fail
14b50 73 20 6f 6e 20 28 73 61 79 29 20 74 68 65 20 31  s on (say) the 1
14b60 34 38 35 74 68 20 69 74 65 72 61 74 69 6f 6e 2e  485th iteration.
14b70 0a 2a 2a 20 49 6e 20 74 68 65 20 54 43 4c 20 74  .** In the TCL t
14b80 65 73 74 20 73 63 72 69 70 74 2c 20 77 65 20 63  est script, we c
14b90 61 6e 20 61 64 64 20 63 6f 64 65 20 6c 69 6b 65  an add code like
14ba0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
14bb0 20 69 66 20 7b 24 69 3d 3d 31 34 38 35 7d 20 62   if {$i==1485} b
14bc0 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20  reakpoint.**.** 
14bd0 54 68 65 6e 20 72 75 6e 20 74 65 73 74 66 69 78  Then run testfix
14be0 74 75 72 65 20 69 6e 20 74 68 65 20 64 65 62 75  ture in the debu
14bf0 67 67 65 72 20 61 6e 64 20 77 61 69 74 20 66 6f  gger and wait fo
14c00 72 20 74 68 65 20 62 72 65 61 6b 70 6f 69 6e 74  r the breakpoint
14c10 20 74 6f 0a 2a 2a 20 66 69 72 65 2e 20 20 54 68   to.** fire.  Th
14c20 65 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 62 72  en additional br
14c30 65 61 6b 70 6f 69 6e 74 73 20 63 61 6e 20 62 65  eakpoints can be
14c40 20 73 65 74 20 74 6f 20 74 72 61 63 65 20 64 6f   set to trace do
14c50 77 6e 20 74 68 65 20 62 75 67 2e 0a 2a 2f 0a 73  wn the bug..*/.s
14c60 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
14c70 72 65 61 6b 70 6f 69 6e 74 28 0a 20 20 76 6f 69  reakpoint(.  voi
14c80 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
14c90 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
14ca0 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
14cb0 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
14cc0 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
14cd0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
14ce0 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
14cf0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
14d00 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
14d10 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
14d20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
14d30 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
14d40 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  .){.  return TCL
14d50 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  _OK;         /* 
14d60 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 7d 0a  Do nothing */.}.
14d70 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
14d80 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72  sqlite3_bind_zer
14d90 6f 62 6c 6f 62 20 20 53 54 4d 54 20 49 44 58 20  oblob  STMT IDX 
14da0 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65  N.**.** Test the
14db0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65   sqlite3_bind_ze
14dc0 72 6f 62 6c 6f 62 20 69 6e 74 65 72 66 61 63 65  roblob interface
14dd0 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65  .  STMT is a pre
14de0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
14df0 0a 2a 2a 20 49 44 58 20 69 73 20 74 68 65 20 69  .** IDX is the i
14e00 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61  ndex of a wildca
14e10 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72  rd in the prepar
14e20 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ed statement.  T
14e30 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62  his command.** b
14e40 69 6e 64 73 20 61 20 4e 2d 62 79 74 65 20 7a 65  inds a N-byte ze
14e50 72 6f 2d 66 69 6c 6c 65 64 20 42 4c 4f 42 20 74  ro-filled BLOB t
14e60 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e 0a  o the wildcard..
14e70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
14e80 73 74 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62  st_bind_zeroblob
14e90 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
14ea0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
14eb0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
14ec0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
14ed0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
14ee0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
14ef0 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
14f00 20 69 64 78 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20   idx;.  int n;. 
14f10 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
14f20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
14f30 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
14f40 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
14f50 20 22 53 54 4d 54 20 49 44 58 20 4e 22 29 3b 0a   "STMT IDX N");.
14f60 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
14f70 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
14f80 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
14f90 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
14fa0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
14fb0 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
14fc0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
14fd0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
14fe0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
14ff0 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74  [2], &idx) ) ret
15000 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
15010 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
15020 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
15030 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29 20 72 65  bjv[3], &n) ) re
15040 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15050 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
15060 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 28 70 53  bind_zeroblob(pS
15070 74 6d 74 2c 20 69 64 78 2c 20 6e 29 3b 0a 20 20  tmt, idx, n);.  
15080 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
15090 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53  rrCode(interp, S
150a0 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20  tmtToDb(pStmt), 
150b0 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
150c0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
150d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
150e0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
150f0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ROR;.  }..  retu
15100 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
15110 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
15120 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20 20 53  ite3_bind_int  S
15130 54 4d 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a  TMT N VALUE.**.*
15140 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74  * Test the sqlit
15150 65 33 5f 62 69 6e 64 5f 69 6e 74 20 69 6e 74 65  e3_bind_int inte
15160 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20  rface.  STMT is 
15170 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
15180 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68  ment..** N is th
15190 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c  e index of a wil
151a0 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65  dcard in the pre
151b0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
151c0 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a    This command.*
151d0 2a 20 62 69 6e 64 73 20 61 20 33 32 2d 62 69 74  * binds a 32-bit
151e0 20 69 6e 74 65 67 65 72 20 56 41 4c 55 45 20 74   integer VALUE t
151f0 6f 20 74 68 61 74 20 77 69 6c 64 63 61 72 64 2e  o that wildcard.
15200 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
15210 65 73 74 5f 62 69 6e 64 5f 69 6e 74 28 0a 20 20  est_bind_int(.  
15220 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
15230 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
15240 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
15250 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
15260 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
15270 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
15280 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78  pStmt;.  int idx
15290 3b 0a 20 20 69 6e 74 20 76 61 6c 75 65 3b 0a 20  ;.  int value;. 
152a0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
152b0 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
152c0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
152d0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
152e0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
152f0 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
15300 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
15310 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
15320 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c  " STMT N VALUE",
15330 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
15340 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
15350 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
15360 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
15370 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
15380 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
15390 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
153a0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
153b0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
153c0 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20   objv[2], &idx) 
153d0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
153e0 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
153f0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
15400 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61  rp, objv[3], &va
15410 6c 75 65 29 20 29 20 72 65 74 75 72 6e 20 54 43  lue) ) return TC
15420 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
15430 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
15440 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61  t(pStmt, idx, va
15450 6c 75 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  lue);.  if( sqli
15460 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
15470 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28  nterp, StmtToDb(
15480 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65  pStmt), rc) ) re
15490 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
154a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
154b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
154c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
154d0 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
154e0 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  K;.}.../*.** Usa
154f0 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ge:   sqlite3_bi
15500 6e 64 5f 69 6e 74 36 34 20 20 53 54 4d 54 20 4e  nd_int64  STMT N
15510 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73   VALUE.**.** Tes
15520 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69  t the sqlite3_bi
15530 6e 64 5f 69 6e 74 36 34 20 69 6e 74 65 72 66 61  nd_int64 interfa
15540 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70  ce.  STMT is a p
15550 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
15560 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69  t..** N is the i
15570 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61  ndex of a wildca
15580 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72  rd in the prepar
15590 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ed statement.  T
155a0 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62  his command.** b
155b0 69 6e 64 73 20 61 20 36 34 2d 62 69 74 20 69 6e  inds a 64-bit in
155c0 74 65 67 65 72 20 56 41 4c 55 45 20 74 6f 20 74  teger VALUE to t
155d0 68 61 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f  hat wildcard..*/
155e0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
155f0 5f 62 69 6e 64 5f 69 6e 74 36 34 28 0a 20 20 76  _bind_int64(.  v
15600 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
15610 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
15620 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
15630 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
15640 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
15650 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
15660 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Stmt;.  int idx;
15670 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 76  .  Tcl_WideInt v
15680 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  alue;.  int rc;.
15690 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29  .  if( objc!=4 )
156a0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
156b0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
156c0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
156d0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
156e0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
156f0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
15700 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20  ], 0), " STMT N 
15710 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20 20  VALUE", 0);.    
15720 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15730 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
15740 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
15750 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
15760 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
15770 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
15780 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
15790 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
157a0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
157b0 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20   &idx) ) return 
157c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
157d0 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46   Tcl_GetWideIntF
157e0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
157f0 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20  bjv[3], &value) 
15800 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
15810 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
15820 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
15830 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65  Stmt, idx, value
15840 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
15850 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
15860 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74  rp, StmtToDb(pSt
15870 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72  mt), rc) ) retur
15880 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
15890 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
158a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
158b0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
158c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
158d0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  }.../*.** Usage:
158e0 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
158f0 64 6f 75 62 6c 65 20 20 53 54 4d 54 20 4e 20 56  double  STMT N V
15900 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  ALUE.**.** Test 
15910 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
15920 5f 64 6f 75 62 6c 65 20 69 6e 74 65 72 66 61 63  _double interfac
15930 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72  e.  STMT is a pr
15940 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
15950 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e  ..** N is the in
15960 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72  dex of a wildcar
15970 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65  d in the prepare
15980 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  d statement.  Th
15990 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69  is command.** bi
159a0 6e 64 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74  nds a 64-bit int
159b0 65 67 65 72 20 56 41 4c 55 45 20 74 6f 20 74 68  eger VALUE to th
159c0 61 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a  at wildcard..*/.
159d0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
159e0 62 69 6e 64 5f 64 6f 75 62 6c 65 28 0a 20 20 76  bind_double(.  v
159f0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
15a00 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
15a10 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
15a20 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
15a30 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
15a40 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
15a50 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Stmt;.  int idx;
15a60 0a 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b  .  double value;
15a70 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e  .  int rc;.  con
15a80 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 20  st char *zVal;. 
15a90 20 69 6e 74 20 69 3b 0a 20 20 73 74 61 74 69 63   int i;.  static
15aa0 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a   const struct {.
15ab0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
15ac0 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61  zName;     /* Na
15ad0 6d 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  me of the specia
15ae0 6c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  l floating point
15af0 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 75 6e   value */.    un
15b00 73 69 67 6e 65 64 20 69 6e 74 20 69 55 70 70 65  signed int iUppe
15b10 72 3b 20 20 20 2f 2a 20 55 70 70 65 72 20 33 32  r;   /* Upper 32
15b20 20 62 69 74 73 20 2a 2f 0a 20 20 20 20 75 6e 73   bits */.    uns
15b30 69 67 6e 65 64 20 69 6e 74 20 69 4c 6f 77 65 72  igned int iLower
15b40 3b 20 20 20 2f 2a 20 4c 6f 77 65 72 20 33 32 20  ;   /* Lower 32 
15b50 62 69 74 73 20 2a 2f 0a 20 20 7d 20 61 53 70 65  bits */.  } aSpe
15b60 63 69 61 6c 46 70 5b 5d 20 3d 20 7b 0a 20 20 20  cialFp[] = {.   
15b70 20 7b 20 20 22 4e 61 4e 22 2c 20 20 20 20 20 20   {  "NaN",      
15b80 30 78 37 66 66 66 66 66 66 66 2c 20 30 78 66 66  0x7fffffff, 0xff
15b90 66 66 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20  ffffff },.    { 
15ba0 20 22 53 4e 61 4e 22 2c 20 20 20 20 20 30 78 37   "SNaN",     0x7
15bb0 66 66 37 66 66 66 66 2c 20 30 78 66 66 66 66 66  ff7ffff, 0xfffff
15bc0 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d  fff },.    {  "-
15bd0 4e 61 4e 22 2c 20 20 20 20 20 30 78 66 66 66 66  NaN",     0xffff
15be0 66 66 66 66 2c 20 30 78 66 66 66 66 66 66 66 66  ffff, 0xffffffff
15bf0 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 53 4e 61   },.    {  "-SNa
15c00 4e 22 2c 20 20 20 20 30 78 66 66 66 37 66 66 66  N",    0xfff7fff
15c10 66 2c 20 30 78 66 66 66 66 66 66 66 66 20 7d 2c  f, 0xffffffff },
15c20 0a 20 20 20 20 7b 20 20 22 2b 49 6e 66 22 2c 20  .    {  "+Inf", 
15c30 20 20 20 20 30 78 37 66 66 30 30 30 30 30 2c 20      0x7ff00000, 
15c40 30 78 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20  0x00000000 },.  
15c50 20 20 7b 20 20 22 2d 49 6e 66 22 2c 20 20 20 20    {  "-Inf",    
15c60 20 30 78 66 66 66 30 30 30 30 30 2c 20 30 78 30   0xfff00000, 0x0
15c70 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b  0000000 },.    {
15c80 20 20 22 45 70 73 69 6c 6f 6e 22 2c 20 20 30 78    "Epsilon",  0x
15c90 30 30 30 30 30 30 30 30 2c 20 30 78 30 30 30 30  00000000, 0x0000
15ca0 30 30 30 31 20 7d 2c 0a 20 20 20 20 7b 20 20 22  0001 },.    {  "
15cb0 2d 45 70 73 69 6c 6f 6e 22 2c 20 30 78 38 30 30  -Epsilon", 0x800
15cc0 30 30 30 30 30 2c 20 30 78 30 30 30 30 30 30 30  00000, 0x0000000
15cd0 31 20 7d 2c 0a 20 20 20 20 7b 20 20 22 4e 61 4e  1 },.    {  "NaN
15ce0 30 22 2c 20 20 20 20 20 30 78 37 66 66 38 30 30  0",     0x7ff800
15cf0 30 30 2c 20 30 78 30 30 30 30 30 30 30 30 20 7d  00, 0x00000000 }
15d00 2c 0a 20 20 20 20 7b 20 20 22 2d 4e 61 4e 30 22  ,.    {  "-NaN0"
15d10 2c 20 20 20 20 30 78 66 66 66 38 30 30 30 30 2c  ,    0xfff80000,
15d20 20 30 78 30 30 30 30 30 30 30 30 20 7d 2c 0a 20   0x00000000 },. 
15d30 20 7d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   };..  if( objc!
15d40 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =4 ){.    Tcl_Ap
15d50 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
15d60 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
15d70 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
15d80 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
15d90 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
15da0 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d  jv[0], 0), " STM
15db0 54 20 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a  T N VALUE", 0);.
15dc0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
15dd0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
15de0 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
15df0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
15e00 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
15e10 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
15e20 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
15e30 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
15e40 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
15e50 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74  [2], &idx) ) ret
15e60 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
15e70 20 20 2f 2a 20 49 6e 74 65 72 63 65 70 74 20 74    /* Intercept t
15e80 68 65 20 73 74 72 69 6e 67 20 22 4e 61 4e 22 20  he string "NaN" 
15e90 61 6e 64 20 67 65 6e 65 72 61 74 65 20 61 20 4e  and generate a N
15ea0 61 4e 20 76 61 6c 75 65 20 66 6f 72 20 69 74 2e  aN value for it.
15eb0 0a 20 20 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20  .  ** All other 
15ec0 73 74 72 69 6e 67 73 20 61 72 65 20 70 61 73 73  strings are pass
15ed0 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 54 63  ed through to Tc
15ee0 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f  l_GetDoubleFromO
15ef0 62 6a 28 29 2e 0a 20 20 2a 2a 20 54 63 6c 5f 47  bj()..  ** Tcl_G
15f00 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28  etDoubleFromObj(
15f10 29 20 73 68 6f 75 6c 64 20 75 6e 64 65 72 73 74  ) should underst
15f20 61 6e 64 20 22 4e 61 4e 22 20 62 75 74 20 73 6f  and "NaN" but so
15f30 6d 65 20 76 65 72 73 69 6f 6e 73 0a 20 20 2a 2a  me versions.  **
15f40 20 63 6f 6e 74 61 69 6e 20 61 20 62 75 67 2e 0a   contain a bug..
15f50 20 20 2a 2f 0a 20 20 7a 56 61 6c 20 3d 20 54 63    */.  zVal = Tc
15f60 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
15f70 5b 33 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  [3]);.  for(i=0;
15f80 20 69 3c 73 69 7a 65 6f 66 28 61 53 70 65 63 69   i<sizeof(aSpeci
15f90 61 6c 46 70 29 2f 73 69 7a 65 6f 66 28 61 53 70  alFp)/sizeof(aSp
15fa0 65 63 69 61 6c 46 70 5b 30 5d 29 3b 20 69 2b 2b  ecialFp[0]); i++
15fb0 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
15fc0 70 28 61 53 70 65 63 69 61 6c 46 70 5b 69 5d 2e  p(aSpecialFp[i].
15fd0 7a 4e 61 6d 65 2c 20 7a 56 61 6c 29 3d 3d 30 20  zName, zVal)==0 
15fe0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15ff0 5f 75 69 6e 74 36 34 20 78 3b 0a 20 20 20 20 20  _uint64 x;.     
16000 20 78 20 3d 20 61 53 70 65 63 69 61 6c 46 70 5b   x = aSpecialFp[
16010 69 5d 2e 69 55 70 70 65 72 3b 0a 20 20 20 20 20  i].iUpper;.     
16020 20 78 20 3c 3c 3d 20 33 32 3b 0a 20 20 20 20 20   x <<= 32;.     
16030 20 78 20 7c 3d 20 61 53 70 65 63 69 61 6c 46 70   x |= aSpecialFp
16040 5b 69 5d 2e 69 4c 6f 77 65 72 3b 0a 20 20 20 20  [i].iLower;.    
16050 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
16060 28 76 61 6c 75 65 29 3d 3d 38 20 29 3b 0a 20 20  (value)==8 );.  
16070 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
16080 6f 66 28 78 29 3d 3d 38 20 29 3b 0a 20 20 20 20  of(x)==8 );.    
16090 20 20 6d 65 6d 63 70 79 28 26 76 61 6c 75 65 2c    memcpy(&value,
160a0 20 26 78 2c 20 38 29 3b 0a 20 20 20 20 20 20 62   &x, 8);.      b
160b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
160c0 20 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28    if( i>=sizeof(
160d0 61 53 70 65 63 69 61 6c 46 70 29 2f 73 69 7a 65  aSpecialFp)/size
160e0 6f 66 28 61 53 70 65 63 69 61 6c 46 70 5b 30 5d  of(aSpecialFp[0]
160f0 29 20 26 26 0a 20 20 20 20 20 20 20 20 20 54 63  ) &&.         Tc
16100 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f  l_GetDoubleFromO
16110 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
16120 33 5d 2c 20 26 76 61 6c 75 65 29 20 29 7b 0a 20  3], &value) ){. 
16130 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
16140 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ROR;.  }.  rc = 
16150 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75  sqlite3_bind_dou
16160 62 6c 65 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  ble(pStmt, idx, 
16170 76 61 6c 75 65 29 3b 0a 20 20 69 66 28 20 73 71  value);.  if( sq
16180 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
16190 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44  (interp, StmtToD
161a0 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20  b(pStmt), rc) ) 
161b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
161c0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
161d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
161e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
161f0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
16200 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
16210 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
16220 69 6e 64 5f 6e 75 6c 6c 20 20 53 54 4d 54 20 4e  ind_null  STMT N
16230 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20  .**.** Test the 
16240 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c  sqlite3_bind_nul
16250 6c 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54  l interface.  ST
16260 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64  MT is a prepared
16270 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e   statement..** N
16280 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
16290 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74   a wildcard in t
162a0 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
162b0 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d  ement.  This com
162c0 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20  mand.** binds a 
162d0 4e 55 4c 4c 20 74 6f 20 74 68 65 20 77 69 6c 64  NULL to the wild
162e0 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  card..*/.static 
162f0 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 6e 75  int test_bind_nu
16300 6c 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ll(.  void * cli
16310 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
16320 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
16330 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
16340 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
16350 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
16360 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
16370 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 72 63  nt idx;.  int rc
16380 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
16390 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
163a0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
163b0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
163c0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
163d0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
163e0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
163f0 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20  [0], 0), " STMT 
16400 4e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  N", 0);.    retu
16410 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16420 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
16430 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
16440 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
16450 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
16460 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
16470 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
16480 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
16490 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64  rp, objv[2], &id
164a0 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  x) ) return TCL_
164b0 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
164c0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c  qlite3_bind_null
164d0 28 70 53 74 6d 74 2c 20 69 64 78 29 3b 0a 20 20  (pStmt, idx);.  
164e0 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
164f0 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53  rrCode(interp, S
16500 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20  tmtToDb(pStmt), 
16510 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
16520 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
16530 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16540 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
16550 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ROR;.  }..  retu
16560 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
16570 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
16580 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 20 20  ite3_bind_text  
16590 53 54 4d 54 20 4e 20 53 54 52 49 4e 47 20 42 59  STMT N STRING BY
165a0 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  TES.**.** Test t
165b0 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  he sqlite3_bind_
165c0 74 65 78 74 20 69 6e 74 65 72 66 61 63 65 2e 20  text interface. 
165d0 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61   STMT is a prepa
165e0 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  red statement..*
165f0 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78  * N is the index
16600 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69   of a wildcard i
16610 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
16620 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20  tatement.  This 
16630 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73  command.** binds
16640 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20   a UTF-8 string 
16650 53 54 52 49 4e 47 20 74 6f 20 74 68 65 20 77 69  STRING to the wi
16660 6c 64 63 61 72 64 2e 20 20 54 68 65 20 73 74 72  ldcard.  The str
16670 69 6e 67 20 69 73 20 42 59 54 45 53 20 62 79 74  ing is BYTES byt
16680 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73  es.** long..*/.s
16690 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
166a0 69 6e 64 5f 74 65 78 74 28 0a 20 20 76 6f 69 64  ind_text(.  void
166b0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
166c0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
166d0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
166e0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
166f0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
16700 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
16710 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  t;.  int idx;.  
16720 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 68 61  int bytes;.  cha
16730 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20  r *value;.  int 
16740 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
16750 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =5 ){.    Tcl_Ap
16760 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
16770 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
16780 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
16790 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
167a0 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
167b0 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d  jv[0], 0), " STM
167c0 54 20 4e 20 56 41 4c 55 45 20 42 59 54 45 53 22  T N VALUE BYTES"
167d0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
167e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
167f0 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
16800 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
16810 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
16820 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
16830 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16840 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
16850 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
16860 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29  , objv[2], &idx)
16870 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
16880 52 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d 20 28  ROR;.  value = (
16890 63 68 61 72 2a 29 54 63 6c 5f 47 65 74 42 79 74  char*)Tcl_GetByt
168a0 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
168b0 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 3b 0a  jv[3], &bytes);.
168c0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
168d0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
168e0 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73 29  objv[4], &bytes)
168f0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
16900 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
16910 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
16920 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65  Stmt, idx, value
16930 2c 20 62 79 74 65 73 2c 20 53 51 4c 49 54 45 5f  , bytes, SQLITE_
16940 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 69 66  TRANSIENT);.  if
16950 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
16960 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d  Code(interp, Stm
16970 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63  tToDb(pStmt), rc
16980 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
16990 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d  RROR;.  if( rc!=
169a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
169b0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
169c0 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65  t(interp, sqlite
169d0 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 30 29  3ErrName(rc), 0)
169e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
169f0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72  _ERROR;.  }..  r
16a00 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
16a10 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
16a20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
16a30 74 31 36 20 3f 2d 73 74 61 74 69 63 3f 20 53 54  t16 ?-static? ST
16a40 4d 54 20 4e 20 53 54 52 49 4e 47 20 42 59 54 45  MT N STRING BYTE
16a50 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65  S.**.** Test the
16a60 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
16a70 78 74 31 36 20 69 6e 74 65 72 66 61 63 65 2e 20  xt16 interface. 
16a80 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61   STMT is a prepa
16a90 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  red statement..*
16aa0 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78  * N is the index
16ab0 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69   of a wildcard i
16ac0 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
16ad0 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20  tatement.  This 
16ae0 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73  command.** binds
16af0 20 61 20 55 54 46 2d 31 36 20 73 74 72 69 6e 67   a UTF-16 string
16b00 20 53 54 52 49 4e 47 20 74 6f 20 74 68 65 20 77   STRING to the w
16b10 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 73 74  ildcard.  The st
16b20 72 69 6e 67 20 69 73 20 42 59 54 45 53 20 62 79  ring is BYTES by
16b30 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a  tes.** long..*/.
16b40 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
16b50 62 69 6e 64 5f 74 65 78 74 31 36 28 0a 20 20 76  bind_text16(.  v
16b60 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
16b70 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
16b80 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
16b90 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
16ba0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
16bb0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16bc0 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74  IT_UTF16.  sqlit
16bd0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
16be0 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74    int idx;.  int
16bf0 20 62 79 74 65 73 3b 0a 20 20 63 68 61 72 20 2a   bytes;.  char *
16c00 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b  value;.  int rc;
16c10 0a 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29  ..  void (*xDel)
16c20 28 76 6f 69 64 2a 29 20 3d 20 28 6f 62 6a 63 3d  (void*) = (objc=
16c30 3d 36 3f 53 51 4c 49 54 45 5f 53 54 41 54 49 43  =6?SQLITE_STATIC
16c40 3a 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e  :SQLITE_TRANSIEN
16c50 54 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f  T);.  Tcl_Obj *o
16c60 53 74 6d 74 20 20 20 20 3d 20 6f 62 6a 76 5b 6f  Stmt    = objv[o
16c70 62 6a 63 2d 34 5d 3b 0a 20 20 54 63 6c 5f 4f 62  bjc-4];.  Tcl_Ob
16c80 6a 20 2a 6f 4e 20 20 20 20 20 20 20 3d 20 6f 62  j *oN       = ob
16c90 6a 76 5b 6f 62 6a 63 2d 33 5d 3b 0a 20 20 54 63  jv[objc-3];.  Tc
16ca0 6c 5f 4f 62 6a 20 2a 6f 53 74 72 69 6e 67 20 20  l_Obj *oString  
16cb0 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d 3b 0a  = objv[objc-2];.
16cc0 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 42 79 74 65    Tcl_Obj *oByte
16cd0 73 20 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d  s   = objv[objc-
16ce0 31 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  1];..  if( objc!
16cf0 3d 35 20 26 26 20 6f 62 6a 63 21 3d 36 29 7b 0a  =5 && objc!=6){.
16d00 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
16d10 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
16d20 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
16d30 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
16d40 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
16d50 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
16d60 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41   0), " STMT N VA
16d70 4c 55 45 20 42 59 54 45 53 22 2c 20 30 29 3b 0a  LUE BYTES", 0);.
16d80 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
16d90 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
16da0 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
16db0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
16dc0 74 72 69 6e 67 28 6f 53 74 6d 74 29 2c 20 26 70  tring(oStmt), &p
16dd0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
16de0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
16df0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
16e00 6a 28 69 6e 74 65 72 70 2c 20 6f 4e 2c 20 26 69  j(interp, oN, &i
16e10 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  dx) ) return TCL
16e20 5f 45 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65 20  _ERROR;.  value 
16e30 3d 20 28 63 68 61 72 2a 29 54 63 6c 5f 47 65 74  = (char*)Tcl_Get
16e40 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
16e50 28 6f 53 74 72 69 6e 67 2c 20 30 29 3b 0a 20 20  (oString, 0);.  
16e60 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
16e70 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 42  omObj(interp, oB
16e80 79 74 65 73 2c 20 26 62 79 74 65 73 29 20 29 20  ytes, &bytes) ) 
16e90 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16ea0 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
16eb0 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 28 70 53  3_bind_text16(pS
16ec0 74 6d 74 2c 20 69 64 78 2c 20 28 76 6f 69 64 20  tmt, idx, (void 
16ed0 2a 29 76 61 6c 75 65 2c 20 62 79 74 65 73 2c 20  *)value, bytes, 
16ee0 78 44 65 6c 29 3b 0a 20 20 69 66 28 20 73 71 6c  xDel);.  if( sql
16ef0 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
16f00 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62  interp, StmtToDb
16f10 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72  (pStmt), rc) ) r
16f20 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16f30 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
16f40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
16f50 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
16f60 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  erp, sqlite3ErrN
16f70 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20  ame(rc), 0);.   
16f80 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16f90 52 3b 0a 20 20 7d 0a 0a 23 65 6e 64 69 66 20 2f  R;.  }..#endif /
16fa0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
16fb0 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  F16 */.  return 
16fc0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
16fd0 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
16fe0 33 5f 62 69 6e 64 5f 62 6c 6f 62 20 3f 2d 73 74  3_bind_blob ?-st
16ff0 61 74 69 63 3f 20 53 54 4d 54 20 4e 20 44 41 54  atic? STMT N DAT
17000 41 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65  A BYTES.**.** Te
17010 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  st the sqlite3_b
17020 69 6e 64 5f 62 6c 6f 62 20 69 6e 74 65 72 66 61  ind_blob interfa
17030 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70  ce.  STMT is a p
17040 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
17050 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69  t..** N is the i
17060 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61  ndex of a wildca
17070 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72  rd in the prepar
17080 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ed statement.  T
17090 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62  his command.** b
170a0 69 6e 64 73 20 61 20 42 4c 4f 42 20 74 6f 20 74  inds a BLOB to t
170b0 68 65 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68  he wildcard.  Th
170c0 65 20 42 4c 4f 42 20 69 73 20 42 59 54 45 53 20  e BLOB is BYTES 
170d0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
170e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
170f0 74 5f 62 69 6e 64 5f 62 6c 6f 62 28 0a 20 20 76  t_bind_blob(.  v
17100 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
17110 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
17120 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
17130 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
17140 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
17150 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
17160 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Stmt;.  int idx;
17170 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20  .  int bytes;.  
17180 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69  char *value;.  i
17190 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
171a0 5f 64 65 73 74 72 75 63 74 6f 72 5f 74 79 70 65  _destructor_type
171b0 20 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 53   xDestructor = S
171c0 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 3b  QLITE_TRANSIENT;
171d0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20  ..  if( objc!=5 
171e0 26 26 20 6f 62 6a 63 21 3d 36 20 29 7b 0a 20 20  && objc!=6 ){.  
171f0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
17200 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
17210 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
17220 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
17230 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
17240 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
17250 29 2c 20 22 20 53 54 4d 54 20 4e 20 44 41 54 41  ), " STMT N DATA
17260 20 42 59 54 45 53 22 2c 20 30 29 3b 0a 20 20 20   BYTES", 0);.   
17270 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17280 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f 62  R;.  }..  if( ob
17290 6a 63 3d 3d 36 20 29 7b 0a 20 20 20 20 78 44 65  jc==6 ){.    xDe
172a0 73 74 72 75 63 74 6f 72 20 3d 20 53 51 4c 49 54  structor = SQLIT
172b0 45 5f 53 54 41 54 49 43 3b 0a 20 20 20 20 6f 62  E_STATIC;.    ob
172c0 6a 76 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  jv++;.  }..  if(
172d0 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
172e0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
172f0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
17300 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
17310 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
17320 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
17330 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
17340 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74  [2], &idx) ) ret
17350 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17360 20 76 61 6c 75 65 20 3d 20 54 63 6c 5f 47 65 74   value = Tcl_Get
17370 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b  String(objv[3]);
17380 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
17390 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
173a0 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73   objv[4], &bytes
173b0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
173c0 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
173d0 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28  lite3_bind_blob(
173e0 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75  pStmt, idx, valu
173f0 65 2c 20 62 79 74 65 73 2c 20 78 44 65 73 74 72  e, bytes, xDestr
17400 75 63 74 6f 72 29 3b 0a 20 20 69 66 28 20 73 71  uctor);.  if( sq
17410 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
17420 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44  (interp, StmtToD
17430 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20  b(pStmt), rc) ) 
17440 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17450 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
17460 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
17470 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17480 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
17490 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
174a0 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
174b0 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f  ind_parameter_co
174c0 75 6e 74 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20  unt  STMT.**.** 
174d0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
174e0 72 20 6f 66 20 77 69 6c 64 63 61 72 64 73 20 69  r of wildcards i
174f0 6e 20 74 68 65 20 67 69 76 65 6e 20 73 74 61 74  n the given stat
17500 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
17510 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 70   int test_bind_p
17520 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 0a  arameter_count(.
17530 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
17540 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
17550 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
17560 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
17570 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
17580 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
17590 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20   *pStmt;..  if( 
175a0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
175b0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
175c0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
175d0 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65   "STMT");.    re
175e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
175f0 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d    }.  if( getStm
17600 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
17610 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
17620 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
17630 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
17640 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ROR;.  Tcl_SetOb
17650 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
17660 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71  Tcl_NewIntObj(sq
17670 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
17680 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74  eter_count(pStmt
17690 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )));.  return TC
176a0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
176b0 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
176c0 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e  bind_parameter_n
176d0 61 6d 65 20 20 53 54 4d 54 20 20 4e 0a 2a 2a 0a  ame  STMT  N.**.
176e0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  ** Return the na
176f0 6d 65 20 6f 66 20 74 68 65 20 4e 74 68 20 77 69  me of the Nth wi
17700 6c 64 63 61 72 64 2e 20 20 54 68 65 20 66 69 72  ldcard.  The fir
17710 73 74 20 77 69 6c 64 63 61 72 64 20 69 73 20 31  st wildcard is 1
17720 2e 0a 2a 2a 20 41 6e 20 65 6d 70 74 79 20 73 74  ..** An empty st
17730 72 69 6e 67 20 69 73 20 72 65 74 75 72 6e 65 64  ring is returned
17740 20 69 66 20 4e 20 69 73 20 6f 75 74 20 6f 66 20   if N is out of 
17750 72 61 6e 67 65 20 6f 72 20 69 66 20 74 68 65 20  range or if the 
17760 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69 73 20 6e  wildcard.** is n
17770 61 6d 65 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74  ameless..*/.stat
17780 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
17790 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28  _parameter_name(
177a0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
177b0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
177c0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
177d0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
177e0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
177f0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
17800 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
17810 69 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  i;..  if( objc!=
17820 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  3 ){.    Tcl_Wro
17830 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
17840 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54  , 1, objv, "STMT
17850 20 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   N");.    return
17860 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
17870 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
17880 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
17890 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
178a0 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
178b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
178c0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
178d0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
178e0 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 29 20 29 20   objv[2], &i) ) 
178f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17900 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
17910 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20  sult(interp, .  
17920 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
17930 4f 62 6a 28 73 71 6c 69 74 65 33 5f 62 69 6e 64  Obj(sqlite3_bind
17940 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28  _parameter_name(
17950 70 53 74 6d 74 2c 69 29 2c 2d 31 29 0a 20 20 29  pStmt,i),-1).  )
17960 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
17970 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
17980 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  e:   sqlite3_bin
17990 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65  d_parameter_inde
179a0 78 20 20 53 54 4d 54 20 20 4e 41 4d 45 0a 2a 2a  x  STMT  NAME.**
179b0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69  .** Return the i
179c0 6e 64 65 78 20 6f 66 20 74 68 65 20 77 69 6c 64  ndex of the wild
179d0 63 61 72 64 20 63 61 6c 6c 65 64 20 4e 41 4d 45  card called NAME
179e0 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74  .  Return 0 if t
179f0 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 73 75  here is.** no su
17a00 63 68 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a  ch wildcard..*/.
17a10 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
17a20 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69  bind_parameter_i
17a30 6e 64 65 78 28 0a 20 20 76 6f 69 64 20 2a 20 63  ndex(.  void * c
17a40 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
17a50 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
17a60 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
17a70 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
17a80 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
17a90 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a  3_stmt *pStmt;..
17aa0 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
17ab0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
17ac0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
17ad0 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20 4e 41 4d   objv, "STMT NAM
17ae0 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  E");.    return 
17af0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
17b00 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
17b10 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
17b20 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
17b30 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
17b40 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17b50 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
17b60 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20 20 20  lt(interp, .    
17b70 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 0a   Tcl_NewIntObj(.
17b80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
17b90 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e  ind_parameter_in
17ba0 64 65 78 28 70 53 74 6d 74 2c 54 63 6c 5f 47 65  dex(pStmt,Tcl_Ge
17bb0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
17bc0 29 0a 20 20 20 20 20 29 0a 20 20 29 3b 0a 20 20  ).     ).  );.  
17bd0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
17be0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
17bf0 20 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62   sqlite3_clear_b
17c00 69 6e 64 69 6e 67 73 20 53 54 4d 54 0a 2a 2a 0a  indings STMT.**.
17c10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
17c20 73 74 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67  st_clear_binding
17c30 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  s(.  void * clie
17c40 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
17c50 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
17c60 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
17c70 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
17c80 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
17c90 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69  tmt *pStmt;..  i
17ca0 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
17cb0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
17cc0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
17cd0 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20  jv, "STMT");.   
17ce0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17cf0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
17d00 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
17d10 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
17d20 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
17d30 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
17d40 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65  _ERROR;.  Tcl_Se
17d50 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
17d60 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
17d70 28 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62  (sqlite3_clear_b
17d80 69 6e 64 69 6e 67 73 28 70 53 74 6d 74 29 29 29  indings(pStmt)))
17d90 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
17da0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
17db0 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65  e:   sqlite3_sle
17dc0 65 70 20 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 0a  ep MILLISECONDS.
17dd0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
17de0 73 74 5f 73 6c 65 65 70 28 0a 20 20 76 6f 69 64  st_sleep(.  void
17df0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
17e00 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
17e10 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
17e20 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
17e30 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e  T objv[].){.  in
17e40 74 20 6d 73 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t ms;..  if( obj
17e50 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
17e60 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
17e70 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 4d  erp, 1, objv, "M
17e80 49 4c 4c 49 53 45 43 4f 4e 44 53 22 29 3b 0a 20  ILLISECONDS");. 
17e90 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
17ea0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  ROR;.  }.  if( T
17eb0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
17ec0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
17ed0 2c 20 26 6d 73 29 20 29 7b 0a 20 20 20 20 72 65  , &ms) ){.    re
17ee0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17ef0 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a    }.  Tcl_SetObj
17f00 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
17f10 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c  cl_NewIntObj(sql
17f20 69 74 65 33 5f 73 6c 65 65 70 28 6d 73 29 29 29  ite3_sleep(ms)))
17f30 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
17f40 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
17f50 65 3a 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  e: sqlite3_exten
17f60 64 65 64 5f 65 72 72 63 6f 64 65 20 44 42 0a 2a  ded_errcode DB.*
17f70 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
17f80 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74  string represent
17f90 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73  ation of the mos
17fa0 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33  t recent sqlite3
17fb0 5f 2a 20 41 50 49 0a 2a 2a 20 65 72 72 6f 72 20  _* API.** error 
17fc0 63 6f 64 65 2e 20 65 2e 67 2e 20 22 53 51 4c 49  code. e.g. "SQLI
17fd0 54 45 5f 45 52 52 4f 52 22 2e 0a 2a 2f 0a 73 74  TE_ERROR"..*/.st
17fe0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 78  atic int test_ex
17ff0 5f 65 72 72 63 6f 64 65 28 0a 20 20 76 6f 69 64  _errcode(.  void
18000 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
18010 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
18020 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
18030 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
18040 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
18050 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
18060 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
18070 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
18080 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
18090 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
180a0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
180b0 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
180c0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
180d0 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20  , " DB", 0);.   
180e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
180f0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
18100 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
18110 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
18120 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
18130 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
18140 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
18150 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f  3_extended_errco
18160 64 65 28 64 62 29 3b 0a 20 20 54 63 6c 5f 41 70  de(db);.  Tcl_Ap
18170 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
18180 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
18190 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a  orName(rc), 0);.
181a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
181b0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  .}.../*.** Usage
181c0 3a 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  : sqlite3_errcod
181d0 65 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  e DB.**.** Retur
181e0 6e 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70  n the string rep
181f0 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
18200 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73  he most recent s
18210 71 6c 69 74 65 33 5f 2a 20 41 50 49 0a 2a 2a 20  qlite3_* API.** 
18220 65 72 72 6f 72 20 63 6f 64 65 2e 20 65 2e 67 2e  error code. e.g.
18230 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52 22 2e   "SQLITE_ERROR".
18240 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
18250 65 73 74 5f 65 72 72 63 6f 64 65 28 0a 20 20 76  est_errcode(.  v
18260 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
18270 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
18280 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
18290 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
182a0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
182b0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
182c0 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
182d0 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
182e0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
182f0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
18300 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
18310 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
18320 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
18330 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a  0]), " DB", 0);.
18340 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
18350 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
18360 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
18370 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
18380 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
18390 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
183a0 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
183b0 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29  ite3_errcode(db)
183c0 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
183d0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
183e0 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
183f0 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75  (rc), 0);.  retu
18400 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
18410 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
18420 69 74 65 33 5f 65 72 72 6d 73 67 20 44 42 0a 2a  ite3_errmsg DB.*
18430 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65  *.** Returns the
18440 20 55 54 46 2d 38 20 72 65 70 72 65 73 65 6e 74   UTF-8 represent
18450 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 72 72  ation of the err
18460 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e  or message strin
18470 67 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6d 6f 73  g for the.** mos
18480 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33  t recent sqlite3
18490 5f 2a 20 41 50 49 20 63 61 6c 6c 2e 0a 2a 2f 0a  _* API call..*/.
184a0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
184b0 65 72 72 6d 73 67 28 0a 20 20 76 6f 69 64 20 2a  errmsg(.  void *
184c0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
184d0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
184e0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
184f0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
18500 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
18510 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
18520 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 0a 20 20   char *zErr;..  
18530 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
18540 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
18550 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
18560 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
18570 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
18580 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
18590 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c  objv[0]), " DB",
185a0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
185b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
185c0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
185d0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
185e0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
185f0 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
18600 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 45  TCL_ERROR;..  zE
18610 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72  rr = sqlite3_err
18620 6d 73 67 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53  msg(db);.  Tcl_S
18630 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
18640 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
18650 67 4f 62 6a 28 7a 45 72 72 2c 20 2d 31 29 29 3b  gObj(zErr, -1));
18660 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
18670 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
18680 3a 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67 31  :   test_errmsg1
18690 36 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  6 DB.**.** Retur
186a0 6e 73 20 74 68 65 20 55 54 46 2d 31 36 20 72 65  ns the UTF-16 re
186b0 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
186c0 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
186d0 65 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65  e string for the
186e0 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  .** most recent 
186f0 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 20 63 61  sqlite3_* API ca
18700 6c 6c 2e 20 54 68 69 73 20 69 73 20 61 20 62 79  ll. This is a by
18710 74 65 20 61 72 72 61 79 20 6f 62 6a 65 63 74 20  te array object 
18720 61 74 20 74 68 65 20 54 43 4c 20 0a 2a 2a 20 6c  at the TCL .** l
18730 65 76 65 6c 2c 20 61 6e 64 20 69 74 20 69 6e 63  evel, and it inc
18740 6c 75 64 65 73 20 74 68 65 20 30 78 30 30 20 30  ludes the 0x00 0
18750 78 30 30 20 74 65 72 6d 69 6e 61 74 6f 72 20 62  x00 terminator b
18760 79 74 65 73 20 61 74 20 74 68 65 20 65 6e 64 20  ytes at the end 
18770 6f 66 20 74 68 65 0a 2a 2a 20 55 54 46 2d 31 36  of the.** UTF-16
18780 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74   string..*/.stat
18790 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72 72 6d  ic int test_errm
187a0 73 67 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63  sg16(.  void * c
187b0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
187c0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
187d0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
187e0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
187f0 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20  jv[].){.#ifndef 
18800 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
18810 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  6.  sqlite3 *db;
18820 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
18830 45 72 72 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  Err;.  const cha
18840 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 62 79 74 65  r *z;.  int byte
18850 73 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62  s = 0;..  if( ob
18860 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
18870 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
18880 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
18890 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
188a0 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
188b0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
188c0 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20  ]), " DB", 0);. 
188d0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
188e0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
188f0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
18900 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
18910 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
18920 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
18930 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20 3d 20 73  ROR;..  zErr = s
18940 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36 28  qlite3_errmsg16(
18950 64 62 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20  db);.  if( zErr 
18960 29 7b 0a 20 20 20 20 7a 20 3d 20 7a 45 72 72 3b  ){.    z = zErr;
18970 0a 20 20 20 20 66 6f 72 28 62 79 74 65 73 3d 30  .    for(bytes=0
18980 3b 20 7a 5b 62 79 74 65 73 5d 20 7c 7c 20 7a 5b  ; z[bytes] || z[
18990 62 79 74 65 73 2b 31 5d 3b 20 62 79 74 65 73 2b  bytes+1]; bytes+
189a0 3d 32 29 7b 7d 0a 20 20 7d 0a 20 20 54 63 6c 5f  =2){}.  }.  Tcl_
189b0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
189c0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65  erp, Tcl_NewByte
189d0 41 72 72 61 79 4f 62 6a 28 7a 45 72 72 2c 20 62  ArrayObj(zErr, b
189e0 79 74 65 73 29 29 3b 0a 23 65 6e 64 69 66 20 2f  ytes));.#endif /
189f0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
18a00 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  F16 */.  return 
18a10 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
18a20 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
18a30 70 72 65 70 61 72 65 20 44 42 20 73 71 6c 20 62  prepare DB sql b
18a40 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 0a 2a  ytes ?tailvar?.*
18a50 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20  *.** Compile up 
18a60 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65 73  to <bytes> bytes
18a70 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
18a80 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c   SQL string <sql
18a90 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62  > using.** datab
18aa0 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e  ase handle <DB>.
18ab0 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 3c   The parameter <
18ac0 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65 20  tailval> is the 
18ad0 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c  name of a global
18ae0 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68 61  .** variable tha
18af0 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
18b00 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f  unused portion o
18b10 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79 29  f <sql> (if any)
18b20 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64  . A.** STMT hand
18b30 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  le is returned..
18b40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
18b50 73 74 5f 70 72 65 70 61 72 65 28 0a 20 20 76 6f  st_prepare(.  vo
18b60 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
18b70 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
18b80 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
18b90 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
18ba0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
18bb0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
18bc0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b  onst char *zSql;
18bd0 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20  .  int bytes;.  
18be0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 69  const char *zTai
18bf0 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  l = 0;.  sqlite3
18c00 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
18c10 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30  ;.  char zBuf[50
18c20 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ];.  int rc;..  
18c30 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f  if( objc!=5 && o
18c40 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
18c50 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
18c60 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
18c70 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
18c80 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
18c90 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
18ca0 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79  0]), " DB sql by
18cb0 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 22 2c 20  tes ?tailvar?", 
18cc0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
18cd0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
18ce0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
18cf0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
18d00 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
18d10 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
18d20 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c  CL_ERROR;.  zSql
18d30 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
18d40 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28  (objv[2]);.  if(
18d50 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
18d60 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
18d70 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65  3], &bytes) ) re
18d80 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18d90 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
18da0 70 72 65 70 61 72 65 28 64 62 2c 20 7a 53 71 6c  prepare(db, zSql
18db0 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c  , bytes, &pStmt,
18dc0 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54 61 69   objc>=5 ? &zTai
18dd0 6c 20 3a 20 30 29 3b 0a 20 20 54 63 6c 5f 52 65  l : 0);.  Tcl_Re
18de0 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  setResult(interp
18df0 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
18e00 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
18e10 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65  rp, db, rc) ) re
18e20 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18e30 20 20 69 66 28 20 7a 54 61 69 6c 20 26 26 20 6f    if( zTail && o
18e40 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20 20 69 66  bjc>=5 ){.    if
18e50 28 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20  ( bytes>=0 ){.  
18e60 20 20 20 20 62 79 74 65 73 20 3d 20 62 79 74 65      bytes = byte
18e70 73 20 2d 20 28 69 6e 74 29 28 7a 54 61 69 6c 2d  s - (int)(zTail-
18e80 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zSql);.    }.   
18e90 20 69 66 28 20 28 69 6e 74 29 73 74 72 6c 65 6e   if( (int)strlen
18ea0 28 7a 54 61 69 6c 29 3c 62 79 74 65 73 20 29 7b  (zTail)<bytes ){
18eb0 0a 20 20 20 20 20 20 62 79 74 65 73 20 3d 20 28  .      bytes = (
18ec0 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54 61 69 6c  int)strlen(zTail
18ed0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  );.    }.    Tcl
18ee0 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65  _ObjSetVar2(inte
18ef0 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20  rp, objv[4], 0, 
18f00 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
18f10 28 7a 54 61 69 6c 2c 20 62 79 74 65 73 29 2c 20  (zTail, bytes), 
18f20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
18f30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18f40 20 20 20 61 73 73 65 72 74 28 20 70 53 74 6d 74     assert( pStmt
18f50 3d 3d 30 20 29 3b 0a 20 20 20 20 73 70 72 69 6e  ==0 );.    sprin
18f60 74 66 28 7a 42 75 66 2c 20 22 28 25 64 29 20 22  tf(zBuf, "(%d) "
18f70 2c 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41  , rc);.    Tcl_A
18f80 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
18f90 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65  rp, zBuf, sqlite
18fa0 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29  3_errmsg(db), 0)
18fb0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
18fc0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
18fd0 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  f( pStmt ){.    
18fe0 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d  if( sqlite3TestM
18ff0 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e  akePointerStr(in
19000 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d  terp, zBuf, pStm
19010 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
19020 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41  ERROR;.    Tcl_A
19030 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
19040 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20  rp, zBuf, 0);.  
19050 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
19060 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
19070 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  e: sqlite3_prepa
19080 72 65 5f 76 32 20 44 42 20 73 71 6c 20 62 79 74  re_v2 DB sql byt
19090 65 73 20 3f 74 61 69 6c 76 61 72 3f 0a 2a 2a 0a  es ?tailvar?.**.
190a0 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f  ** Compile up to
190b0 20 3c 62 79 74 65 73 3e 20 62 79 74 65 73 20 6f   <bytes> bytes o
190c0 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 53  f the supplied S
190d0 51 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20  QL string <sql> 
190e0 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73  using.** databas
190f0 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54  e handle <DB>. T
19100 68 65 20 70 61 72 61 6d 65 74 65 72 20 3c 74 61  he parameter <ta
19110 69 6c 76 61 6c 3e 20 69 73 20 74 68 65 20 6e 61  ilval> is the na
19120 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a  me of a global.*
19130 2a 20 76 61 72 69 61 62 6c 65 20 74 68 61 74 20  * variable that 
19140 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 75 6e  is set to the un
19150 75 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20  used portion of 
19160 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20  <sql> (if any). 
19170 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65  A.** STMT handle
19180 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
19190 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
191a0 5f 70 72 65 70 61 72 65 5f 76 32 28 0a 20 20 76  _prepare_v2(.  v
191b0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
191c0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
191d0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
191e0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
191f0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
19200 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
19210 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
19220 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20  ;.  int bytes;. 
19230 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
19240 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  il = 0;.  sqlite
19250 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
19260 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35  0;.  char zBuf[5
19270 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  0];.  int rc;.. 
19280 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20   if( objc!=5 && 
19290 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
192a0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
192b0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
192c0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
192d0 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
192e0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
192f0 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62  [0]), " DB sql b
19300 79 74 65 73 20 74 61 69 6c 76 61 72 22 2c 20 30  ytes tailvar", 0
19310 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
19320 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
19330 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
19340 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
19350 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
19360 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
19370 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20  L_ERROR;.  zSql 
19380 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
19390 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20  objv[2]);.  if( 
193a0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
193b0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
193c0 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74  ], &bytes) ) ret
193d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
193e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
193f0 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53  repare_v2(db, zS
19400 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d  ql, bytes, &pStm
19410 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54  t, objc>=5 ? &zT
19420 61 69 6c 20 3a 20 30 29 3b 0a 20 20 61 73 73 65  ail : 0);.  asse
19430 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rt(rc==SQLITE_OK
19440 20 7c 7c 20 70 53 74 6d 74 3d 3d 30 29 3b 0a 20   || pStmt==0);. 
19450 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
19460 28 69 6e 74 65 72 70 29 3b 0a 20 20 69 66 28 20  (interp);.  if( 
19470 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
19480 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
19490 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
194a0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 7a 54 61  ERROR;.  if( zTa
194b0 69 6c 20 26 26 20 6f 62 6a 63 3e 3d 35 20 29 7b  il && objc>=5 ){
194c0 0a 20 20 20 20 69 66 28 20 62 79 74 65 73 3e 3d  .    if( bytes>=
194d0 30 20 29 7b 0a 20 20 20 20 20 20 62 79 74 65 73  0 ){.      bytes
194e0 20 3d 20 62 79 74 65 73 20 2d 20 28 69 6e 74 29   = bytes - (int)
194f0 28 7a 54 61 69 6c 2d 7a 53 71 6c 29 3b 0a 20 20  (zTail-zSql);.  
19500 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53    }.    Tcl_ObjS
19510 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f  etVar2(interp, o
19520 62 6a 76 5b 34 5d 2c 20 30 2c 20 54 63 6c 5f 4e  bjv[4], 0, Tcl_N
19530 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 61 69  ewStringObj(zTai
19540 6c 2c 20 62 79 74 65 73 29 2c 20 30 29 3b 0a 20  l, bytes), 0);. 
19550 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
19560 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
19570 73 65 72 74 28 20 70 53 74 6d 74 3d 3d 30 20 29  sert( pStmt==0 )
19580 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42  ;.    sprintf(zB
19590 75 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29  uf, "(%d) ", rc)
195a0 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
195b0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
195c0 42 75 66 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  Buf, sqlite3_err
195d0 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20  msg(db), 0);.   
195e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
195f0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53  R;.  }..  if( pS
19600 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73  tmt ){.    if( s
19610 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f  qlite3TestMakePo
19620 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c  interStr(interp,
19630 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20   zBuf, pStmt) ) 
19640 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19650 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
19660 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
19670 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Buf, 0);.  }.  r
19680 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
19690 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
196a0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 74 6b  lite3_prepare_tk
196b0 74 33 31 33 34 20 44 42 0a 2a 2a 0a 2a 2a 20 47  t3134 DB.**.** G
196c0 65 6e 65 72 61 74 65 20 61 20 70 72 65 70 61 72  enerate a prepar
196d0 65 64 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72  ed statement for
196e0 20 61 20 7a 65 72 6f 2d 62 79 74 65 20 73 74 72   a zero-byte str
196f0 69 6e 67 20 61 73 20 61 20 74 65 73 74 0a 2a 2a  ing as a test.**
19700 20 66 6f 72 20 74 69 63 6b 65 74 20 23 33 31 33   for ticket #313
19710 34 2e 20 20 54 68 65 20 73 74 72 69 6e 67 20 73  4.  The string s
19720 68 6f 75 6c 64 20 62 65 20 70 72 65 63 65 64 65  hould be precede
19730 64 20 62 79 20 61 20 7a 65 72 6f 20 62 79 74 65  d by a zero byte
19740 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19750 74 65 73 74 5f 70 72 65 70 61 72 65 5f 74 6b 74  test_prepare_tkt
19760 33 31 33 34 28 0a 20 20 76 6f 69 64 20 2a 20 63  3134(.  void * c
19770 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
19780 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
19790 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
197a0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
197b0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
197c0 33 20 2a 64 62 3b 0a 20 20 73 74 61 74 69 63 20  3 *db;.  static 
197d0 63 6f 6e 73 74 20 63 68 61 72 20 7a 53 71 6c 5b  const char zSql[
197e0 5d 20 3d 20 22 5c 30 30 30 53 45 4c 45 43 54 20  ] = "\000SELECT 
197f0 31 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  1";.  sqlite3_st
19800 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
19810 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
19820 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
19830 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
19840 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
19850 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
19860 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
19870 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
19880 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
19890 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20  v[0]), " DB sql 
198a0 62 79 74 65 73 20 74 61 69 6c 76 61 72 22 2c 20  bytes tailvar", 
198b0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
198c0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
198d0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
198e0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
198f0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
19900 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
19910 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
19920 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
19930 5f 76 32 28 64 62 2c 20 26 7a 53 71 6c 5b 31 5d  _v2(db, &zSql[1]
19940 2c 20 30 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b  , 0, &pStmt, 0);
19950 0a 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51  .  assert(rc==SQ
19960 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74  LITE_OK || pStmt
19970 3d 3d 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  ==0);.  if( sqli
19980 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
19990 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
199a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
199b0 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  R;.  if( rc!=SQL
199c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
199d0 73 65 72 74 28 20 70 53 74 6d 74 3d 3d 30 20 29  sert( pStmt==0 )
199e0 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42  ;.    sprintf(zB
199f0 75 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29  uf, "(%d) ", rc)
19a00 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
19a10 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
19a20 42 75 66 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  Buf, sqlite3_err
19a30 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20  msg(db), 0);.   
19a40 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19a50 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53  R;.  }..  if( pS
19a60 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73  tmt ){.    if( s
19a70 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f  qlite3TestMakePo
19a80 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c  interStr(interp,
19a90 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20   zBuf, pStmt) ) 
19aa0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19ab0 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
19ac0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
19ad0 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Buf, 0);.  }.  r
19ae0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
19af0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
19b00 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 20  lite3_prepare16 
19b10 44 42 20 73 71 6c 20 62 79 74 65 73 20 74 61 69  DB sql bytes tai
19b20 6c 76 61 72 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69  lvar.**.** Compi
19b30 6c 65 20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e  le up to <bytes>
19b40 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 73 75   bytes of the su
19b50 70 70 6c 69 65 64 20 53 51 4c 20 73 74 72 69 6e  pplied SQL strin
19b60 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a  g <sql> using.**
19b70 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
19b80 20 3c 44 42 3e 2e 20 54 68 65 20 70 61 72 61 6d   <DB>. The param
19b90 65 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69  eter <tailval> i
19ba0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
19bb0 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62  global.** variab
19bc0 6c 65 20 74 68 61 74 20 69 73 20 73 65 74 20 74  le that is set t
19bd0 6f 20 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72  o the unused por
19be0 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69  tion of <sql> (i
19bf0 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d  f any). A.** STM
19c00 54 20 68 61 6e 64 6c 65 20 69 73 20 72 65 74 75  T handle is retu
19c10 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
19c20 69 6e 74 20 74 65 73 74 5f 70 72 65 70 61 72 65  int test_prepare
19c30 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  16(.  void * cli
19c40 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
19c50 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
19c60 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
19c70 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
19c80 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  [].){.#ifndef SQ
19c90 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
19ca0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
19cb0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71   const void *zSq
19cc0 6c 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  l;.  const void 
19cd0 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 54 63  *zTail = 0;.  Tc
19ce0 6c 5f 4f 62 6a 20 2a 70 54 61 69 6c 20 3d 20 30  l_Obj *pTail = 0
19cf0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
19d00 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63   *pStmt = 0;.  c
19d10 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 20 0a 20  har zBuf[50]; . 
19d20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62   int rc;.  int b
19d30 79 74 65 73 3b 20 20 20 20 20 20 20 20 20 20 20  ytes;           
19d40 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65       /* The inte
19d50 67 65 72 20 73 70 65 63 69 66 69 65 64 20 61 73  ger specified as
19d60 20 61 72 67 20 33 20 2a 2f 0a 20 20 69 6e 74 20   arg 3 */.  int 
19d70 6f 62 6a 6c 65 6e 3b 20 20 20 20 20 20 20 20 20  objlen;         
19d80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74        /* The byt
19d90 65 2d 61 72 72 61 79 20 6c 65 6e 67 74 68 20 6f  e-array length o
19da0 66 20 61 72 67 20 32 20 2a 2f 0a 0a 20 20 69 66  f arg 2 */..  if
19db0 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a  ( objc!=5 && obj
19dc0 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
19dd0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
19de0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
19df0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
19e00 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
19e10 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
19e20 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74 65  ), " DB sql byte
19e30 73 20 3f 74 61 69 6c 76 61 72 3f 22 2c 20 30 29  s ?tailvar?", 0)
19e40 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
19e50 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
19e60 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
19e70 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
19e80 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
19e90 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
19ea0 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d  _ERROR;.  zSql =
19eb0 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
19ec0 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  yFromObj(objv[2]
19ed0 2c 20 26 6f 62 6a 6c 65 6e 29 3b 0a 20 20 69 66  , &objlen);.  if
19ee0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
19ef0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
19f00 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72  [3], &bytes) ) r
19f10 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19f20 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
19f30 5f 70 72 65 70 61 72 65 31 36 28 64 62 2c 20 7a  _prepare16(db, z
19f40 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74  Sql, bytes, &pSt
19f50 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a  mt, objc>=5 ? &z
19f60 54 61 69 6c 20 3a 20 30 29 3b 0a 20 20 69 66 28  Tail : 0);.  if(
19f70 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
19f80 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20  ode(interp, db, 
19f90 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
19fa0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
19fb0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
19fc0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
19fd0 20 69 66 28 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a   if( objc>=5 ){.
19fe0 20 20 20 20 69 66 28 20 7a 54 61 69 6c 20 29 7b      if( zTail ){
19ff0 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20  .      objlen = 
1a000 6f 62 6a 6c 65 6e 20 2d 20 28 69 6e 74 29 28 28  objlen - (int)((
1a010 75 38 20 2a 29 7a 54 61 69 6c 2d 28 75 38 20 2a  u8 *)zTail-(u8 *
1a020 29 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  )zSql);.    }els
1a030 65 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20  e{.      objlen 
1a040 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
1a050 54 61 69 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79  Tail = Tcl_NewBy
1a060 74 65 41 72 72 61 79 4f 62 6a 28 28 75 38 20 2a  teArrayObj((u8 *
1a070 29 7a 54 61 69 6c 2c 20 6f 62 6a 6c 65 6e 29 3b  )zTail, objlen);
1a080 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
1a090 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20  Count(pTail);.  
1a0a0 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
1a0b0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d  (interp, objv[4]
1a0c0 2c 20 30 2c 20 70 54 61 69 6c 2c 20 30 29 3b 0a  , 0, pTail, 0);.
1a0d0 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
1a0e0 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 7d  ount(pTail);.  }
1a0f0 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b  ..  if( pStmt ){
1a100 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1a110 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53  TestMakePointerS
1a120 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  tr(interp, zBuf,
1a130 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e   pStmt) ) return
1a140 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1a150 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1a160 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
1a170 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53   0);.#endif /* S
1a180 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
1a190 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   */.  return TCL
1a1a0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1a1b0 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65  age: sqlite3_pre
1a1c0 70 61 72 65 31 36 5f 76 32 20 44 42 20 73 71 6c  pare16_v2 DB sql
1a1d0 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f   bytes ?tailvar?
1a1e0 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75  .**.** Compile u
1a1f0 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74  p to <bytes> byt
1a200 65 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69  es of the suppli
1a210 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73  ed SQL string <s
1a220 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74  ql> using.** dat
1a230 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42  abase handle <DB
1a240 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  >. The parameter
1a250 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68   <tailval> is th
1a260 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62  e name of a glob
1a270 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74  al.** variable t
1a280 68 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  hat is set to th
1a290 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e  e unused portion
1a2a0 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e   of <sql> (if an
1a2b0 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61  y). A.** STMT ha
1a2c0 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64  ndle is returned
1a2d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a2e0 74 65 73 74 5f 70 72 65 70 61 72 65 31 36 5f 76  test_prepare16_v
1a2f0 32 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  2(.  void * clie
1a300 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1a310 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1a320 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1a330 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1a340 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ].){.#ifndef SQL
1a350 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
1a360 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1a370 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c  const void *zSql
1a380 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ;.  const void *
1a390 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 54 63 6c  zTail = 0;.  Tcl
1a3a0 5f 4f 62 6a 20 2a 70 54 61 69 6c 20 3d 20 30 3b  _Obj *pTail = 0;
1a3b0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1a3c0 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68  *pStmt = 0;.  ch
1a3d0 61 72 20 7a 42 75 66 5b 35 30 5d 3b 20 0a 20 20  ar zBuf[50]; .  
1a3e0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 79  int rc;.  int by
1a3f0 74 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  tes;            
1a400 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67      /* The integ
1a410 65 72 20 73 70 65 63 69 66 69 65 64 20 61 73 20  er specified as 
1a420 61 72 67 20 33 20 2a 2f 0a 20 20 69 6e 74 20 6f  arg 3 */.  int o
1a430 62 6a 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20  bjlen;          
1a440 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65       /* The byte
1a450 2d 61 72 72 61 79 20 6c 65 6e 67 74 68 20 6f 66  -array length of
1a460 20 61 72 67 20 32 20 2a 2f 0a 0a 20 20 69 66 28   arg 2 */..  if(
1a470 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63   objc!=5 && objc
1a480 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
1a490 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1a4a0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1a4b0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1a4c0 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1a4d0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1a4e0 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73  , " DB sql bytes
1a4f0 20 3f 74 61 69 6c 76 61 72 3f 22 2c 20 30 29 3b   ?tailvar?", 0);
1a500 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1a510 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1a520 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
1a530 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1a540 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
1a550 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1a560 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20  ERROR;.  zSql = 
1a570 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
1a580 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
1a590 20 26 6f 62 6a 6c 65 6e 29 3b 0a 20 20 69 66 28   &objlen);.  if(
1a5a0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1a5b0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
1a5c0 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65  3], &bytes) ) re
1a5d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1a5e0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1a5f0 70 72 65 70 61 72 65 31 36 5f 76 32 28 64 62 2c  prepare16_v2(db,
1a600 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70   zSql, bytes, &p
1a610 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20  Stmt, objc>=5 ? 
1a620 26 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20 20 69  &zTail : 0);.  i
1a630 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
1a640 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62  rCode(interp, db
1a650 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
1a660 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
1a670 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
1a680 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1a690 0a 20 20 69 66 28 20 6f 62 6a 63 3e 3d 35 20 29  .  if( objc>=5 )
1a6a0 7b 0a 20 20 20 20 69 66 28 20 7a 54 61 69 6c 20  {.    if( zTail 
1a6b0 29 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20  ){.      objlen 
1a6c0 3d 20 6f 62 6a 6c 65 6e 20 2d 20 28 69 6e 74 29  = objlen - (int)
1a6d0 28 28 75 38 20 2a 29 7a 54 61 69 6c 2d 28 75 38  ((u8 *)zTail-(u8
1a6e0 20 2a 29 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65   *)zSql);.    }e
1a6f0 6c 73 65 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65  lse{.      objle
1a700 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  n = 0;.    }.   
1a710 20 70 54 61 69 6c 20 3d 20 54 63 6c 5f 4e 65 77   pTail = Tcl_New
1a720 42 79 74 65 41 72 72 61 79 4f 62 6a 28 28 75 38  ByteArrayObj((u8
1a730 20 2a 29 7a 54 61 69 6c 2c 20 6f 62 6a 6c 65 6e   *)zTail, objlen
1a740 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  );.    Tcl_IncrR
1a750 65 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a  efCount(pTail);.
1a760 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61      Tcl_ObjSetVa
1a770 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  r2(interp, objv[
1a780 34 5d 2c 20 30 2c 20 70 54 61 69 6c 2c 20 30 29  4], 0, pTail, 0)
1a790 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  ;.    Tcl_DecrRe
1a7a0 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20  fCount(pTail);. 
1a7b0 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20   }..  if( pStmt 
1a7c0 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
1a7d0 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65  e3TestMakePointe
1a7e0 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75  rStr(interp, zBu
1a7f0 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74 75  f, pStmt) ) retu
1a800 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1a810 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  }.  Tcl_AppendRe
1a820 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
1a830 66 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  f, 0);.#endif /*
1a840 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
1a850 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54  16 */.  return T
1a860 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1a870 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6f  Usage: sqlite3_o
1a880 70 65 6e 20 66 69 6c 65 6e 61 6d 65 20 3f 6f 70  pen filename ?op
1a890 74 69 6f 6e 73 2d 6c 69 73 74 3f 0a 2a 2f 0a 73  tions-list?.*/.s
1a8a0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6f  tatic int test_o
1a8b0 70 65 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  pen(.  void * cl
1a8c0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1a8d0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1a8e0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1a8f0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1a900 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63  v[].){.  const c
1a910 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a  har *zFilename;.
1a920 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1a930 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b   char zBuf[100];
1a940 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
1a950 26 26 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62  && objc!=2 && ob
1a960 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=1 ){.    Tcl
1a970 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1a980 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1a990 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1a9a0 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
1a9b0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
1a9c0 5d 29 2c 20 22 20 66 69 6c 65 6e 61 6d 65 20 6f  ]), " filename o
1a9d0 70 74 69 6f 6e 73 2d 6c 69 73 74 22 2c 20 30 29  ptions-list", 0)
1a9e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1a9f0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a  _ERROR;.  }..  z
1aa00 46 69 6c 65 6e 61 6d 65 20 3d 20 6f 62 6a 63 3e  Filename = objc>
1aa10 31 20 3f 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  1 ? Tcl_GetStrin
1aa20 67 28 6f 62 6a 76 5b 31 5d 29 20 3a 20 30 3b 0a  g(objv[1]) : 0;.
1aa30 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a    sqlite3_open(z
1aa40 46 69 6c 65 6e 61 6d 65 2c 20 26 64 62 29 3b 0a  Filename, &db);.
1aa50 20 20 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33    .  if( sqlite3
1aa60 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53  TestMakePointerS
1aa70 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  tr(interp, zBuf,
1aa80 20 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43   db) ) return TC
1aa90 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41  L_ERROR;.  Tcl_A
1aaa0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1aab0 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20  rp, zBuf, 0);.  
1aac0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1aad0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1aae0 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 20 46  qlite3_open_v2 F
1aaf0 49 4c 45 4e 41 4d 45 20 46 4c 41 47 53 20 56 46  ILENAME FLAGS VF
1ab00 53 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  S.*/.static int 
1ab10 74 65 73 74 5f 6f 70 65 6e 5f 76 32 28 0a 20 20  test_open_v2(.  
1ab20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1ab30 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1ab40 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1ab50 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1ab60 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1ab70 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
1ab80 69 6c 65 6e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74  ilename;.  const
1ab90 20 63 68 61 72 20 2a 7a 56 66 73 3b 0a 20 20 69   char *zVfs;.  i
1aba0 6e 74 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20  nt flags = 0;.  
1abb0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
1abc0 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 42  nt rc;.  char zB
1abd0 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 6e 74 20  uf[100];..  int 
1abe0 6e 46 6c 61 67 3b 0a 20 20 54 63 6c 5f 4f 62 6a  nFlag;.  Tcl_Obj
1abf0 20 2a 2a 61 70 46 6c 61 67 3b 0a 20 20 69 6e 74   **apFlag;.  int
1ac00 20 69 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   i;..  if( objc!
1ac10 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =4 ){.    Tcl_Wr
1ac20 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
1ac30 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 46 49 4c  p, 1, objv, "FIL
1ac40 45 4e 41 4d 45 20 46 4c 41 47 53 20 56 46 53 22  ENAME FLAGS VFS"
1ac50 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1ac60 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
1ac70 46 69 6c 65 6e 61 6d 65 20 3d 20 54 63 6c 5f 47  Filename = Tcl_G
1ac80 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1ac90 29 3b 0a 20 20 7a 56 66 73 20 3d 20 54 63 6c 5f  );.  zVfs = Tcl_
1aca0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33  GetString(objv[3
1acb0 5d 29 3b 0a 20 20 69 66 28 20 7a 56 66 73 5b 30  ]);.  if( zVfs[0
1acc0 5d 3d 3d 30 78 30 30 20 29 20 7a 56 66 73 20 3d  ]==0x00 ) zVfs =
1acd0 20 30 3b 0a 0a 20 20 72 63 20 3d 20 54 63 6c 5f   0;..  rc = Tcl_
1ace0 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e  ListObjGetElemen
1acf0 74 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  ts(interp, objv[
1ad00 32 5d 2c 20 26 6e 46 6c 61 67 2c 20 26 61 70 46  2], &nFlag, &apF
1ad10 6c 61 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  lag);.  if( rc!=
1ad20 54 43 4c 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  TCL_OK ) return 
1ad30 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rc;.  for(i=0; i
1ad40 3c 6e 46 6c 61 67 3b 20 69 2b 2b 29 7b 0a 20 20  <nFlag; i++){.  
1ad50 20 20 69 6e 74 20 69 46 6c 61 67 3b 0a 20 20 20    int iFlag;.   
1ad60 20 73 74 72 75 63 74 20 4f 70 65 6e 46 6c 61 67   struct OpenFlag
1ad70 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63   {.      const c
1ad80 68 61 72 20 2a 7a 46 6c 61 67 3b 0a 20 20 20 20  har *zFlag;.    
1ad90 20 20 69 6e 74 20 66 6c 61 67 3b 0a 20 20 20 20    int flag;.    
1ada0 7d 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 0a 20 20  } aFlag[] = {.  
1adb0 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
1adc0 45 4e 5f 52 45 41 44 4f 4e 4c 59 22 2c 20 53 51  EN_READONLY", SQ
1add0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
1ade0 4c 59 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  LY },.      { "S
1adf0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
1ae00 52 49 54 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50  RITE", SQLITE_OP
1ae10 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7d 2c 0a  EN_READWRITE },.
1ae20 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
1ae30 4f 50 45 4e 5f 43 52 45 41 54 45 22 2c 20 53 51  OPEN_CREATE", SQ
1ae40 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
1ae50 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1ae60 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
1ae70 4e 43 4c 4f 53 45 22 2c 20 53 51 4c 49 54 45 5f  NCLOSE", SQLITE_
1ae80 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
1ae90 53 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  SE },.      { "S
1aea0 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
1aeb0 53 49 56 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50  SIVE", SQLITE_OP
1aec0 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7d 2c 0a  EN_EXCLUSIVE },.
1aed0 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
1aee0 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 22 2c  OPEN_AUTOPROXY",
1aef0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54   SQLITE_OPEN_AUT
1af00 4f 50 52 4f 58 59 20 7d 2c 0a 20 20 20 20 20 20  OPROXY },.      
1af10 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  { "SQLITE_OPEN_M
1af20 41 49 4e 5f 44 42 22 2c 20 53 51 4c 49 54 45 5f  AIN_DB", SQLITE_
1af30 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7d 2c 0a  OPEN_MAIN_DB },.
1af40 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
1af50 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 22 2c 20 53  OPEN_TEMP_DB", S
1af60 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
1af70 44 42 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  DB },.      { "S
1af80 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53  QLITE_OPEN_TRANS
1af90 49 45 4e 54 5f 44 42 22 2c 20 53 51 4c 49 54 45  IENT_DB", SQLITE
1afa0 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f  _OPEN_TRANSIENT_
1afb0 44 42 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  DB },.      { "S
1afc0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
1afd0 4a 4f 55 52 4e 41 4c 22 2c 20 53 51 4c 49 54 45  JOURNAL", SQLITE
1afe0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
1aff0 41 4c 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  AL },.      { "S
1b000 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
1b010 4a 4f 55 52 4e 41 4c 22 2c 20 53 51 4c 49 54 45  JOURNAL", SQLITE
1b020 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
1b030 41 4c 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  AL },.      { "S
1b040 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
1b050 55 52 4e 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f  URNAL", SQLITE_O
1b060 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7d  PEN_SUBJOURNAL }
1b070 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  ,.      { "SQLIT
1b080 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
1b090 55 52 4e 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f  URNAL", SQLITE_O
1b0a0 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
1b0b0 41 4c 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  AL },.      { "S
1b0c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54  QLITE_OPEN_NOMUT
1b0d0 45 58 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  EX", SQLITE_OPEN
1b0e0 5f 4e 4f 4d 55 54 45 58 20 7d 2c 0a 20 20 20 20  _NOMUTEX },.    
1b0f0 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1b100 5f 46 55 4c 4c 4d 55 54 45 58 22 2c 20 53 51 4c  _FULLMUTEX", SQL
1b110 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54  ITE_OPEN_FULLMUT
1b120 45 58 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  EX },.      { "S
1b130 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
1b140 44 43 41 43 48 45 22 2c 20 53 51 4c 49 54 45 5f  DCACHE", SQLITE_
1b150 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
1b160 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1b170 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45  ITE_OPEN_PRIVATE
1b180 43 41 43 48 45 22 2c 20 53 51 4c 49 54 45 5f 4f  CACHE", SQLITE_O
1b190 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45  PEN_PRIVATECACHE
1b1a0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1b1b0 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 22 2c 20 53  ITE_OPEN_WAL", S
1b1c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7d  QLITE_OPEN_WAL }
1b1d0 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  ,.      { "SQLIT
1b1e0 45 5f 4f 50 45 4e 5f 55 52 49 22 2c 20 53 51 4c  E_OPEN_URI", SQL
1b1f0 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 7d 2c 0a  ITE_OPEN_URI },.
1b200 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20        { 0, 0 }. 
1b210 20 20 20 7d 3b 0a 20 20 20 20 72 63 20 3d 20 54     };.    rc = T
1b220 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
1b230 62 6a 53 74 72 75 63 74 28 69 6e 74 65 72 70 2c  bjStruct(interp,
1b240 20 61 70 46 6c 61 67 5b 69 5d 2c 20 61 46 6c 61   apFlag[i], aFla
1b250 67 2c 20 73 69 7a 65 6f 66 28 61 46 6c 61 67 5b  g, sizeof(aFlag[
1b260 30 5d 29 2c 20 0a 20 20 20 20 20 20 20 20 22 66  0]), .        "f
1b270 6c 61 67 22 2c 20 30 2c 20 26 69 46 6c 61 67 0a  lag", 0, &iFlag.
1b280 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72      );.    if( r
1b290 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72 65 74 75  c!=TCL_OK ) retu
1b2a0 72 6e 20 72 63 3b 0a 20 20 20 20 66 6c 61 67 73  rn rc;.    flags
1b2b0 20 7c 3d 20 61 46 6c 61 67 5b 69 46 6c 61 67 5d   |= aFlag[iFlag]
1b2c0 2e 66 6c 61 67 3b 0a 20 20 7d 0a 0a 20 20 72 63  .flag;.  }..  rc
1b2d0 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f   = sqlite3_open_
1b2e0 76 32 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 64  v2(zFilename, &d
1b2f0 62 2c 20 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b  b, flags, zVfs);
1b300 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
1b310 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  stMakePointerStr
1b320 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 64  (interp, zBuf, d
1b330 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1b340 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70 70  ERROR;.  Tcl_App
1b350 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1b360 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65  , zBuf, 0);.  re
1b370 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1b380 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1b390 69 74 65 33 5f 6f 70 65 6e 31 36 20 66 69 6c 65  ite3_open16 file
1b3a0 6e 61 6d 65 20 6f 70 74 69 6f 6e 73 0a 2a 2f 0a  name options.*/.
1b3b0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1b3c0 6f 70 65 6e 31 36 28 0a 20 20 76 6f 69 64 20 2a  open16(.  void *
1b3d0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1b3e0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1b3f0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1b400 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1b410 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65  objv[].){.#ifnde
1b420 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
1b430 46 31 36 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  F16.  const void
1b440 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 73   *zFilename;.  s
1b450 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68  qlite3 *db;.  ch
1b460 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20  ar zBuf[100];.. 
1b470 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
1b480 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1b490 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1b4a0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1b4b0 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
1b4c0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
1b4d0 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 66 69 6c  (objv[0]), " fil
1b4e0 65 6e 61 6d 65 20 6f 70 74 69 6f 6e 73 2d 6c 69  ename options-li
1b4f0 73 74 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  st", 0);.    ret
1b500 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1b510 20 7d 0a 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20   }..  zFilename 
1b520 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
1b530 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31  ayFromObj(objv[1
1b540 5d 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  ], 0);.  sqlite3
1b550 5f 6f 70 65 6e 31 36 28 7a 46 69 6c 65 6e 61 6d  _open16(zFilenam
1b560 65 2c 20 26 64 62 29 3b 0a 20 20 0a 20 20 69 66  e, &db);.  .  if
1b570 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b  ( sqlite3TestMak
1b580 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65  ePointerStr(inte
1b590 72 70 2c 20 7a 42 75 66 2c 20 64 62 29 20 29 20  rp, zBuf, db) ) 
1b5a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1b5b0 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
1b5c0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
1b5d0 66 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  f, 0);.#endif /*
1b5e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
1b5f0 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54  16 */.  return T
1b600 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1b610 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
1b620 6f 6d 70 6c 65 74 65 31 36 20 3c 55 54 46 2d 31  omplete16 <UTF-1
1b630 36 20 73 74 72 69 6e 67 3e 0a 2a 2a 0a 2a 2a 20  6 string>.**.** 
1b640 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
1b650 73 75 70 70 6c 69 65 64 20 61 72 67 75 6d 65 6e  supplied argumen
1b660 74 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20  t is a complete 
1b670 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20 6f  SQL statement, o
1b680 72 20 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77  r zero.** otherw
1b690 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
1b6a0 6e 74 20 74 65 73 74 5f 63 6f 6d 70 6c 65 74 65  nt test_complete
1b6b0 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  16(.  void * cli
1b6c0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1b6d0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1b6e0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1b6f0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1b700 5b 5d 0a 29 7b 0a 23 69 66 20 21 64 65 66 69 6e  [].){.#if !defin
1b710 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ed(SQLITE_OMIT_C
1b720 4f 4d 50 4c 45 54 45 29 20 26 26 20 21 64 65 66  OMPLETE) && !def
1b730 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1b740 5f 55 54 46 31 36 29 0a 20 20 63 68 61 72 20 2a  _UTF16).  char *
1b750 7a 42 75 66 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  zBuf;..  if( obj
1b760 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1b770 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
1b780 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3c  erp, 1, objv, "<
1b790 75 74 66 2d 31 36 20 73 71 6c 3e 22 29 3b 0a 20  utf-16 sql>");. 
1b7a0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1b7b0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 42 75 66  ROR;.  }..  zBuf
1b7c0 20 3d 20 28 63 68 61 72 2a 29 54 63 6c 5f 47 65   = (char*)Tcl_Ge
1b7d0 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
1b7e0 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20  j(objv[1], 0);. 
1b7f0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
1b800 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
1b810 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
1b820 63 6f 6d 70 6c 65 74 65 31 36 28 7a 42 75 66 29  complete16(zBuf)
1b830 29 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ));.#endif /* SQ
1b840 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45  LITE_OMIT_COMPLE
1b850 54 45 20 26 26 20 53 51 4c 49 54 45 5f 4f 4d 49  TE && SQLITE_OMI
1b860 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74  T_UTF16 */.  ret
1b870 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1b880 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1b890 74 65 33 5f 73 74 65 70 20 53 54 4d 54 0a 2a 2a  te3_step STMT.**
1b8a0 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20  .** Advance the 
1b8b0 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65  statement to the
1b8c0 20 6e 65 78 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74   next row..*/.st
1b8d0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74  atic int test_st
1b8e0 65 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ep(.  void * cli
1b8f0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1b900 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1b910 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1b920 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1b930 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
1b940 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
1b950 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
1b960 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
1b970 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1b980 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1b990 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1b9a0 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
1b9b0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
1b9c0 5d 29 2c 20 22 20 53 54 4d 54 22 2c 20 30 29 3b  ]), " STMT", 0);
1b9d0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1b9e0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
1b9f0 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
1ba00 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1ba10 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1ba20 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
1ba30 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
1ba40 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
1ba50 28 70 53 74 6d 74 29 3b 0a 0a 20 20 2f 2a 20 69  (pStmt);..  /* i
1ba60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  f( rc!=SQLITE_DO
1ba70 4e 45 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  NE && rc!=SQLITE
1ba80 5f 52 4f 57 20 29 20 72 65 74 75 72 6e 20 54 43  _ROW ) return TC
1ba90 4c 5f 45 52 52 4f 52 3b 20 2a 2f 0a 20 20 54 63  L_ERROR; */.  Tc
1baa0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
1bab0 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72  rp, (char *)t1Er
1bac0 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b  rorName(rc), 0);
1bad0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1bae0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
1baf0 74 65 73 74 5f 73 71 6c 28 0a 20 20 76 6f 69 64  test_sql(.  void
1bb00 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1bb10 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1bb20 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1bb30 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1bb40 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
1bb50 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1bb60 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  t;..  if( objc!=
1bb70 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
1bb80 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
1bb90 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54  , 1, objv, "STMT
1bba0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
1bbb0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1bbc0 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
1bbd0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
1bbe0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1bbf0 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
1bc00 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1bc10 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
1bc20 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
1bc30 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d  sqlite3_sql(pStm
1bc40 74 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  t), TCL_VOLATILE
1bc50 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1bc60 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1bc70 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
1bc80 6d 6e 5f 63 6f 75 6e 74 20 53 54 4d 54 20 0a 2a  mn_count STMT .*
1bc90 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1bca0 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
1bcb0 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  s returned by th
1bcc0 65 20 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 20  e sql statement 
1bcd0 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  STMT..*/.static 
1bce0 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f  int test_column_
1bcf0 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20  count(.  void * 
1bd00 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1bd10 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1bd20 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1bd30 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1bd40 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
1bd50 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
1bd60 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
1bd70 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1bd80 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1bd90 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1bda0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
1bdb0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
1bdc0 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53  ng(objv[0]), " S
1bdd0 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b  TMT column", 0);
1bde0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1bdf0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
1be00 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
1be10 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1be20 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1be30 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
1be40 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
1be50 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
1be60 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
1be70 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63  IntObj(sqlite3_c
1be80 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d  olumn_count(pStm
1be90 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  t)));.  return T
1bea0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1beb0 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
1bec0 6f 6c 75 6d 6e 5f 74 79 70 65 20 53 54 4d 54 20  olumn_type STMT 
1bed0 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74  column.**.** Ret
1bee0 75 72 6e 20 74 68 65 20 74 79 70 65 20 6f 66 20  urn the type of 
1bef0 74 68 65 20 64 61 74 61 20 69 6e 20 63 6f 6c 75  the data in colu
1bf00 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74  mn 'column' of t
1bf10 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 0a  he current row..
1bf20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1bf30 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 0a  st_column_type(.
1bf40 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1bf50 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1bf60 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1bf70 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1bf80 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1bf90 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
1bfa0 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63   *pStmt;.  int c
1bfb0 6f 6c 3b 0a 20 20 69 6e 74 20 74 70 3b 0a 0a 20  ol;.  int tp;.. 
1bfc0 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
1bfd0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1bfe0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1bff0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1c000 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
1c010 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
1c020 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
1c030 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20  T column", 0);. 
1c040 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1c050 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
1c060 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
1c070 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1c080 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1c090 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
1c0a0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
1c0b0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1c0c0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
1c0d0 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75  2], &col) ) retu
1c0e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
1c0f0 20 74 70 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f   tp = sqlite3_co
1c100 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c  lumn_type(pStmt,
1c110 20 63 6f 6c 29 3b 0a 20 20 73 77 69 74 63 68 28   col);.  switch(
1c120 20 74 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   tp ){.    case 
1c130 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20  SQLITE_INTEGER: 
1c140 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65  .      Tcl_SetRe
1c150 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 49 4e  sult(interp, "IN
1c160 54 45 47 45 52 22 2c 20 54 43 4c 5f 53 54 41 54  TEGER", TCL_STAT
1c170 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  IC); .      brea
1c180 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
1c190 54 45 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 54  TE_NULL:.      T
1c1a0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
1c1b0 65 72 70 2c 20 22 4e 55 4c 4c 22 2c 20 54 43 4c  erp, "NULL", TCL
1c1c0 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20  _STATIC); .     
1c1d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1c1e0 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 0a 20   SQLITE_FLOAT:. 
1c1f0 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75       Tcl_SetResu
1c200 6c 74 28 69 6e 74 65 72 70 2c 20 22 46 4c 4f 41  lt(interp, "FLOA
1c210 54 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  T", TCL_STATIC);
1c220 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
1c230 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1c240 45 58 54 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53  EXT:.      Tcl_S
1c250 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
1c260 20 22 54 45 58 54 22 2c 20 54 43 4c 5f 53 54 41   "TEXT", TCL_STA
1c270 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65  TIC); .      bre
1c280 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1c290 49 54 45 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20  ITE_BLOB:.      
1c2a0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
1c2b0 74 65 72 70 2c 20 22 42 4c 4f 42 22 2c 20 54 43  terp, "BLOB", TC
1c2c0 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20  L_STATIC); .    
1c2d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
1c2e0 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65  ault:.      asse
1c2f0 72 74 28 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  rt(0);.  }..  re
1c300 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1c310 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1c320 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
1c330 34 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a  4 STMT column.**
1c340 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
1c350 61 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20 27 63  ata in column 'c
1c360 6f 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20 63 75  olumn' of the cu
1c370 72 72 65 6e 74 20 72 6f 77 20 63 61 73 74 20 61  rrent row cast a
1c380 73 20 61 6e 0a 2a 2a 20 77 69 64 65 20 28 36 34  s an.** wide (64
1c390 2d 62 69 74 29 20 69 6e 74 65 67 65 72 2e 0a 2a  -bit) integer..*
1c3a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1c3b0 74 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 0a  t_column_int64(.
1c3c0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1c3d0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1c3e0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1c3f0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1c400 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1c410 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
1c420 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63   *pStmt;.  int c
1c430 6f 6c 3b 0a 20 20 69 36 34 20 69 56 61 6c 3b 0a  ol;.  i64 iVal;.
1c440 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
1c450 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1c460 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1c470 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1c480 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
1c490 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
1c4a0 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53  ng(objv[0]), " S
1c4b0 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b  TMT column", 0);
1c4c0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1c4d0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
1c4e0 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
1c4f0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1c500 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1c510 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
1c520 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
1c530 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
1c540 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
1c550 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65  v[2], &col) ) re
1c560 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1c570 0a 20 20 69 56 61 6c 20 3d 20 73 71 6c 69 74 65  .  iVal = sqlite
1c580 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
1c590 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63  Stmt, col);.  Tc
1c5a0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1c5b0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69  nterp, Tcl_NewWi
1c5c0 64 65 49 6e 74 4f 62 6a 28 69 56 61 6c 29 29 3b  deIntObj(iVal));
1c5d0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1c5e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1c5f0 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
1c600 5f 62 6c 6f 62 20 53 54 4d 54 20 63 6f 6c 75 6d  _blob STMT colum
1c610 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n.*/.static int 
1c620 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  test_column_blob
1c630 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1c640 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1c650 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1c660 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1c670 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1c680 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
1c690 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
1c6a0 20 63 6f 6c 3b 0a 0a 20 20 69 6e 74 20 6c 65 6e   col;..  int len
1c6b0 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ;.  const void *
1c6c0 70 42 6c 6f 62 3b 0a 0a 20 20 69 66 28 20 6f 62  pBlob;..  if( ob
1c6d0 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
1c6e0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1c6f0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1c700 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1c710 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
1c720 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
1c730 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d  ]), " STMT colum
1c740 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  n", 0);.    retu
1c750 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1c760 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
1c770 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1c780 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1c790 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
1c7a0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1c7b0 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
1c7c0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
1c7d0 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f  rp, objv[2], &co
1c7e0 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
1c7f0 45 52 52 4f 52 3b 0a 0a 20 20 6c 65 6e 20 3d 20  ERROR;..  len = 
1c800 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
1c810 79 74 65 73 28 70 53 74 6d 74 2c 20 63 6f 6c 29  ytes(pStmt, col)
1c820 3b 0a 20 20 70 42 6c 6f 62 20 3d 20 73 71 6c 69  ;.  pBlob = sqli
1c830 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28  te3_column_blob(
1c840 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 54  pStmt, col);.  T
1c850 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1c860 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
1c870 79 74 65 41 72 72 61 79 4f 62 6a 28 70 42 6c 6f  yteArrayObj(pBlo
1c880 62 2c 20 6c 65 6e 29 29 3b 0a 20 20 72 65 74 75  b, len));.  retu
1c890 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1c8a0 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1c8b0 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65  e3_column_double
1c8c0 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a   STMT column.**.
1c8d0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61  ** Return the da
1c8e0 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f  ta in column 'co
1c8f0 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20 63 75 72  lumn' of the cur
1c900 72 65 6e 74 20 72 6f 77 20 63 61 73 74 20 61 73  rent row cast as
1c910 20 61 20 64 6f 75 62 6c 65 2e 0a 2a 2f 0a 73 74   a double..*/.st
1c920 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f  atic int test_co
1c930 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 0a 20 20 76  lumn_double(.  v
1c940 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1c950 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1c960 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1c970 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1c980 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1c990 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1c9a0 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b  Stmt;.  int col;
1c9b0 0a 20 20 64 6f 75 62 6c 65 20 72 56 61 6c 3b 0a  .  double rVal;.
1c9c0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
1c9d0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1c9e0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1c9f0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1ca00 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
1ca10 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
1ca20 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53  ng(objv[0]), " S
1ca30 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b  TMT column", 0);
1ca40 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1ca50 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
1ca60 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
1ca70 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1ca80 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1ca90 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
1caa0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
1cab0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
1cac0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
1cad0 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65  v[2], &col) ) re
1cae0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1caf0 0a 20 20 72 56 61 6c 20 3d 20 73 71 6c 69 74 65  .  rVal = sqlite
1cb00 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28  3_column_double(
1cb10 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 54  pStmt, col);.  T
1cb20 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1cb30 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 44  interp, Tcl_NewD
1cb40 6f 75 62 6c 65 4f 62 6a 28 72 56 61 6c 29 29 3b  oubleObj(rVal));
1cb50 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1cb60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1cb70 3a 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 63  : sqlite3_data_c
1cb80 6f 75 6e 74 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a  ount STMT .**.**
1cb90 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
1cba0 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65  er of columns re
1cbb0 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 73 71  turned by the sq
1cbc0 6c 20 73 74 61 74 65 6d 65 6e 74 20 53 54 4d 54  l statement STMT
1cbd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1cbe0 74 65 73 74 5f 64 61 74 61 5f 63 6f 75 6e 74 28  test_data_count(
1cbf0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1cc00 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1cc10 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1cc20 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1cc30 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1cc40 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
1cc50 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28  t *pStmt;..  if(
1cc60 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
1cc70 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1cc80 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1cc90 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1cca0 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
1ccb0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1ccc0 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f  v[0]), " STMT co
1ccd0 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72  lumn", 0);.    r
1cce0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1ccf0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
1cd00 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
1cd10 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1cd20 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
1cd30 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
1cd40 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53 65  ERROR;..  Tcl_Se
1cd50 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1cd60 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
1cd70 28 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f  (sqlite3_data_co
1cd80 75 6e 74 28 70 53 74 6d 74 29 29 29 3b 0a 20 20  unt(pStmt)));.  
1cd90 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1cda0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1cdb0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
1cdc0 78 74 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  xt STMT column.*
1cdd0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1cde0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74  te3_column_declt
1cdf0 79 70 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a  ype STMT column.
1ce00 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  **.** Usage: sql
1ce10 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  ite3_column_name
1ce20 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a   STMT column.*/.
1ce30 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1ce40 73 74 6d 74 5f 75 74 66 38 28 0a 20 20 76 6f 69  stmt_utf8(.  voi
1ce50 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  d * clientData, 
1ce60 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1ce70 72 20 74 6f 20 53 51 4c 69 74 65 20 41 50 49 20  r to SQLite API 
1ce80 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69  function to be i
1ce90 6e 76 6f 6b 65 20 2a 2f 0a 20 20 54 63 6c 5f 49  nvoke */.  Tcl_I
1cea0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1ceb0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1cec0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1ced0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
1cee0 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
1cef0 6e 74 20 63 6f 6c 3b 0a 20 20 63 6f 6e 73 74 20  nt col;.  const 
1cf00 63 68 61 72 20 2a 28 2a 78 46 75 6e 63 29 28 73  char *(*xFunc)(s
1cf10 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e  qlite3_stmt*, in
1cf20 74 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  t);.  const char
1cf30 20 2a 7a 52 65 74 3b 0a 0a 20 20 78 46 75 6e 63   *zRet;..  xFunc
1cf40 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
1cf50 28 2a 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  (*)(sqlite3_stmt
1cf60 2a 2c 20 69 6e 74 29 29 63 6c 69 65 6e 74 44 61  *, int))clientDa
1cf70 74 61 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ta;.  if( objc!=
1cf80 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
1cf90 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1cfa0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1cfb0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1cfc0 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
1cfd0 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
1cfe0 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20  " STMT column", 
1cff0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1d000 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1d010 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
1d020 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
1d030 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1d040 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
1d050 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1d060 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1d070 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1d080 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29  objv[2], &col) )
1d090 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1d0a0 52 3b 0a 20 20 7a 52 65 74 20 3d 20 78 46 75 6e  R;.  zRet = xFun
1d0b0 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20  c(pStmt, col);. 
1d0c0 20 69 66 28 20 7a 52 65 74 20 29 7b 0a 20 20 20   if( zRet ){.   
1d0d0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
1d0e0 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 7a  nterp, (char *)z
1d0f0 52 65 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Ret, 0);.  }.  r
1d100 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1d110 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1d120 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28  _global_recover(
1d130 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1d140 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1d150 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1d160 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1d170 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1d180 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
1d190 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
1d1a0 44 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  D.  int rc;.  if
1d1b0 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20  ( objc!=1 ){.   
1d1c0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
1d1d0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
1d1e0 76 2c 20 22 22 29 3b 0a 20 20 20 20 72 65 74 75  v, "");.    retu
1d1f0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1d200 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
1d210 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28  _global_recover(
1d220 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  );.  Tcl_SetResu
1d230 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
1d240 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
1d250 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  c), TCL_STATIC);
1d260 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
1d270 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1d280 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1d290 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 53 54 4d  _column_text STM
1d2a0 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55  T column.**.** U
1d2b0 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
1d2c0 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 20 53 54  lumn_decltype ST
1d2d0 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
1d2e0 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
1d2f0 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 53 54 4d 54 20  olumn_name STMT 
1d300 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63  column.*/.static
1d310 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 75   int test_stmt_u
1d320 74 66 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63  tf16(.  void * c
1d330 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20 2f  lientData,     /
1d340 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c  * Pointer to SQL
1d350 69 74 65 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  ite API function
1d360 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 2a   to be invoked *
1d370 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
1d380 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1d390 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1d3a0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
1d3b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1d3c0 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74  IT_UTF16.  sqlit
1d3d0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
1d3e0 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 54 63 6c    int col;.  Tcl
1d3f0 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 20 20 63 6f  _Obj *pRet;.  co
1d400 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61 6d 65 31  nst void *zName1
1d410 36 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  6;.  const void 
1d420 2a 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65  *(*xFunc)(sqlite
1d430 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 3b 0a 0a  3_stmt*, int);..
1d440 20 20 78 46 75 6e 63 20 3d 20 28 63 6f 6e 73 74    xFunc = (const
1d450 20 76 6f 69 64 20 2a 28 2a 29 28 73 71 6c 69 74   void *(*)(sqlit
1d460 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 29 63  e3_stmt*, int))c
1d470 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 69 66 28  lientData;.  if(
1d480 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
1d490 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1d4a0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1d4b0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1d4c0 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
1d4d0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1d4e0 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f  v[0]), " STMT co
1d4f0 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72  lumn", 0);.    r
1d500 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1d510 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
1d520 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
1d530 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1d540 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
1d550 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
1d560 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
1d570 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
1d580 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
1d590 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &col) ) return T
1d5a0 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 4e 61  CL_ERROR;..  zNa
1d5b0 6d 65 31 36 20 3d 20 78 46 75 6e 63 28 70 53 74  me16 = xFunc(pSt
1d5c0 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 69 66 28 20  mt, col);.  if( 
1d5d0 7a 4e 61 6d 65 31 36 20 29 7b 0a 20 20 20 20 69  zName16 ){.    i
1d5e0 6e 74 20 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20  nt n;.    const 
1d5f0 63 68 61 72 20 2a 7a 20 3d 20 7a 4e 61 6d 65 31  char *z = zName1
1d600 36 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20  6;.    for(n=0; 
1d610 7a 5b 6e 5d 20 7c 7c 20 7a 5b 6e 2b 31 5d 3b 20  z[n] || z[n+1]; 
1d620 6e 2b 3d 32 29 7b 7d 0a 20 20 20 20 70 52 65 74  n+=2){}.    pRet
1d630 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72   = Tcl_NewByteAr
1d640 72 61 79 4f 62 6a 28 7a 4e 61 6d 65 31 36 2c 20  rayObj(zName16, 
1d650 6e 2b 32 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  n+2);.    Tcl_Se
1d660 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1d670 70 2c 20 70 52 65 74 29 3b 0a 20 20 7d 0a 23 65  p, pRet);.  }.#e
1d680 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1d690 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 20 20  MIT_UTF16 */..  
1d6a0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1d6b0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1d6c0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
1d6d0 74 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a  t STMT column.**
1d6e0 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1d6f0 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 20  e3_column_bytes 
1d700 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a  STMT column.**.*
1d710 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1d720 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36 20  _column_bytes16 
1d730 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a  STMT column.**.*
1d740 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1d750 74 5f 73 74 6d 74 5f 69 6e 74 28 0a 20 20 76 6f  t_stmt_int(.  vo
1d760 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1d770 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1d780 6f 20 53 51 4c 69 74 65 20 41 50 49 20 66 75 6e  o SQLite API fun
1d790 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f  ction to be invo
1d7a0 6b 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ked */.  Tcl_Int
1d7b0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1d7c0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1d7d0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1d7e0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
1d7f0 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
1d800 20 63 6f 6c 3b 0a 20 20 69 6e 74 20 28 2a 78 46   col;.  int (*xF
1d810 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d  unc)(sqlite3_stm
1d820 74 2a 2c 20 69 6e 74 29 3b 0a 0a 20 20 78 46 75  t*, int);..  xFu
1d830 6e 63 20 3d 20 28 69 6e 74 20 28 2a 29 28 73 71  nc = (int (*)(sq
1d840 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74  lite3_stmt*, int
1d850 29 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20  ))clientData;.  
1d860 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
1d870 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1d880 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1d890 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1d8a0 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
1d8b0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
1d8c0 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54  objv[0]), " STMT
1d8d0 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20   column", 0);.  
1d8e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1d8f0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
1d900 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
1d910 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1d920 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
1d930 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
1d940 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
1d950 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
1d960 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
1d970 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72  ], &col) ) retur
1d980 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
1d990 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
1d9a0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
1d9b0 49 6e 74 4f 62 6a 28 78 46 75 6e 63 28 70 53 74  IntObj(xFunc(pSt
1d9c0 6d 74 2c 20 63 6f 6c 29 29 29 3b 0a 20 20 72 65  mt, col)));.  re
1d9d0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1d9e0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
1d9f0 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 20 20  lite_set_magic  
1da00 44 42 20 20 4d 41 47 49 43 2d 4e 55 4d 42 45 52  DB  MAGIC-NUMBER
1da10 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64  .**.** Set the d
1da20 62 2d 3e 6d 61 67 69 63 20 76 61 6c 75 65 2e 20  b->magic value. 
1da30 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
1da40 20 74 65 73 74 20 65 72 72 6f 72 20 72 65 63 6f   test error reco
1da50 76 65 72 79 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 73  very logic..*/.s
1da60 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
1da70 5f 73 65 74 5f 6d 61 67 69 63 28 0a 20 20 76 6f  _set_magic(.  vo
1da80 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1da90 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1daa0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67  nterp,.  int arg
1dab0 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  c,.  char **argv
1dac0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
1dad0 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33  b;.  if( argc!=3
1dae0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1daf0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1db00 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1db10 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
1db20 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20  rgv[0],.        
1db30 20 22 20 44 42 20 4d 41 47 49 43 22 2c 20 30 29   " DB MAGIC", 0)
1db40 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1db50 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
1db60 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
1db70 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
1db80 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
1db90 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 73  L_ERROR;.  if( s
1dba0 74 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22  trcmp(argv[2], "
1dbb0 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45  SQLITE_MAGIC_OPE
1dbc0 4e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62  N")==0 ){.    db
1dbd0 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
1dbe0 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 7d  _MAGIC_OPEN;.  }
1dbf0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
1dc00 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45  argv[2], "SQLITE
1dc10 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 22 29 3d  _MAGIC_CLOSED")=
1dc20 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  =0 ){.    db->ma
1dc30 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
1dc40 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20 7d 65 6c  IC_CLOSED;.  }el
1dc50 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72  se if( strcmp(ar
1dc60 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d  gv[2], "SQLITE_M
1dc70 41 47 49 43 5f 42 55 53 59 22 29 3d 3d 30 20 29  AGIC_BUSY")==0 )
1dc80 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20  {.    db->magic 
1dc90 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42  = SQLITE_MAGIC_B
1dca0 55 53 59 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  USY;.  }else if(
1dcb0 20 73 74 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c   strcmp(argv[2],
1dcc0 20 22 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45   "SQLITE_MAGIC_E
1dcd0 52 52 4f 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20  RROR")==0 ){.   
1dce0 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
1dcf0 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b  ITE_MAGIC_ERROR;
1dd00 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 54 63 6c  .  }else if( Tcl
1dd10 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20  _GetInt(interp, 
1dd20 61 72 67 76 5b 32 5d 2c 20 28 69 6e 74 2a 29 26  argv[2], (int*)&
1dd30 64 62 2d 3e 6d 61 67 69 63 29 20 29 7b 0a 20 20  db->magic) ){.  
1dd40 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1dd50 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
1dd60 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1dd70 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
1dd80 33 5f 69 6e 74 65 72 72 75 70 74 20 20 44 42 20  3_interrupt  DB 
1dd90 0a 2a 2a 0a 2a 2a 20 54 72 69 67 67 65 72 20 61  .**.** Trigger a
1dda0 6e 20 69 6e 74 65 72 72 75 70 74 20 6f 6e 20 44  n interrupt on D
1ddb0 42 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  B.*/.static int 
1ddc0 74 65 73 74 5f 69 6e 74 65 72 72 75 70 74 28 0a  test_interrupt(.
1ddd0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1dde0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1ddf0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1de00 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a   argc,.  char **
1de10 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65  argv.){.  sqlite
1de20 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67  3 *db;.  if( arg
1de30 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1de40 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1de50 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1de60 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1de70 22 2c 20 61 72 67 76 5b 30 5d 2c 20 22 20 44 42  ", argv[0], " DB
1de80 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1de90 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1dea0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
1deb0 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
1dec0 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
1ded0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1dee0 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
1def0 74 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20  t(db);.  return 
1df00 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69  TCL_OK;.}..stati
1df10 63 20 75 38 20 2a 73 71 6c 69 74 65 33 5f 73 74  c u8 *sqlite3_st
1df20 61 63 6b 5f 62 61 73 65 6c 69 6e 65 20 3d 20 30  ack_baseline = 0
1df30 3b 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68  ;../*.** Fill th
1df40 65 20 73 74 61 63 6b 20 77 69 74 68 20 61 20 6b  e stack with a k
1df50 6e 6f 77 6e 20 62 69 74 70 61 74 74 65 72 6e 2e  nown bitpattern.
1df60 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1df70 70 72 65 70 53 74 61 63 6b 28 76 6f 69 64 29 7b  prepStack(void){
1df80 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 33 32 20  .  int i;.  u32 
1df90 62 69 67 42 75 66 5b 36 35 35 33 36 5d 3b 0a 20  bigBuf[65536];. 
1dfa0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
1dfb0 6f 66 28 62 69 67 42 75 66 29 2f 73 69 7a 65 6f  of(bigBuf)/sizeo
1dfc0 66 28 62 69 67 42 75 66 5b 30 5d 29 3b 20 69 2b  f(bigBuf[0]); i+
1dfd0 2b 29 20 62 69 67 42 75 66 5b 69 5d 20 3d 20 30  +) bigBuf[i] = 0
1dfe0 78 64 65 61 64 62 65 65 66 3b 0a 20 20 73 71 6c  xdeadbeef;.  sql
1dff0 69 74 65 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c  ite3_stack_basel
1e000 69 6e 65 20 3d 20 28 75 38 2a 29 26 62 69 67 42  ine = (u8*)&bigB
1e010 75 66 5b 36 35 35 33 36 5d 3b 0a 7d 0a 0a 2f 2a  uf[65536];.}../*
1e020 0a 2a 2a 20 47 65 74 20 74 68 65 20 63 75 72 72  .** Get the curr
1e030 65 6e 74 20 73 74 61 63 6b 20 64 65 70 74 68 2e  ent stack depth.
1e040 20 20 55 73 65 64 20 66 6f 72 20 64 65 62 75 67    Used for debug
1e050 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 75 36  ging only..*/.u6
1e060 34 20 73 71 6c 69 74 65 33 53 74 61 63 6b 44 65  4 sqlite3StackDe
1e070 70 74 68 28 76 6f 69 64 29 7b 0a 20 20 75 38 20  pth(void){.  u8 
1e080 78 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 36 34  x;.  return (u64
1e090 29 28 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f  )(sqlite3_stack_
1e0a0 62 61 73 65 6c 69 6e 65 20 2d 20 26 78 29 3b 0a  baseline - &x);.
1e0b0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1e0c0 20 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 75   sqlite3_stack_u
1e0d0 73 65 64 20 44 42 20 53 51 4c 0a 2a 2a 0a 2a 2a  sed DB SQL.**.**
1e0e0 20 54 72 79 20 74 6f 20 6d 65 61 73 75 72 65 20   Try to measure 
1e0f0 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 74  the amount of st
1e100 61 63 6b 20 73 70 61 63 65 20 75 73 65 64 20 62  ack space used b
1e110 79 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  y a call to sqli
1e120 74 65 33 5f 65 78 65 63 0a 2a 2f 0a 73 74 61 74  te3_exec.*/.stat
1e130 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74 61 63  ic int test_stac
1e140 6b 5f 75 73 65 64 28 0a 20 20 76 6f 69 64 20 2a  k_used(.  void *
1e150 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1e160 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1e170 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  p,.  int argc,. 
1e180 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a   char **argv.){.
1e190 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1e1a0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 61 72   int i;.  if( ar
1e1b0 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=3 ){.    Tcl
1e1c0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1e1d0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1e1e0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1e1f0 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20  "", argv[0], .  
1e200 20 20 20 20 20 20 22 20 44 42 20 53 51 4c 22 2c        " DB SQL",
1e210 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1e220 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1e230 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
1e240 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
1e250 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
1e260 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 70 72   TCL_ERROR;.  pr
1e270 65 70 53 74 61 63 6b 28 29 3b 0a 20 20 28 76 6f  epStack();.  (vo
1e280 69 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28  id)sqlite3_exec(
1e290 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 30 2c 20  db, argv[2], 0, 
1e2a0 30 2c 20 30 29 3b 0a 20 20 66 6f 72 28 69 3d 36  0, 0);.  for(i=6
1e2b0 35 35 33 35 3b 20 69 3e 3d 30 20 26 26 20 28 28  5535; i>=0 && ((
1e2c0 75 33 32 2a 29 73 71 6c 69 74 65 33 5f 73 74 61  u32*)sqlite3_sta
1e2d0 63 6b 5f 62 61 73 65 6c 69 6e 65 29 5b 2d 69 5d  ck_baseline)[-i]
1e2e0 3d 3d 30 78 64 65 61 64 62 65 65 66 3b 20 69 2d  ==0xdeadbeef; i-
1e2f0 2d 29 7b 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62  -){}.  Tcl_SetOb
1e300 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
1e310 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 69 2a  Tcl_NewIntObj(i*
1e320 34 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  4));.  return TC
1e330 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1e340 73 61 67 65 3a 20 73 71 6c 69 74 65 5f 64 65 6c  sage: sqlite_del
1e350 65 74 65 5f 66 75 6e 63 74 69 6f 6e 20 44 42 20  ete_function DB 
1e360 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 0a 2a 2a  function-name.**
1e370 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 75  .** Delete the u
1e380 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 27 66 75  ser function 'fu
1e390 6e 63 74 69 6f 6e 2d 6e 61 6d 65 27 20 66 72 6f  nction-name' fro
1e3a0 6d 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  m database handl
1e3b0 65 20 44 42 2e 20 49 74 0a 2a 2a 20 69 73 20 61  e DB. It.** is a
1e3c0 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
1e3d0 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 77 61  user function wa
1e3e0 73 20 63 72 65 61 74 65 64 20 61 73 20 55 54 46  s created as UTF
1e3f0 38 2c 20 61 6e 79 20 6e 75 6d 62 65 72 20 6f 66  8, any number of
1e400 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 28 74  .** arguments (t
1e410 68 65 20 77 61 79 20 74 68 65 20 54 43 4c 20 69  he way the TCL i
1e420 6e 74 65 72 66 61 63 65 20 64 6f 65 73 20 69 74  nterface does it
1e430 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1e440 20 64 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e   delete_function
1e450 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1e460 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1e470 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1e480 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20  nt argc,.  char 
1e490 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20  **argv.){.  int 
1e4a0 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  rc;.  sqlite3 *d
1e4b0 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33  b;.  if( argc!=3
1e4c0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1e4d0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1e4e0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1e4f0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
1e500 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
1e510 20 22 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e   " DB function-n
1e520 61 6d 65 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  ame", 0);.    re
1e530 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1e540 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
1e550 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
1e560 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
1e570 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1e580 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1e590 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
1e5a0 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 2d 31 2c  db, argv[2], -1,
1e5b0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
1e5c0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c   0, 0, 0);.  Tcl
1e5d0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
1e5e0 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
1e5f0 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  orName(rc), TCL_
1e600 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72  STATIC);.  retur
1e610 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1e620 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1e630 5f 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f  _delete_collatio
1e640 6e 20 44 42 20 63 6f 6c 6c 61 74 69 6f 6e 2d 6e  n DB collation-n
1e650 61 6d 65 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65  ame.**.** Delete
1e660 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
1e670 65 71 75 65 6e 63 65 20 27 63 6f 6c 6c 61 74 69  equence 'collati
1e680 6f 6e 2d 6e 61 6d 65 27 20 66 72 6f 6d 20 64 61  on-name' from da
1e690 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a  tabase handle .*
1e6a0 2a 20 44 42 2e 20 49 74 20 69 73 20 61 73 73 75  * DB. It is assu
1e6b0 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 6f 6c  med that the col
1e6c0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1e6d0 77 61 73 20 63 72 65 61 74 65 64 20 61 73 20 55  was created as U
1e6e0 54 46 38 20 28 74 68 65 20 0a 2a 2a 20 77 61 79  TF8 (the .** way
1e6f0 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 66 61   the TCL interfa
1e700 63 65 20 64 6f 65 73 20 69 74 29 2e 0a 2a 2f 0a  ce does it)..*/.
1e710 73 74 61 74 69 63 20 69 6e 74 20 64 65 6c 65 74  static int delet
1e720 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 76  e_collation(.  v
1e730 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1e740 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1e750 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72  interp,.  int ar
1e760 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67  gc,.  char **arg
1e770 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  v.){.  int rc;. 
1e780 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1e790 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
1e7a0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1e7b0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1e7c0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1e7d0 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
1e7e0 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44 42  ], .        " DB
1e7f0 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 22 2c   function-name",
1e800 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1e810 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1e820 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
1e830 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
1e840 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
1e850 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
1e860 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
1e870 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  e_collation(db, 
1e880 61 72 67 76 5b 32 5d 2c 20 53 51 4c 49 54 45 5f  argv[2], SQLITE_
1e890 55 54 46 38 2c 20 30 2c 20 30 29 3b 0a 20 20 54  UTF8, 0, 0);.  T
1e8a0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
1e8b0 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
1e8c0 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
1e8d0 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74  L_STATIC);.  ret
1e8e0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1e8f0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1e900 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d  te3_get_autocomm
1e910 69 74 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75  it DB.**.** Retu
1e920 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 64  rn true if the d
1e930 61 74 61 62 61 73 65 20 44 42 20 69 73 20 63 75  atabase DB is cu
1e940 72 72 65 6e 74 6c 79 20 69 6e 20 61 75 74 6f 2d  rrently in auto-
1e950 63 6f 6d 6d 69 74 20 6d 6f 64 65 2e 0a 2a 2a 20  commit mode..** 
1e960 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20  Return false if 
1e970 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  not..*/.static i
1e980 6e 74 20 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69  nt get_autocommi
1e990 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
1e9a0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1e9b0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1e9c0 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72  int argc,.  char
1e9d0 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 68 61   **argv.){.  cha
1e9e0 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 73 71  r zBuf[30];.  sq
1e9f0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28  lite3 *db;.  if(
1ea00 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
1ea10 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1ea20 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1ea30 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1ea40 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
1ea50 0a 20 20 20 20 20 20 20 20 22 20 44 42 22 2c 20  .        " DB", 
1ea60 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1ea70 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1ea80 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
1ea90 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
1eaa0 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
1eab0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 70 72  TCL_ERROR;.  spr
1eac0 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c  intf(zBuf, "%d",
1ead0 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74   sqlite3_get_aut
1eae0 6f 63 6f 6d 6d 69 74 28 64 62 29 29 3b 0a 20 20  ocommit(db));.  
1eaf0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1eb00 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
1eb10 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1eb20 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1eb30 67 65 3a 20 73 71 6c 69 74 65 33 5f 62 75 73 79  ge: sqlite3_busy
1eb40 5f 74 69 6d 65 6f 75 74 20 44 42 20 4d 53 0a 2a  _timeout DB MS.*
1eb50 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73  *.** Set the bus
1eb60 79 20 74 69 6d 65 6f 75 74 2e 20 20 54 68 69 73  y timeout.  This
1eb70 20 69 73 20 6d 6f 72 65 20 65 61 73 69 6c 79 20   is more easily 
1eb80 64 6f 6e 65 20 75 73 69 6e 67 20 74 68 65 20 74  done using the t
1eb90 69 6d 65 6f 75 74 0a 2a 2a 20 6d 65 74 68 6f 64  imeout.** method
1eba0 20 6f 66 20 74 68 65 20 54 43 4c 20 69 6e 74 65   of the TCL inte
1ebb0 72 66 61 63 65 2e 20 20 42 75 74 20 77 65 20 6e  rface.  But we n
1ebc0 65 65 64 20 61 20 77 61 79 20 74 6f 20 74 65 73  eed a way to tes
1ebd0 74 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68  t the case.** wh
1ebe0 65 72 65 20 69 74 20 72 65 74 75 72 6e 73 20 53  ere it returns S
1ebf0 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e 0a 2a 2f  QLITE_MISUSE..*/
1ec00 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1ec10 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 0a 20  _busy_timeout(. 
1ec20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1ec30 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1ec40 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1ec50 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61  argc,.  char **a
1ec60 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c  rgv.){.  int rc,
1ec70 20 6d 73 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   ms;.  sqlite3 *
1ec80 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  db;.  if( argc!=
1ec90 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
1eca0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1ecb0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1ecc0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1ecd0 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
1ece0 20 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20    " DB", 0);.   
1ecf0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1ed00 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
1ed10 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
1ed20 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
1ed30 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1ed40 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
1ed50 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67  tInt(interp, arg
1ed60 76 5b 32 5d 2c 20 26 6d 73 29 20 29 20 72 65 74  v[2], &ms) ) ret
1ed70 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1ed80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 75   rc = sqlite3_bu
1ed90 73 79 5f 74 69 6d 65 6f 75 74 28 64 62 2c 20 6d  sy_timeout(db, m
1eda0 73 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  s);.  Tcl_Append
1edb0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73  Result(interp, s
1edc0 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
1edd0 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  ), 0);.  return 
1ede0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1edf0 20 55 73 61 67 65 3a 20 20 74 63 6c 5f 76 61 72   Usage:  tcl_var
1ee00 69 61 62 6c 65 5f 74 79 70 65 20 56 41 52 49 41  iable_type VARIA
1ee10 42 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65  BLENAME.**.** Re
1ee20 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
1ee30 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 72 65   the internal re
1ee40 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 66 6f 72  presentation for
1ee50 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
1ee60 20 74 68 65 20 67 69 76 65 6e 20 76 61 72 69 61   the given varia
1ee70 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
1ee80 6e 74 20 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f  nt tcl_variable_
1ee90 74 79 70 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  type(.  void * c
1eea0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1eeb0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1eec0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1eed0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1eee0 6a 76 5b 5d 0a 29 7b 0a 20 20 54 63 6c 5f 4f 62  jv[].){.  Tcl_Ob
1eef0 6a 20 2a 70 56 61 72 3b 0a 20 20 69 66 28 20 6f  j *pVar;.  if( o
1ef00 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
1ef10 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
1ef20 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
1ef30 22 56 41 52 49 41 42 4c 45 22 29 3b 0a 20 20 20  "VARIABLE");.   
1ef40 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1ef50 52 3b 0a 20 20 7d 0a 20 20 70 56 61 72 20 3d 20  R;.  }.  pVar = 
1ef60 54 63 6c 5f 47 65 74 56 61 72 32 45 78 28 69 6e  Tcl_GetVar2Ex(in
1ef70 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1ef80 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 30 2c  ing(objv[1]), 0,
1ef90 20 54 43 4c 5f 4c 45 41 56 45 5f 45 52 52 5f 4d   TCL_LEAVE_ERR_M
1efa0 53 47 29 3b 0a 20 20 69 66 28 20 70 56 61 72 3d  SG);.  if( pVar=
1efb0 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  =0 ) return TCL_
1efc0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 70 56 61  ERROR;.  if( pVa
1efd0 72 2d 3e 74 79 70 65 50 74 72 20 29 7b 0a 20 20  r->typePtr ){.  
1efe0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
1eff0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
1f000 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 56 61 72  ewStringObj(pVar
1f010 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65 2c  ->typePtr->name,
1f020 20 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74   -1));.  }.  ret
1f030 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1f040 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
1f050 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  ite3_release_mem
1f060 6f 72 79 20 3f 4e 3f 0a 2a 2a 0a 2a 2a 20 41 74  ory ?N?.**.** At
1f070 74 65 6d 70 74 20 74 6f 20 72 65 6c 65 61 73 65  tempt to release
1f080 20 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e 74 6c   memory currentl
1f090 79 20 68 65 6c 64 20 62 75 74 20 6e 6f 74 20 61  y held but not a
1f0a0 63 74 75 61 6c 6c 79 20 72 65 71 75 69 72 65 64  ctually required
1f0b0 2e 0a 2a 2a 20 54 68 65 20 69 6e 74 65 67 65 72  ..** The integer
1f0c0 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
1f0d0 20 6f 66 20 62 79 74 65 73 20 77 65 20 61 72 65   of bytes we are
1f0e0 20 74 72 79 69 6e 67 20 74 6f 20 72 65 6c 65 61   trying to relea
1f0f0 73 65 2e 20 20 54 68 65 20 0a 2a 2a 20 72 65 74  se.  The .** ret
1f100 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
1f110 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72   amount of memor
1f120 79 20 61 63 74 75 61 6c 6c 79 20 72 65 6c 65 61  y actually relea
1f130 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  sed..*/.static i
1f140 6e 74 20 74 65 73 74 5f 72 65 6c 65 61 73 65 5f  nt test_release_
1f150 6d 65 6d 6f 72 79 28 0a 20 20 76 6f 69 64 20 2a  memory(.  void *
1f160 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1f170 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1f180 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1f190 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1f1a0 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 20 64 65  objv[].){.#if de
1f1b0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1f1c0 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
1f1d0 45 4d 45 4e 54 29 20 26 26 20 21 64 65 66 69 6e  EMENT) && !defin
1f1e0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
1f1f0 49 53 4b 49 4f 29 0a 20 20 69 6e 74 20 4e 3b 0a  ISKIO).  int N;.
1f200 20 20 69 6e 74 20 61 6d 74 3b 0a 20 20 69 66 28    int amt;.  if(
1f210 20 6f 62 6a 63 21 3d 31 20 26 26 20 6f 62 6a 63   objc!=1 && objc
1f220 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
1f230 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
1f240 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 4e  rp, 1, objv, "?N
1f250 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ?");.    return 
1f260 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1f270 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
1f280 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
1f290 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
1f2a0 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 4e 29 20 29  , objv[1], &N) )
1f2b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1f2c0 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  R;.  }else{.    
1f2d0 4e 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 61 6d  N = -1;.  }.  am
1f2e0 74 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 6c 65  t = sqlite3_rele
1f2f0 61 73 65 5f 6d 65 6d 6f 72 79 28 4e 29 3b 0a 20  ase_memory(N);. 
1f300 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
1f310 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
1f320 77 49 6e 74 4f 62 6a 28 61 6d 74 29 29 3b 0a 23  wIntObj(amt));.#
1f330 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54  endif.  return T
1f340 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  CL_OK;.}.../*.**
1f350 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
1f360 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  _db_release_memo
1f370 72 79 20 44 42 0a 2a 2a 0a 2a 2a 20 41 74 74 65  ry DB.**.** Atte
1f380 6d 70 74 20 74 6f 20 72 65 6c 65 61 73 65 20 6d  mpt to release m
1f390 65 6d 6f 72 79 20 63 75 72 72 65 6e 74 6c 79 20  emory currently 
1f3a0 68 65 6c 64 20 62 79 20 64 61 74 61 62 61 73 65  held by database
1f3b0 20 44 42 2e 20 20 52 65 74 75 72 6e 20 74 68 65   DB.  Return the
1f3c0 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 64 65 20  .** result code 
1f3d0 28 77 68 69 63 68 20 69 6e 20 74 68 65 20 63 75  (which in the cu
1f3e0 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
1f3f0 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 7a  tion is always z
1f400 65 72 6f 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ero)..*/.static 
1f410 69 6e 74 20 74 65 73 74 5f 64 62 5f 72 65 6c 65  int test_db_rele
1f420 61 73 65 5f 6d 65 6d 6f 72 79 28 0a 20 20 76 6f  ase_memory(.  vo
1f430 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1f440 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1f450 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1f460 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1f470 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1f480 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
1f490 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 6f 62 6a  nt rc;.  if( obj
1f4a0 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1f4b0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
1f4c0 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
1f4d0 42 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  B");.    return 
1f4e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1f4f0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
1f500 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1f510 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1f520 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
1f530 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
1f540 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c  = sqlite3_db_rel
1f550 65 61 73 65 5f 6d 65 6d 6f 72 79 28 64 62 29 3b  ease_memory(db);
1f560 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
1f570 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
1f580 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a  NewIntObj(rc));.
1f590 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1f5a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1f5b0 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c    sqlite3_db_fil
1f5c0 65 6e 61 6d 65 20 44 42 20 44 42 4e 41 4d 45 0a  ename DB DBNAME.
1f5d0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
1f5e0 20 6e 61 6d 65 20 6f 66 20 61 20 66 69 6c 65 20   name of a file 
1f5f0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1f600 61 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  a database..*/.s
1f610 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 64  tatic int test_d
1f620 62 5f 66 69 6c 65 6e 61 6d 65 28 0a 20 20 76 6f  b_filename(.  vo
1f630 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1f640 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1f650 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1f660 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1f670 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1f680 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
1f690 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
1f6a0 6d 65 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  me;.  if( objc!=
1f6b0 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  3 ){.    Tcl_Wro
1f6c0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
1f6d0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44  , 1, objv, "DB D
1f6e0 42 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74  BNAME");.    ret
1f6f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1f700 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
1f710 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1f720 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1f730 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
1f740 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1f750 20 7a 44 62 4e 61 6d 65 20 3d 20 54 63 6c 5f 47   zDbName = Tcl_G
1f760 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
1f770 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
1f780 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71  esult(interp, sq
1f790 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d  lite3_db_filenam
1f7a0 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 2c 20  e(db, zDbName), 
1f7b0 28 76 6f 69 64 2a 29 30 29 3b 0a 20 20 72 65 74  (void*)0);.  ret
1f7c0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1f7d0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
1f7e0 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79  ite3_db_readonly
1f7f0 20 44 42 20 44 42 4e 41 4d 45 0a 2a 2a 0a 2a 2a   DB DBNAME.**.**
1f800 20 52 65 74 75 72 6e 20 31 20 6f 72 20 30 20 69   Return 1 or 0 i
1f810 66 20 44 42 4e 41 4d 45 20 69 73 20 72 65 61 64  f DBNAME is read
1f820 6f 6e 6c 79 20 6f 72 20 6e 6f 74 2e 20 20 52 65  only or not.  Re
1f830 74 75 72 6e 20 2d 31 20 69 66 20 44 42 4e 41 4d  turn -1 if DBNAM
1f840 45 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78  E does.** not ex
1f850 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
1f860 6e 74 20 74 65 73 74 5f 64 62 5f 72 65 61 64 6f  nt test_db_reado
1f870 6e 6c 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  nly(.  void * cl
1f880 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1f890 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1f8a0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1f8b0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1f8c0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
1f8d0 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *db;.  const ch
1f8e0 61 72 20 2a 7a 44 62 4e 61 6d 65 3b 0a 20 20 69  ar *zDbName;.  i
1f8f0 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
1f900 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
1f910 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
1f920 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d 45 22 29  jv, "DB DBNAME")
1f930 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1f940 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
1f950 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
1f960 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1f970 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1f980 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
1f990 5f 45 52 52 4f 52 3b 0a 20 20 7a 44 62 4e 61 6d  _ERROR;.  zDbNam
1f9a0 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
1f9b0 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 54 63  g(objv[2]);.  Tc
1f9c0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1f9d0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
1f9e0 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 64 62 5f  tObj(sqlite3_db_
1f9f0 72 65 61 64 6f 6e 6c 79 28 64 62 2c 20 7a 44 62  readonly(db, zDb
1fa00 4e 61 6d 65 29 29 29 3b 0a 20 20 72 65 74 75 72  Name)));.  retur
1fa10 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1fa20 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
1fa30 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d  e3_soft_heap_lim
1fa40 69 74 20 3f 4e 3f 0a 2a 2a 0a 2a 2a 20 51 75 65  it ?N?.**.** Que
1fa50 72 79 20 6f 72 20 73 65 74 20 74 68 65 20 73 6f  ry or set the so
1fa60 66 74 20 68 65 61 70 20 6c 69 6d 69 74 20 66 6f  ft heap limit fo
1fa70 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68  r the current th
1fa80 72 65 61 64 2e 20 20 54 68 65 0a 2a 2a 20 6c 69  read.  The.** li
1fa90 6d 69 74 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e  mit is only chan
1faa0 67 65 64 20 69 66 20 74 68 65 20 4e 20 69 73 20  ged if the N is 
1fab0 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 70 72  present.  The pr
1fac0 65 76 69 6f 75 73 20 6c 69 6d 69 74 0a 2a 2a 20  evious limit.** 
1fad0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1fae0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1faf0 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 28  soft_heap_limit(
1fb00 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1fb10 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1fb20 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1fb30 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1fb40 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1fb50 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  ){.  sqlite3_int
1fb60 36 34 20 61 6d 74 3b 0a 20 20 54 63 6c 5f 57 69  64 amt;.  Tcl_Wi
1fb70 64 65 49 6e 74 20 4e 20 3d 20 2d 31 3b 0a 20 20  deInt N = -1;.  
1fb80 69 66 28 20 6f 62 6a 63 21 3d 31 20 26 26 20 6f  if( objc!=1 && o
1fb90 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
1fba0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
1fbb0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
1fbc0 22 3f 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74 75  "?N?");.    retu
1fbd0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1fbe0 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20  }.  if( objc==2 
1fbf0 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  ){.    if( Tcl_G
1fc00 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a  etWideIntFromObj
1fc10 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
1fc20 2c 20 26 4e 29 20 29 20 72 65 74 75 72 6e 20 54  , &N) ) return T
1fc30 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1fc40 61 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f 73 6f  amt = sqlite3_so
1fc50 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34 28  ft_heap_limit64(
1fc60 4e 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  N);.  Tcl_SetObj
1fc70 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1fc80 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
1fc90 28 61 6d 74 29 29 3b 0a 20 20 72 65 74 75 72 6e  (amt));.  return
1fca0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1fcb0 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
1fcc0 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75  e3_thread_cleanu
1fcd0 70 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65  p.**.** Call the
1fce0 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f   sqlite3_thread_
1fcf0 63 6c 65 61 6e 75 70 20 41 50 49 2e 0a 2a 2f 0a  cleanup API..*/.
1fd00 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1fd10 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28 0a  thread_cleanup(.
1fd20 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1fd30 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1fd40 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1fd50 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1fd60 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1fd70 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
1fd80 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
1fd90 0a 20 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  .  sqlite3_threa
1fda0 64 5f 63 6c 65 61 6e 75 70 28 29 3b 0a 23 65 6e  d_cleanup();.#en
1fdb0 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  dif.  return TCL
1fdc0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1fdd0 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 70  age:   sqlite3_p
1fde0 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 20 20  ager_refcounts  
1fdf0 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  DB.**.** Return 
1fe00 61 20 6c 69 73 74 20 6f 66 20 6e 75 6d 62 65 72  a list of number
1fe10 73 20 77 68 69 63 68 20 61 72 65 20 74 68 65 20  s which are the 
1fe20 50 61 67 65 72 52 65 66 63 6f 75 6e 74 20 66 6f  PagerRefcount fo
1fe30 72 20 61 6c 6c 0a 2a 2a 20 70 61 67 65 72 73 20  r all.** pagers 
1fe40 6f 6e 20 65 61 63 68 20 64 61 74 61 62 61 73 65  on each database
1fe50 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
1fe60 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1fe70 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 28  pager_refcounts(
1fe80 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1fe90 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1fea0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1feb0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1fec0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1fed0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1fee0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
1fef0 20 76 2c 20 2a 61 3b 0a 20 20 54 63 6c 5f 4f 62   v, *a;.  Tcl_Ob
1ff00 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 0a 20 20 69  j *pResult;..  i
1ff10 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
1ff20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1ff30 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1ff40 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1ff50 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
1ff60 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
1ff70 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
1ff80 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20  ), " DB", 0);.  
1ff90 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1ffa0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
1ffb0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
1ffc0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1ffd0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
1ffe0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1fff0 4f 52 3b 0a 20 20 70 52 65 73 75 6c 74 20 3d 20  OR;.  pResult = 
20000 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20  Tcl_NewObj();.  
20010 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
20020 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Db; i++){.    if
20030 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  ( db->aDb[i].pBt
20040 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20 3d  ==0 ){.      v =
20050 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   -1;.    }else{.
20060 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
20070 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
20080 74 65 78 29 3b 0a 20 20 20 20 20 20 61 20 3d 20  tex);.      a = 
20090 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 61 74  sqlite3PagerStat
200a0 73 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  s(sqlite3BtreePa
200b0 67 65 72 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  ger(db->aDb[i].p
200c0 42 74 29 29 3b 0a 20 20 20 20 20 20 76 20 3d 20  Bt));.      v = 
200d0 61 5b 30 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  a[0];.      sqli
200e0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
200f0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
20100 7d 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  }.    Tcl_ListOb
20110 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
20120 2c 20 70 52 65 73 75 6c 74 2c 20 54 63 6c 5f 4e  , pResult, Tcl_N
20130 65 77 49 6e 74 4f 62 6a 28 76 29 29 3b 0a 20 20  ewIntObj(v));.  
20140 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  }.  Tcl_SetObjRe
20150 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65  sult(interp, pRe
20160 73 75 6c 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  sult);.  return 
20170 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TCL_OK;.}.../*.*
20180 2a 20 74 63 6c 63 6d 64 3a 20 20 20 77 6f 72 6b  * tclcmd:   work
20190 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 0a 2a 2a  ing_64bit_int.**
201a0 0a 2a 2a 20 53 6f 6d 65 20 54 43 4c 20 62 75 69  .** Some TCL bui
201b0 6c 64 73 20 28 65 78 3a 20 63 79 67 77 69 6e 29  lds (ex: cygwin)
201c0 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20   do not support 
201d0 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 73 2e  64-bit integers.
201e0 20 20 54 68 69 73 0a 2a 2a 20 6c 65 61 64 73 20    This.** leads 
201f0 74 6f 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 74  to a number of t
20200 65 73 74 20 66 61 69 6c 75 72 65 73 2e 20 20 54  est failures.  T
20210 68 65 20 70 72 65 73 65 6e 74 20 63 6f 6d 6d 61  he present comma
20220 6e 64 20 63 68 65 63 6b 73 20 74 68 65 0a 2a 2a  nd checks the.**
20230 20 54 43 4c 20 62 75 69 6c 64 20 74 6f 20 73 65   TCL build to se
20240 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
20250 20 69 74 20 73 75 70 70 6f 72 74 73 20 36 34 2d   it supports 64-
20260 62 69 74 20 69 6e 74 65 67 65 72 73 2e 20 20 49  bit integers.  I
20270 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 54 52 55  t.** returns TRU
20280 45 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64  E if it does and
20290 20 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 0a 2a   FALSE if not..*
202a0 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e  *.** This comman
202b0 64 20 69 73 20 75 73 65 64 20 74 6f 20 77 61 72  d is used to war
202c0 6e 20 75 73 65 72 73 20 74 68 61 74 20 74 68 65  n users that the
202d0 69 72 20 54 43 4c 20 62 75 69 6c 64 20 69 73 20  ir TCL build is 
202e0 64 65 66 65 63 74 69 76 65 0a 2a 2a 20 61 6e 64  defective.** and
202f0 20 74 68 61 74 20 74 68 65 20 65 72 72 6f 72 73   that the errors
20300 20 74 68 65 79 20 61 72 65 20 73 65 65 69 6e 67   they are seeing
20310 20 69 6e 20 74 68 65 20 74 65 73 74 20 73 63 72   in the test scr
20320 69 70 74 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a  ipts might be.**
20330 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
20340 69 72 20 64 65 66 65 63 74 69 76 65 20 54 43 4c  ir defective TCL
20350 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 72 6f   rather than pro
20360 62 6c 65 6d 73 20 69 6e 20 53 51 4c 69 74 65 2e  blems in SQLite.
20370 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
20380 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74  orking_64bit_int
20390 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
203a0 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
203b0 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
203c0 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
203d0 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
203e0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
203f0 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
20400 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
20410 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
20420 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
20430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20440 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
20450 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
20460 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
20470 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
20480 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63  ments */.){.  Tc
20490 6c 5f 4f 62 6a 20 2a 70 54 65 73 74 4f 62 6a 3b  l_Obj *pTestObj;
204a0 0a 20 20 69 6e 74 20 77 6f 72 6b 69 6e 67 20 3d  .  int working =
204b0 20 30 3b 0a 0a 20 20 70 54 65 73 74 4f 62 6a 20   0;..  pTestObj 
204c0 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  = Tcl_NewWideInt
204d0 4f 62 6a 28 31 30 30 30 30 30 30 2a 28 69 36 34  Obj(1000000*(i64
204e0 29 31 32 33 34 35 36 37 38 39 30 29 3b 0a 20 20  )1234567890);.  
204f0 77 6f 72 6b 69 6e 67 20 3d 20 73 74 72 63 6d 70  working = strcmp
20500 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70  (Tcl_GetString(p
20510 54 65 73 74 4f 62 6a 29 2c 20 22 31 32 33 34 35  TestObj), "12345
20520 36 37 38 39 30 30 30 30 30 30 30 22 29 3d 3d 30  67890000000")==0
20530 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
20540 6f 75 6e 74 28 70 54 65 73 74 4f 62 6a 29 3b 0a  ount(pTestObj);.
20550 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
20560 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
20570 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 77 6f 72  ewBooleanObj(wor
20580 6b 69 6e 67 29 29 3b 0a 20 20 72 65 74 75 72 6e  king));.  return
20590 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
205a0 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76 66 73  ** tclcmd:   vfs
205b0 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74 0a 2a 2a 0a  _unlink_test.**.
205c0 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d  ** This TCL comm
205d0 61 6e 64 20 75 6e 72 65 67 69 73 74 65 72 73 20  and unregisters 
205e0 74 68 65 20 70 72 69 6d 61 72 79 20 56 46 53 20  the primary VFS 
205f0 61 6e 64 20 74 68 65 6e 20 72 65 67 69 73 74 65  and then registe
20600 72 73 0a 2a 2a 20 69 74 20 62 61 63 6b 20 61 67  rs.** it back ag
20610 61 69 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73  ain.  This is us
20620 65 64 20 74 6f 20 74 65 73 74 20 74 68 65 20 61  ed to test the a
20630 62 69 6c 69 74 79 20 74 6f 20 72 65 67 69 73 74  bility to regist
20640 65 72 20 61 0a 2a 2a 20 56 46 53 20 77 68 65 6e  er a.** VFS when
20650 20 6e 6f 6e 65 20 61 72 65 20 70 72 65 76 69 6f   none are previo
20660 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 2c  usly registered,
20670 20 61 6e 64 20 74 68 65 20 61 62 69 6c 69 74 79   and the ability
20680 20 74 6f 20 0a 2a 2a 20 75 6e 72 65 67 69 73 74   to .** unregist
20690 65 72 20 74 68 65 20 6f 6e 6c 79 20 61 76 61 69  er the only avai
206a0 6c 61 62 6c 65 20 56 46 53 2e 20 20 54 69 63 6b  lable VFS.  Tick
206b0 65 74 20 23 32 37 33 38 0a 2a 2f 0a 73 74 61 74  et #2738.*/.stat
206c0 69 63 20 69 6e 74 20 76 66 73 5f 75 6e 6c 69 6e  ic int vfs_unlin
206d0 6b 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74  k_test(.  Client
206e0 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
206f0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
20700 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
20710 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
20720 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
20730 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
20740 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
20750 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
20760 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
20770 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
20780 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
20790 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
207a0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
207b0 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
207c0 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
207d0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c  {.  int i;.  sql
207e0 69 74 65 33 5f 76 66 73 20 2a 70 4d 61 69 6e 3b  ite3_vfs *pMain;
207f0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
20800 61 70 56 66 73 5b 32 30 5d 3b 0a 20 20 73 71 6c  apVfs[20];.  sql
20810 69 74 65 33 5f 76 66 73 20 6f 6e 65 2c 20 74 77  ite3_vfs one, tw
20820 6f 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  o;..  sqlite3_vf
20830 73 5f 75 6e 72 65 67 69 73 74 65 72 28 30 29 3b  s_unregister(0);
20840 20 20 20 2f 2a 20 55 6e 72 65 67 69 73 74 65 72     /* Unregister
20850 20 6f 66 20 4e 55 4c 4c 20 69 73 20 68 61 72 6d   of NULL is harm
20860 6c 65 73 73 20 2a 2f 0a 20 20 6f 6e 65 2e 7a 4e  less */.  one.zN
20870 61 6d 65 20 3d 20 22 5f 5f 6f 6e 65 22 3b 0a 20  ame = "__one";. 
20880 20 74 77 6f 2e 7a 4e 61 6d 65 20 3d 20 22 5f 5f   two.zName = "__
20890 74 77 6f 22 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c  two";..  /* Call
208a0 69 6e 67 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  ing sqlite3_vfs_
208b0 72 65 67 69 73 74 65 72 20 77 69 74 68 20 32 6e  register with 2n
208c0 64 20 61 72 67 75 6d 65 6e 74 20 6f 66 20 30 20  d argument of 0 
208d0 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 63 68  does not.  ** ch
208e0 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c 74  ange the default
208f0 20 56 46 53 0a 20 20 2a 2f 0a 20 20 70 4d 61 69   VFS.  */.  pMai
20900 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  n = sqlite3_vfs_
20910 66 69 6e 64 28 30 29 3b 0a 20 20 73 71 6c 69 74  find(0);.  sqlit
20920 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
20930 26 6f 6e 65 2c 20 30 29 3b 0a 20 20 61 73 73 65  &one, 0);.  asse
20940 72 74 28 20 70 4d 61 69 6e 3d 3d 30 20 7c 7c 20  rt( pMain==0 || 
20950 70 4d 61 69 6e 3d 3d 73 71 6c 69 74 65 33 5f 76  pMain==sqlite3_v
20960 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20 20  fs_find(0) );.  
20970 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
20980 73 74 65 72 28 26 74 77 6f 2c 20 30 29 3b 0a 20  ster(&two, 0);. 
20990 20 61 73 73 65 72 74 28 20 70 4d 61 69 6e 3d 3d   assert( pMain==
209a0 30 20 7c 7c 20 70 4d 61 69 6e 3d 3d 73 71 6c 69  0 || pMain==sqli
209b0 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20  te3_vfs_find(0) 
209c0 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 63 61 6e 20  );..  /* We can 
209d0 66 69 6e 64 20 61 20 56 46 53 20 62 79 20 69 74  find a VFS by it
209e0 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 73 73 65  s name */.  asse
209f0 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
20a00 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26  find("__one")==&
20a10 6f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  one );.  assert(
20a20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
20a30 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f  d("__two")==&two
20a40 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c 69 6e   );..  /* Callin
20a50 67 20 73 71 6c 69 74 65 5f 76 66 73 5f 72 65 67  g sqlite_vfs_reg
20a60 69 73 74 65 72 20 77 69 74 68 20 6e 6f 6e 2d 7a  ister with non-z
20a70 65 72 6f 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  ero second param
20a80 65 74 65 72 20 63 68 61 6e 67 65 73 20 74 68 65  eter changes the
20a90 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 56 46  .  ** default VF
20aa0 53 2c 20 65 76 65 6e 20 69 66 20 74 68 65 20 31  S, even if the 1
20ab0 73 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  st parameter is 
20ac0 61 6e 20 65 78 69 73 74 69 67 20 56 46 53 20 74  an existig VFS t
20ad0 68 61 74 20 69 73 0a 20 20 2a 2a 20 70 72 65 76  hat is.  ** prev
20ae0 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65  iously registere
20af0 64 20 61 73 20 74 68 65 20 6e 6f 6e 2d 64 65 66  d as the non-def
20b00 61 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ault..  */.  sql
20b10 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
20b20 72 28 26 6f 6e 65 2c 20 31 29 3b 0a 20 20 61 73  r(&one, 1);.  as
20b30 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66  sert( sqlite3_vf
20b40 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d  s_find("__one")=
20b50 3d 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72  =&one );.  asser
20b60 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
20b70 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74  ind("__two")==&t
20b80 77 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  wo );.  assert( 
20b90 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
20ba0 28 30 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 73  (0)==&one );.  s
20bb0 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
20bc0 74 65 72 28 26 74 77 6f 2c 20 31 29 3b 0a 20 20  ter(&two, 1);.  
20bd0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
20be0 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22  vfs_find("__one"
20bf0 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73  )==&one );.  ass
20c00 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
20c10 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d  _find("__two")==
20c20 26 74 77 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  &two );.  assert
20c30 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
20c40 6e 64 28 30 29 3d 3d 26 74 77 6f 20 29 3b 0a 20  nd(0)==&two );. 
20c50 20 69 66 28 20 70 4d 61 69 6e 20 29 7b 0a 20 20   if( pMain ){.  
20c60 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65    sqlite3_vfs_re
20c70 67 69 73 74 65 72 28 70 4d 61 69 6e 2c 20 31 29  gister(pMain, 1)
20c80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
20c90 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22  lite3_vfs_find("
20ca0 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20 29 3b  __one")==&one );
20cb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
20cc0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f  ite3_vfs_find("_
20cd0 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b 0a  _two")==&two );.
20ce0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
20cf0 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d  te3_vfs_find(0)=
20d00 3d 70 4d 61 69 6e 20 29 3b 0a 20 20 7d 0a 20 20  =pMain );.  }.  
20d10 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65  .  /* Unlink the
20d20 20 64 65 66 61 75 6c 74 20 56 46 53 2e 20 20 52   default VFS.  R
20d30 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65 72  epeat until ther
20d40 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 56 46  e are no more VF
20d50 53 65 73 0a 20 20 2a 2a 20 72 65 67 69 73 74 65  Ses.  ** registe
20d60 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  red..  */.  for(
20d70 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 70  i=0; i<sizeof(ap
20d80 56 66 73 29 2f 73 69 7a 65 6f 66 28 61 70 56 66  Vfs)/sizeof(apVf
20d90 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  s[0]); i++){.   
20da0 20 61 70 56 66 73 5b 69 5d 20 3d 20 73 71 6c 69   apVfs[i] = sqli
20db0 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b  te3_vfs_find(0);
20dc0 0a 20 20 20 20 69 66 28 20 61 70 56 66 73 5b 69  .    if( apVfs[i
20dd0 5d 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ] ){.      asser
20de0 74 28 20 61 70 56 66 73 5b 69 5d 3d 3d 73 71 6c  t( apVfs[i]==sql
20df0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 61 70  ite3_vfs_find(ap
20e00 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29  Vfs[i]->zName) )
20e10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
20e20 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 61  vfs_unregister(a
20e30 70 56 66 73 5b 69 5d 29 3b 0a 20 20 20 20 20 20  pVfs[i]);.      
20e40 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74  assert( 0==sqlit
20e50 65 33 5f 76 66 73 5f 66 69 6e 64 28 61 70 56 66  e3_vfs_find(apVf
20e60 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a  s[i]->zName) );.
20e70 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
20e80 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 76  rt( 0==sqlite3_v
20e90 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20 20  fs_find(0) );.  
20ea0 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74  .  /* Register t
20eb0 68 65 20 6d 61 69 6e 20 56 46 53 20 61 73 20 6e  he main VFS as n
20ec0 6f 6e 2d 64 65 66 61 75 6c 74 20 28 77 69 6c 6c  on-default (will
20ed0 20 62 65 20 6d 61 64 65 20 64 65 66 61 75 6c 74   be made default
20ee0 2c 20 73 69 6e 63 65 0a 20 20 2a 2a 20 69 74 27  , since.  ** it'
20ef0 6c 6c 20 62 65 20 74 68 65 20 6f 6e 6c 79 20 6f  ll be the only o
20f00 6e 65 20 69 6e 20 65 78 69 73 74 65 6e 63 65 29  ne in existence)
20f10 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
20f20 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 70 4d  _vfs_register(pM
20f30 61 69 6e 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  ain, 0);.  asser
20f40 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
20f50 69 6e 64 28 30 29 3d 3d 70 4d 61 69 6e 20 29 3b  ind(0)==pMain );
20f60 0a 20 20 0a 20 20 2f 2a 20 55 6e 2d 72 65 67 69  .  .  /* Un-regi
20f70 73 74 65 72 20 74 68 65 20 6d 61 69 6e 20 56 46  ster the main VF
20f80 53 20 61 67 61 69 6e 20 74 6f 20 72 65 73 74 6f  S again to resto
20f90 72 65 20 61 6e 20 65 6d 70 74 79 20 56 46 53 20  re an empty VFS 
20fa0 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  list */.  sqlite
20fb0 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72  3_vfs_unregister
20fc0 28 70 4d 61 69 6e 29 3b 0a 20 20 61 73 73 65 72  (pMain);.  asser
20fd0 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 76 66  t( 0==sqlite3_vf
20fe0 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 0a 20 20  s_find(0) );..  
20ff0 2f 2a 20 52 65 6c 69 6e 6b 20 61 6c 6c 20 56 46  /* Relink all VF
21000 53 65 73 20 69 6e 20 72 65 76 65 72 73 65 20 6f  Ses in reverse o
21010 72 64 65 72 2e 20 2a 2f 20 20 0a 20 20 66 6f 72  rder. */  .  for
21020 28 69 3d 73 69 7a 65 6f 66 28 61 70 56 66 73 29  (i=sizeof(apVfs)
21030 2f 73 69 7a 65 6f 66 28 61 70 56 66 73 5b 30 5d  /sizeof(apVfs[0]
21040 29 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  )-1; i>=0; i--){
21050 0a 20 20 20 20 69 66 28 20 61 70 56 66 73 5b 69  .    if( apVfs[i
21060 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ] ){.      sqlit
21070 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
21080 61 70 56 66 73 5b 69 5d 2c 20 31 29 3b 0a 20 20  apVfs[i], 1);.  
21090 20 20 20 20 61 73 73 65 72 74 28 20 61 70 56 66      assert( apVf
210a0 73 5b 69 5d 3d 3d 73 71 6c 69 74 65 33 5f 76 66  s[i]==sqlite3_vf
210b0 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20 20 20  s_find(0) );.   
210c0 20 20 20 61 73 73 65 72 74 28 20 61 70 56 66 73     assert( apVfs
210d0 5b 69 5d 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73  [i]==sqlite3_vfs
210e0 5f 66 69 6e 64 28 61 70 56 66 73 5b 69 5d 2d 3e  _find(apVfs[i]->
210f0 7a 4e 61 6d 65 29 20 29 3b 0a 20 20 20 20 7d 0a  zName) );.    }.
21100 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 72 65 67 69    }..  /* Unregi
21110 73 74 65 72 20 6f 75 74 20 73 61 6d 70 6c 65 20  ster out sample 
21120 56 46 53 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69  VFSes. */.  sqli
21130 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74  te3_vfs_unregist
21140 65 72 28 26 6f 6e 65 29 3b 0a 20 20 73 71 6c 69  er(&one);.  sqli
21150 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74  te3_vfs_unregist
21160 65 72 28 26 74 77 6f 29 3b 0a 0a 20 20 2f 2a 20  er(&two);..  /* 
21170 55 6e 72 65 67 69 73 74 65 72 69 6e 67 20 61 20  Unregistering a 
21180 56 46 53 20 74 68 61 74 20 69 73 20 6e 6f 74 20  VFS that is not 
21190 63 75 72 72 65 6e 74 6c 79 20 72 65 67 69 73 74  currently regist
211a0 65 72 65 64 20 69 73 20 68 61 72 6d 6c 65 73 73  ered is harmless
211b0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   */.  sqlite3_vf
211c0 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26 6f 6e  s_unregister(&on
211d0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  e);.  sqlite3_vf
211e0 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26 74 77  s_unregister(&tw
211f0 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  o);.  assert( sq
21200 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22  lite3_vfs_find("
21210 5f 5f 6f 6e 65 22 29 3d 3d 30 20 29 3b 0a 20 20  __one")==0 );.  
21220 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
21230 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22  vfs_find("__two"
21240 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 65  )==0 );..  /* We
21250 20 73 68 6f 75 6c 64 20 62 65 20 6c 65 66 74 20   should be left 
21260 77 69 74 68 20 74 68 65 20 6f 72 69 67 69 6e 61  with the origina
21270 6c 20 64 65 66 61 75 6c 74 20 56 46 53 20 62 61  l default VFS ba
21280 63 6b 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 6f  ck as the.  ** o
21290 72 69 67 69 6e 61 6c 20 2a 2f 0a 20 20 61 73 73  riginal */.  ass
212a0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
212b0 5f 66 69 6e 64 28 30 29 3d 3d 70 4d 61 69 6e 20  _find(0)==pMain 
212c0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  );..  return TCL
212d0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63  _OK;.}../*.** tc
212e0 6c 63 6d 64 3a 20 20 20 76 66 73 5f 69 6e 69 74  lcmd:   vfs_init
212f0 66 61 69 6c 5f 74 65 73 74 0a 2a 2a 0a 2a 2a 20  fail_test.**.** 
21300 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  This TCL command
21310 20 61 74 74 65 6d 70 74 73 20 74 6f 20 76 66 73   attempts to vfs
21320 5f 66 69 6e 64 20 61 6e 64 20 76 66 73 5f 72 65  _find and vfs_re
21330 67 69 73 74 65 72 20 77 68 65 6e 20 74 68 65 0a  gister when the.
21340 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69  ** sqlite3_initi
21350 61 6c 69 7a 65 28 29 20 69 6e 74 65 72 66 61 63  alize() interfac
21360 65 20 69 73 20 66 61 69 6c 69 6e 67 2e 20 20 41  e is failing.  A
21370 6c 6c 20 63 61 6c 6c 73 20 73 68 6f 75 6c 64 20  ll calls should 
21380 66 61 69 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  fail..*/.static 
21390 69 6e 74 20 76 66 73 5f 69 6e 69 74 66 61 69 6c  int vfs_initfail
213a0 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44  _test(.  ClientD
213b0 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
213c0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
213d0 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
213e0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
213f0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
21400 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
21410 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
21420 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
21430 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
21440 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
21450 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
21460 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
21470 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
21480 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
21490 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
214a0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f  .  sqlite3_vfs o
214b0 6e 65 3b 0a 20 20 6f 6e 65 2e 7a 4e 61 6d 65 20  ne;.  one.zName 
214c0 3d 20 22 5f 5f 6f 6e 65 22 3b 0a 0a 20 20 69 66  = "__one";..  if
214d0 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
214e0 6e 64 28 30 29 20 29 20 72 65 74 75 72 6e 20 54  nd(0) ) return T
214f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69  CL_ERROR;.  sqli
21500 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
21510 28 26 6f 6e 65 2c 20 30 29 3b 0a 20 20 69 66 28  (&one, 0);.  if(
21520 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
21530 64 28 30 29 20 29 20 72 65 74 75 72 6e 20 54 43  d(0) ) return TC
21540 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74  L_ERROR;.  sqlit
21550 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
21560 26 6f 6e 65 2c 20 31 29 3b 0a 20 20 69 66 28 20  &one, 1);.  if( 
21570 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
21580 28 30 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  (0) ) return TCL
21590 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e  _ERROR;.  return
215a0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
215b0 2a 20 53 61 76 65 64 20 56 46 53 65 73 0a 2a 2f  * Saved VFSes.*/
215c0 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
215d0 76 66 73 20 2a 61 70 56 66 73 5b 32 30 5d 3b 0a  vfs *apVfs[20];.
215e0 73 74 61 74 69 63 20 69 6e 74 20 6e 56 66 73 20  static int nVfs 
215f0 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  = 0;../*.** tclc
21600 6d 64 3a 20 20 20 76 66 73 5f 75 6e 72 65 67 69  md:   vfs_unregi
21610 73 74 65 72 5f 61 6c 6c 0a 2a 2a 0a 2a 2a 20 55  ster_all.**.** U
21620 6e 72 65 67 69 73 74 65 72 20 61 6c 6c 20 56 46  nregister all VF
21630 53 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Ses..*/.static i
21640 6e 74 20 76 66 73 5f 75 6e 72 65 67 69 73 74 65  nt vfs_unregiste
21650 72 5f 61 6c 6c 28 0a 20 20 43 6c 69 65 6e 74 44  r_all(.  ClientD
21660 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
21670 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
21680 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
21690 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
216a0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
216b0 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
216c0 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
216d0 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
216e0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
216f0 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
21700 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
21710 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
21720 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
21730 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
21740 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
21750 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
21760 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
21770 28 61 70 56 66 73 29 3b 20 69 2b 2b 29 7b 0a 20  (apVfs); i++){. 
21780 20 20 20 61 70 56 66 73 5b 69 5d 20 3d 20 73 71     apVfs[i] = sq
21790 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
217a0 29 3b 0a 20 20 20 20 69 66 28 20 61 70 56 66 73  );.    if( apVfs
217b0 5b 69 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  [i]==0 ) break;.
217c0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f      sqlite3_vfs_
217d0 75 6e 72 65 67 69 73 74 65 72 28 61 70 56 66 73  unregister(apVfs
217e0 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 6e 56 66 73  [i]);.  }.  nVfs
217f0 20 3d 20 69 3b 0a 20 20 72 65 74 75 72 6e 20 54   = i;.  return T
21800 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74  CL_OK;.}./*.** t
21810 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f 72 65 72  clcmd:   vfs_rer
21820 65 67 69 73 74 65 72 5f 61 6c 6c 0a 2a 2a 0a 2a  egister_all.**.*
21830 2a 20 52 65 73 74 6f 72 65 20 61 6c 6c 20 56 46  * Restore all VF
21840 53 65 73 20 74 68 61 74 20 77 65 72 65 20 72 65  Ses that were re
21850 6d 6f 76 65 64 20 75 73 69 6e 67 20 76 66 73 5f  moved using vfs_
21860 75 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c 0a 2a  unregister_all.*
21870 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73  /.static int vfs
21880 5f 72 65 72 65 67 69 73 74 65 72 5f 61 6c 6c 28  _reregister_all(
21890 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
218a0 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
218b0 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
218c0 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
218d0 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
218e0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
218f0 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
21900 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
21910 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
21920 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
21930 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21940 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
21950 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
21960 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
21970 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
21980 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ents */.){.  int
21990 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
219a0 3c 6e 56 66 73 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nVfs; i++){.   
219b0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
219c0 69 73 74 65 72 28 61 70 56 66 73 5b 69 5d 2c 20  ister(apVfs[i], 
219d0 69 3d 3d 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  i==0);.  }.  ret
219e0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
219f0 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
21a00 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73  file_control_tes
21a10 74 20 44 42 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  t DB.**.** This 
21a20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73  TCL command runs
21a30 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
21a40 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66  e_control interf
21a50 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66  ace and.** verif
21a60 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72  ies correct oper
21a70 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d  ation of the sam
21a80 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
21a90 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65   file_control_te
21aa0 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  st(.  ClientData
21ab0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
21ac0 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
21ad0 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
21ae0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
21af0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
21b00 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
21b10 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
21b20 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
21b30 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
21b40 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
21b50 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
21b60 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
21b70 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
21b80 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
21b90 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
21ba0 69 6e 74 20 69 41 72 67 20 3d 20 30 3b 0a 20 20  int iArg = 0;.  
21bb0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
21bc0 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
21bd0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
21be0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
21bf0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
21c00 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
21c10 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
21c20 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
21c30 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
21c40 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
21c50 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
21c60 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
21c70 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
21c80 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
21c90 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
21ca0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
21cb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
21cc0 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 30  le_control(db, 0
21cd0 2c 20 30 2c 20 26 69 41 72 67 29 3b 0a 20 20 61  , 0, &iArg);.  a
21ce0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
21cf0 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 3b 0a 20 20  E_NOTFOUND );.  
21d00 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
21d10 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6e  e_control(db, "n
21d20 6f 74 61 64 61 74 61 62 61 73 65 22 2c 20 53 51  otadatabase", SQ
21d30 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53  LITE_FCNTL_LOCKS
21d40 54 41 54 45 2c 20 26 69 41 72 67 29 3b 0a 20 20  TATE, &iArg);.  
21d50 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
21d60 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 72 63  TE_ERROR );.  rc
21d70 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
21d80 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6d 61 69  control(db, "mai
21d90 6e 22 2c 20 2d 31 2c 20 26 69 41 72 67 29 3b 0a  n", -1, &iArg);.
21da0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
21db0 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 3b  LITE_NOTFOUND );
21dc0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
21dd0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
21de0 20 22 74 65 6d 70 22 2c 20 2d 31 2c 20 26 69 41   "temp", -1, &iA
21df0 72 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  rg);.  assert( r
21e00 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  c==SQLITE_NOTFOU
21e10 4e 44 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  ND || rc==SQLITE
21e20 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20 72 65 74  _ERROR );..  ret
21e30 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
21e40 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
21e50 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73  file_control_las
21e60 74 65 72 72 6e 6f 5f 74 65 73 74 20 44 42 0a 2a  terrno_test DB.*
21e70 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f  *.** This TCL co
21e80 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73  mmand runs the s
21e90 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
21ea0 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 61 6e  rol interface an
21eb0 64 0a 2a 2a 20 76 65 72 69 66 69 65 73 20 63 6f  d.** verifies co
21ec0 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20  rrect operation 
21ed0 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 41  of the SQLITE_LA
21ee0 53 54 5f 45 52 52 4e 4f 20 76 65 72 62 2e 0a 2a  ST_ERRNO verb..*
21ef0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
21f00 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72  e_control_laster
21f10 72 6e 6f 5f 74 65 73 74 28 0a 20 20 43 6c 69 65  rno_test(.  Clie
21f20 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
21f30 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
21f40 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
21f50 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
21f60 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
21f70 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
21f80 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
21f90 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
21fa0 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
21fb0 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
21fc0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
21fd0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
21fe0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
21ff0 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
22000 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
22010 0a 29 7b 0a 20 20 69 6e 74 20 69 41 72 67 20 3d  .){.  int iArg =
22020 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   0;.  sqlite3 *d
22030 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  b;.  int rc;..  
22040 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
22050 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
22060 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
22070 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
22080 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
22090 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
220a0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
220b0 30 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20  0), " DB", 0);. 
220c0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
220d0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
220e0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
220f0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
22100 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
22110 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
22120 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
22130 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
22140 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55  e_control(db, NU
22150 4c 4c 2c 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f  LL, SQLITE_LAST_
22160 45 52 52 4e 4f 2c 20 26 69 41 72 67 29 3b 0a 20  ERRNO, &iArg);. 
22170 20 69 66 28 20 72 63 20 29 7b 20 0a 20 20 20 20   if( rc ){ .    
22180 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
22190 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
221a0 49 6e 74 4f 62 6a 28 72 63 29 29 3b 20 0a 20 20  IntObj(rc)); .  
221b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
221c0 4f 52 3b 20 0a 20 20 7d 0a 20 20 69 66 28 20 69  OR; .  }.  if( i
221d0 41 72 67 21 3d 30 20 29 20 7b 0a 20 20 20 20 54  Arg!=0 ) {.    T
221e0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
221f0 69 6e 74 65 72 70 2c 20 22 55 6e 65 78 70 65 63  interp, "Unexpec
22200 74 65 64 20 6e 6f 6e 2d 7a 65 72 6f 20 65 72 72  ted non-zero err
22210 6e 6f 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20  no: ",.         
22220 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
22230 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
22240 28 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 69  (Tcl_NewIntObj(i
22250 41 72 67 29 2c 20 30 29 2c 20 22 20 22 2c 20 30  Arg), 0), " ", 0
22260 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
22270 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
22280 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a  eturn TCL_OK;  .
22290 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
222a0 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
222b0 63 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74 20 44  chunksize_test D
222c0 42 20 44 42 4e 41 4d 45 20 53 49 5a 45 0a 2a 2a  B DBNAME SIZE.**
222d0 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d  .** This TCL com
222e0 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71  mand runs the sq
222f0 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
22300 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 61 6e 64  ol interface and
22310 0a 2a 2a 20 76 65 72 69 66 69 65 73 20 63 6f 72  .** verifies cor
22320 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  rect operation o
22330 66 20 74 68 65 20 53 51 4c 49 54 45 5f 47 45 54  f the SQLITE_GET
22340 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 61  _LOCKPROXYFILE a
22350 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 45 54  nd.** SQLITE_SET
22360 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 76  _LOCKPROXYFILE v
22370 65 72 62 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  erbs..*/.static 
22380 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  int file_control
22390 5f 63 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74 28  _chunksize_test(
223a0 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
223b0 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
223c0 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
223d0 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
223e0 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
223f0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
22400 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
22410 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
22420 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
22430 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
22440 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22450 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
22460 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
22470 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
22480 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
22490 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ents */.){.  int
224a0 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   nSize;         
224b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
224c0 4e 65 77 20 63 68 75 6e 6b 20 73 69 7a 65 20 2a  New chunk size *
224d0 2f 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 20 20  /.  char *zDb;  
224e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224f0 20 20 20 20 2f 2a 20 44 62 20 6e 61 6d 65 20 28      /* Db name (
22500 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20 65  "main", "temp" e
22510 74 63 2e 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tc.) */.  sqlite
22520 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
22530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
22540 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
22550 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
22560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22570 20 20 2f 2a 20 66 69 6c 65 5f 63 6f 6e 74 72 6f    /* file_contro
22580 6c 28 29 20 72 65 74 75 72 6e 20 63 6f 64 65 20  l() return code 
22590 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  */..  if( objc!=
225a0 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  4 ){.    Tcl_Wro
225b0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
225c0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44  , 1, objv, "DB D
225d0 42 4e 41 4d 45 20 53 49 5a 45 22 29 3b 0a 20 20  BNAME SIZE");.  
225e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
225f0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
22600 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
22610 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
22620 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
22630 0a 20 20 20 7c 7c 20 54 63 6c 5f 47 65 74 49 6e  .   || Tcl_GetIn
22640 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
22650 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 69 7a 65   objv[3], &nSize
22660 29 0a 20 20 29 7b 0a 20 20 20 72 65 74 75 72 6e  ).  ){.   return
22670 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
22680 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53    zDb = Tcl_GetS
22690 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
226a0 20 20 69 66 28 20 7a 44 62 5b 30 5d 3d 3d 27 5c    if( zDb[0]=='\
226b0 30 27 20 29 20 7a 44 62 20 3d 20 4e 55 4c 4c 3b  0' ) zDb = NULL;
226c0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
226d0 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
226e0 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46 43  , zDb, SQLITE_FC
226f0 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 2c 20  NTL_CHUNK_SIZE, 
22700 28 76 6f 69 64 20 2a 29 26 6e 53 69 7a 65 29 3b  (void *)&nSize);
22710 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
22720 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
22730 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73  nterp, (char *)s
22740 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
22750 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
22760 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
22770 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
22780 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
22790 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69  .** tclcmd:   fi
227a0 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69 7a 65 68  le_control_sizeh
227b0 69 6e 74 5f 74 65 73 74 20 44 42 20 44 42 4e 41  int_test DB DBNA
227c0 4d 45 20 53 49 5a 45 0a 2a 2a 0a 2a 2a 20 54 68  ME SIZE.**.** Th
227d0 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72  is TCL command r
227e0 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f  uns the sqlite3_
227f0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74  file_control int
22800 65 72 66 61 63 65 20 0a 2a 2a 20 77 69 74 68 20  erface .** with 
22810 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a  SQLITE_FCNTL_SIZ
22820 45 5f 48 49 4e 54 0a 2a 2f 0a 73 74 61 74 69 63  E_HINT.*/.static
22830 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f   int file_contro
22840 6c 5f 73 69 7a 65 68 69 6e 74 5f 74 65 73 74 28  l_sizehint_test(
22850 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
22860 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
22870 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
22880 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
22890 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
228a0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
228b0 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
228c0 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
228d0 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
228e0 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
228f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22900 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
22910 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
22920 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
22930 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
22940 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c  ents */.){.  Tcl
22950 5f 57 69 64 65 49 6e 74 20 6e 53 69 7a 65 3b 20  _WideInt nSize; 
22960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22970 48 69 6e 74 65 64 20 73 69 7a 65 20 2a 2f 0a 20  Hinted size */. 
22980 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20   char *zDb;     
22990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229a0 20 2f 2a 20 44 62 20 6e 61 6d 65 20 28 22 6d 61   /* Db name ("ma
229b0 69 6e 22 2c 20 22 74 65 6d 70 22 20 65 74 63 2e  in", "temp" etc.
229c0 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  ) */.  sqlite3 *
229d0 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
229e0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
229f0 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  se handle */.  i
22a00 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
22a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22a20 2a 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29  * file_control()
22a30 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
22a40 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29  .  if( objc!=4 )
22a50 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
22a60 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
22a70 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44 42 4e 41  , objv, "DB DBNA
22a80 4d 45 20 53 49 5a 45 22 29 3b 0a 20 20 20 20 72  ME SIZE");.    r
22a90 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
22aa0 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
22ab0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
22ac0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
22ad0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 0a 20 20  jv[1]), &db) .  
22ae0 20 7c 7c 20 54 63 6c 5f 47 65 74 57 69 64 65 49   || Tcl_GetWideI
22af0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
22b00 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 69 7a  , objv[3], &nSiz
22b10 65 29 0a 20 20 29 7b 0a 20 20 20 72 65 74 75 72  e).  ){.   retur
22b20 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
22b30 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74  .  zDb = Tcl_Get
22b40 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
22b50 0a 20 20 69 66 28 20 7a 44 62 5b 30 5d 3d 3d 27  .  if( zDb[0]=='
22b60 5c 30 27 20 29 20 7a 44 62 20 3d 20 4e 55 4c 4c  \0' ) zDb = NULL
22b70 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
22b80 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
22b90 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46  b, zDb, SQLITE_F
22ba0 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20  CNTL_SIZE_HINT, 
22bb0 28 76 6f 69 64 20 2a 29 26 6e 53 69 7a 65 29 3b  (void *)&nSize);
22bc0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
22bd0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
22be0 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73  nterp, (char *)s
22bf0 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
22c00 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
22c10 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
22c20 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
22c30 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
22c40 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69  .** tclcmd:   fi
22c50 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b 70  le_control_lockp
22c60 72 6f 78 79 5f 74 65 73 74 20 44 42 20 50 57 44  roxy_test DB PWD
22c70 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20  .**.** This TCL 
22c80 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65  command runs the
22c90 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
22ca0 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20  ntrol interface 
22cb0 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73 20  and.** verifies 
22cc0 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f  correct operatio
22cd0 6e 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f  n of the SQLITE_
22ce0 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  GET_LOCKPROXYFIL
22cf0 45 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  E and.** SQLITE_
22d00 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
22d10 45 20 76 65 72 62 73 2e 0a 2a 2f 0a 73 74 61 74  E verbs..*/.stat
22d20 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74  ic int file_cont
22d30 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74 65  rol_lockproxy_te
22d40 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  st(.  ClientData
22d50 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
22d60 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
22d70 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
22d80 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
22d90 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
22da0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
22db0 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
22dc0 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
22dd0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
22de0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
22df0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
22e00 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
22e10 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
22e20 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
22e30 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
22e40 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 0a  sqlite3 *db;.  .
22e50 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
22e60 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
22e70 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
22e80 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
22e90 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
22ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22eb0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
22ec0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
22ed0 29 2c 20 22 20 44 42 20 50 57 44 22 2c 20 30 29  ), " DB PWD", 0)
22ee0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
22ef0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
22f00 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
22f10 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
22f20 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
22f30 64 62 29 20 29 7b 0a 20 20 20 72 65 74 75 72 6e  db) ){.   return
22f40 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
22f50 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28    .#if !defined(
22f60 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
22f70 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
22f80 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
22f90 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
22fa0 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
22fb0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
22fc0 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
22fd0 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
22fe0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
22ff0 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
23000 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
23010 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
23020 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
23030 50 50 4c 45 5f 5f 29 0a 20 20 7b 0a 20 20 20 20  PPLE__).  {.    
23040 63 68 61 72 20 2a 74 65 73 74 50 61 74 68 3b 0a  char *testPath;.
23050 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
23060 69 6e 74 20 6e 50 77 64 3b 0a 20 20 20 20 63 6f  int nPwd;.    co
23070 6e 73 74 20 63 68 61 72 20 2a 7a 50 77 64 3b 0a  nst char *zPwd;.
23080 20 20 20 20 63 68 61 72 20 70 72 6f 78 79 50 61      char proxyPa
23090 74 68 5b 34 30 30 5d 3b 0a 20 20 20 20 0a 20 20  th[400];.    .  
230a0 20 20 7a 50 77 64 20 3d 20 54 63 6c 5f 47 65 74    zPwd = Tcl_Get
230b0 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
230c0 6a 76 5b 32 5d 2c 20 26 6e 50 77 64 29 3b 0a 20  jv[2], &nPwd);. 
230d0 20 20 20 69 66 28 20 73 69 7a 65 6f 66 28 70 72     if( sizeof(pr
230e0 6f 78 79 50 61 74 68 29 3c 6e 50 77 64 2b 32 30  oxyPath)<nPwd+20
230f0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
23100 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
23110 70 2c 20 22 50 57 44 20 74 6f 6f 20 62 69 67 22  p, "PWD too big"
23120 2c 20 28 76 6f 69 64 2a 29 30 29 3b 0a 20 20 20  , (void*)0);.   
23130 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
23140 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ROR;.    }.    s
23150 70 72 69 6e 74 66 28 70 72 6f 78 79 50 61 74 68  printf(proxyPath
23160 2c 20 22 25 73 2f 74 65 73 74 2e 70 72 6f 78 79  , "%s/test.proxy
23170 22 2c 20 7a 50 77 64 29 3b 0a 20 20 20 20 72 63  ", zPwd);.    rc
23180 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
23190 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c  control(db, NULL
231a0 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  , SQLITE_SET_LOC
231b0 4b 50 52 4f 58 59 46 49 4c 45 2c 20 70 72 6f 78  KPROXYFILE, prox
231c0 79 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20  yPath);.    if( 
231d0 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  rc ){.      Tcl_
231e0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
231f0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
23200 62 6a 28 72 63 29 29 3b 20 0a 20 20 20 20 20 20  bj(rc)); .      
23210 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
23220 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
23230 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
23240 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20  ntrol(db, NULL, 
23250 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50  SQLITE_GET_LOCKP
23260 52 4f 58 59 46 49 4c 45 2c 20 26 74 65 73 74 50  ROXYFILE, &testP
23270 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 73 74  ath);.    if( st
23280 72 6e 63 6d 70 28 70 72 6f 78 79 50 61 74 68 2c  rncmp(proxyPath,
23290 74 65 73 74 50 61 74 68 2c 31 31 29 20 29 7b 0a  testPath,11) ){.
232a0 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
232b0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
232c0 4c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 20  Lock proxy file 
232d0 64 69 64 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  did not match th
232e0 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  e ".            
232f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23300 20 20 20 22 70 72 65 76 69 6f 75 73 6c 79 20 61     "previously a
23310 73 73 69 67 6e 65 64 20 76 61 6c 75 65 22 2c 20  ssigned value", 
23320 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
23330 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
23340 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  }.    if( rc ){.
23350 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
23360 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
23370 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29  cl_NewIntObj(rc)
23380 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
23390 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
233a0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
233b0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
233c0 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f  b, NULL, SQLITE_
233d0 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
233e0 45 2c 20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20  E, proxyPath);. 
233f0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
23400 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
23410 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
23420 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a  NewIntObj(rc));.
23430 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
23440 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
23450 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
23460 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 23  n TCL_OK;  .}..#
23470 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
23480 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
23490 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69   file_control_wi
234a0 6e 33 32 5f 61 76 5f 72 65 74 72 79 20 44 42 20  n32_av_retry DB 
234b0 20 4e 52 45 54 52 59 20 20 44 45 4c 41 59 0a 2a   NRETRY  DELAY.*
234c0 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f  *.** This TCL co
234d0 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73  mmand runs the s
234e0 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
234f0 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 77 69  rol interface wi
23500 74 68 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  th.** the SQLITE
23510 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 41 56 5f  _FCNTL_WIN32_AV_
23520 52 45 54 52 59 20 6f 70 63 6f 64 65 2e 0a 2a 2f  RETRY opcode..*/
23530 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65  .static int file
23540 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 61  _control_win32_a
23550 76 5f 72 65 74 72 79 28 0a 20 20 43 6c 69 65 6e  v_retry(.  Clien
23560 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
23570 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
23580 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
23590 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
235a0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
235b0 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
235c0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
235d0 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
235e0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
235f0 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
23600 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
23610 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
23620 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
23630 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
23640 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
23650 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
23660 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
23670 74 20 61 5b 32 5d 3b 0a 20 20 63 68 61 72 20 7a  t a[2];.  char z
23680 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62  [100];..  if( ob
23690 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
236a0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
236b0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
236c0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
236d0 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
236e0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
236f0 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
23700 44 42 20 4e 52 45 54 52 59 20 44 45 4c 41 59 22  DB NRETRY DELAY"
23710 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
23720 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
23730 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
23740 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
23750 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
23760 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72  ), &db) ){.    r
23770 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
23780 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
23790 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
237a0 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 61  erp, objv[2], &a
237b0 5b 30 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43  [0]) ) return TC
237c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
237d0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
237e0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
237f0 2c 20 26 61 5b 31 5d 29 20 29 20 72 65 74 75 72  , &a[1]) ) retur
23800 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
23810 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
23820 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c  _control(db, NUL
23830 4c 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  L, SQLITE_FCNTL_
23840 57 49 4e 33 32 5f 41 56 5f 52 45 54 52 59 2c 20  WIN32_AV_RETRY, 
23850 28 76 6f 69 64 2a 29 61 29 3b 0a 20 20 73 71 6c  (void*)a);.  sql
23860 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
23870 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 64 20  zeof(z), z, "%d 
23880 25 64 20 25 64 22 2c 20 72 63 2c 20 61 5b 30 5d  %d %d", rc, a[0]
23890 2c 20 61 5b 31 5d 29 3b 0a 20 20 54 63 6c 5f 41  , a[1]);.  Tcl_A
238a0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
238b0 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30 29  rp, z, (char*)0)
238c0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
238d0 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63  K;  .}../*.** tc
238e0 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e  lcmd:   file_con
238f0 74 72 6f 6c 5f 77 69 6e 33 32 5f 73 65 74 5f 68  trol_win32_set_h
23900 61 6e 64 6c 65 20 44 42 20 48 41 4e 44 4c 45 0a  andle DB HANDLE.
23910 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63  **.** This TCL c
23920 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20  ommand runs the 
23930 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
23940 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 77  trol interface w
23950 69 74 68 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54  ith.** the SQLIT
23960 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 53 45  E_FCNTL_WIN32_SE
23970 54 5f 48 41 4e 44 4c 45 20 6f 70 63 6f 64 65 2e  T_HANDLE opcode.
23980 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
23990 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33  ile_control_win3
239a0 32 5f 73 65 74 5f 68 61 6e 64 6c 65 28 0a 20 20  2_set_handle(.  
239b0 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
239c0 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
239d0 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
239e0 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
239f0 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
23a00 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
23a10 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
23a20 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
23a30 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
23a40 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
23a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
23a60 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
23a70 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
23a80 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
23a90 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
23aa0 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
23ab0 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
23ac0 0a 20 20 48 41 4e 44 4c 45 20 68 46 69 6c 65 20  .  HANDLE hFile 
23ad0 3d 20 4e 55 4c 4c 3b 0a 20 20 63 68 61 72 20 7a  = NULL;.  char z
23ae0 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62  [100];..  if( ob
23af0 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
23b00 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
23b10 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
23b20 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
23b30 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
23b40 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
23b50 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
23b60 44 42 20 48 41 4e 44 4c 45 22 2c 20 30 29 3b 0a  DB HANDLE", 0);.
23b70 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
23b80 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
23b90 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
23ba0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
23bb0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
23bc0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
23bd0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
23be0 20 69 66 28 20 67 65 74 57 69 6e 33 32 48 61 6e   if( getWin32Han
23bf0 64 6c 65 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  dle(interp, Tcl_
23c00 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
23c10 5d 29 2c 20 26 68 46 69 6c 65 29 20 29 7b 0a 20  ]), &hFile) ){. 
23c20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
23c30 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ROR;.  }.  rc = 
23c40 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
23c50 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53  trol(db, NULL, S
23c60 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33  QLITE_FCNTL_WIN3
23c70 32 5f 53 45 54 5f 48 41 4e 44 4c 45 2c 0a 20 20  2_SET_HANDLE,.  
23c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c90 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
23ca0 29 26 68 46 69 6c 65 29 3b 0a 20 20 73 71 6c 69  )&hFile);.  sqli
23cb0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
23cc0 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 64 20 25  eof(z), z, "%d %
23cd0 70 22 2c 20 72 63 2c 20 28 76 6f 69 64 2a 29 68  p", rc, (void*)h
23ce0 46 69 6c 65 29 3b 0a 20 20 54 63 6c 5f 41 70 70  File);.  Tcl_App
23cf0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
23d00 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  , z, (char*)0);.
23d10 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
23d20 20 20 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a    .}.#endif../*.
23d30 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c  ** tclcmd:   fil
23d40 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72 73 69 73  e_control_persis
23d50 74 5f 77 61 6c 20 44 42 20 50 45 52 53 49 53 54  t_wal DB PERSIST
23d60 2d 46 4c 41 47 0a 2a 2a 0a 2a 2a 20 54 68 69 73  -FLAG.**.** This
23d70 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e   TCL command run
23d80 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  s the sqlite3_fi
23d90 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72  le_control inter
23da0 66 61 63 65 20 77 69 74 68 0a 2a 2a 20 74 68 65  face with.** the
23db0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45   SQLITE_FCNTL_PE
23dc0 52 53 49 53 54 5f 57 41 4c 20 6f 70 63 6f 64 65  RSIST_WAL opcode
23dd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23de0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72  file_control_per
23df0 73 69 73 74 5f 77 61 6c 28 0a 20 20 43 6c 69 65  sist_wal(.  Clie
23e00 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
23e10 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
23e20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
23e30 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
23e40 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
23e50 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
23e60 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
23e70 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
23e80 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
23e90 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
23ea0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
23eb0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
23ec0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
23ed0 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
23ee0 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
23ef0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
23f00 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  b;.  int rc;.  i
23f10 6e 74 20 62 50 65 72 73 69 73 74 3b 0a 20 20 63  nt bPersist;.  c
23f20 68 61 72 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69  har z[100];..  i
23f30 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
23f40 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
23f50 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
23f60 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
23f70 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
23f80 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
23f90 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
23fa0 29 2c 20 22 20 44 42 20 46 4c 41 47 22 2c 20 30  ), " DB FLAG", 0
23fb0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
23fc0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
23fd0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
23fe0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
23ff0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
24000 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  &db) ){.    retu
24010 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
24020 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  }.  if( Tcl_GetI
24030 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
24040 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 62 50 65 72  , objv[2], &bPer
24050 73 69 73 74 29 20 29 20 72 65 74 75 72 6e 20 54  sist) ) return T
24060 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
24070 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
24080 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20  ntrol(db, NULL, 
24090 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52  SQLITE_FCNTL_PER
240a0 53 49 53 54 5f 57 41 4c 2c 20 28 76 6f 69 64 2a  SIST_WAL, (void*
240b0 29 26 62 50 65 72 73 69 73 74 29 3b 0a 20 20 73  )&bPersist);.  s
240c0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
240d0 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25  sizeof(z), z, "%
240e0 64 20 25 64 22 2c 20 72 63 2c 20 62 50 65 72 73  d %d", rc, bPers
240f0 69 73 74 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  ist);.  Tcl_Appe
24100 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
24110 20 7a 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20   z, (char*)0);. 
24120 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
24130 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d   .}../*.** tclcm
24140 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  d:   file_contro
24150 6c 5f 70 6f 77 65 72 73 61 66 65 5f 6f 76 65 72  l_powersafe_over
24160 77 72 69 74 65 20 44 42 20 50 53 4f 57 2d 46 4c  write DB PSOW-FL
24170 41 47 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43  AG.**.** This TC
24180 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74  L command runs t
24190 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  he sqlite3_file_
241a0 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63  control interfac
241b0 65 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 53 51  e with.** the SQ
241c0 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52  LITE_FCNTL_POWER
241d0 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 6f  SAFE_OVERWRITE o
241e0 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  pcode..*/.static
241f0 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f   int file_contro
24200 6c 5f 70 6f 77 65 72 73 61 66 65 5f 6f 76 65 72  l_powersafe_over
24210 77 72 69 74 65 28 0a 20 20 43 6c 69 65 6e 74 44  write(.  ClientD
24220 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
24230 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
24240 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
24250 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
24260 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
24270 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
24280 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
24290 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
242a0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
242b0 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
242c0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
242d0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
242e0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
242f0 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
24300 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
24310 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
24320 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
24330 62 3b 0a 20 20 63 68 61 72 20 7a 5b 31 30 30 5d  b;.  char z[100]
24340 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
24350 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
24360 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
24370 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
24380 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
24390 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
243a0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
243b0 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 46 4c  [0], 0), " DB FL
243c0 41 47 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  AG", 0);.    ret
243d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
243e0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
243f0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
24400 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
24410 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20  [1]), &db) ){.  
24420 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
24430 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63  OR;.  }.  if( Tc
24440 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
24450 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
24460 20 26 62 29 20 29 20 72 65 74 75 72 6e 20 54 43   &b) ) return TC
24470 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
24480 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
24490 74 72 6f 6c 28 64 62 2c 4e 55 4c 4c 2c 53 51 4c  trol(db,NULL,SQL
244a0 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53  ITE_FCNTL_POWERS
244b0 41 46 45 5f 4f 56 45 52 57 52 49 54 45 2c 28 76  AFE_OVERWRITE,(v
244c0 6f 69 64 2a 29 26 62 29 3b 0a 20 20 73 71 6c 69  oid*)&b);.  sqli
244d0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
244e0 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 64 20 25  eof(z), z, "%d %
244f0 64 22 2c 20 72 63 2c 20 62 29 3b 0a 20 20 54 63  d", rc, b);.  Tc
24500 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
24510 6e 74 65 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a  nterp, z, (char*
24520 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )0);.  return TC
24530 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a  L_OK;  .}.../*.*
24540 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65  * tclcmd:   file
24550 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d 65  _control_vfsname
24560 20 44 42 20 3f 41 55 58 44 42 3f 0a 2a 2a 0a 2a   DB ?AUXDB?.**.*
24570 2a 20 52 65 74 75 72 6e 20 61 20 73 74 72 69 6e  * Return a strin
24580 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  g that describes
24590 20 74 68 65 20 73 74 61 63 6b 20 6f 66 20 56 46   the stack of VF
245a0 53 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Ses..*/.static i
245b0 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  nt file_control_
245c0 76 66 73 6e 61 6d 65 28 0a 20 20 43 6c 69 65 6e  vfsname(.  Clien
245d0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
245e0 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
245f0 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
24600 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
24610 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
24620 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
24630 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
24640 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
24650 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
24660 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
24670 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
24680 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
24690 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
246a0 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
246b0 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
246c0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
246d0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
246e0 7a 44 62 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22  zDbName = "main"
246f0 3b 0a 20 20 63 68 61 72 20 2a 7a 56 66 73 4e 61  ;.  char *zVfsNa
24700 6d 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f  me = 0;..  if( o
24710 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d  bjc!=2 && objc!=
24720 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
24730 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
24740 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
24750 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
24760 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
24770 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
24780 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 3f  v[0], 0), " DB ?
24790 41 55 58 44 42 3f 22 2c 20 30 29 3b 0a 20 20 20  AUXDB?", 0);.   
247a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
247b0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
247c0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
247d0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
247e0 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
247f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
24800 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
24810 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20  ( objc==3 ){.   
24820 20 7a 44 62 4e 61 6d 65 20 3d 20 54 63 6c 5f 47   zDbName = Tcl_G
24830 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
24840 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
24850 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
24860 2c 20 7a 44 62 4e 61 6d 65 2c 20 53 51 4c 49 54  , zDbName, SQLIT
24870 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 2c  E_FCNTL_VFSNAME,
24880 28 76 6f 69 64 2a 29 26 7a 56 66 73 4e 61 6d 65  (void*)&zVfsName
24890 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
248a0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 56  esult(interp, zV
248b0 66 73 4e 61 6d 65 2c 20 28 63 68 61 72 2a 29 30  fsName, (char*)0
248c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
248d0 65 28 7a 56 66 73 4e 61 6d 65 29 3b 0a 20 20 72  e(zVfsName);.  r
248e0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a  eturn TCL_OK;  .
248f0 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
24900 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
24910 74 65 6d 70 66 69 6c 65 6e 61 6d 65 20 44 42 20  tempfilename DB 
24920 3f 41 55 58 44 42 3f 0a 2a 2a 0a 2a 2a 20 52 65  ?AUXDB?.**.** Re
24930 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68  turn a string th
24940 61 74 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  at is a temporar
24950 79 20 66 69 6c 65 6e 61 6d 65 0a 2a 2f 0a 73 74  y filename.*/.st
24960 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f  atic int file_co
24970 6e 74 72 6f 6c 5f 74 65 6d 70 66 69 6c 65 6e 61  ntrol_tempfilena
24980 6d 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  me(.  ClientData
24990 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
249a0 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
249b0 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
249c0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
249d0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
249e0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
249f0 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
24a00 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
24a10 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
24a20 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
24a30 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
24a40 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
24a50 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
24a60 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
24a70 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
24a80 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
24a90 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
24aa0 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 63  me = "main";.  c
24ab0 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b  har *zTName = 0;
24ac0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
24ad0 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  && objc!=3 ){.  
24ae0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
24af0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
24b00 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
24b10 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
24b20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
24b30 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
24b40 29 2c 20 22 20 44 42 20 3f 41 55 58 44 42 3f 22  ), " DB ?AUXDB?"
24b50 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
24b60 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
24b70 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
24b80 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
24b90 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
24ba0 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72  ), &db) ){.    r
24bb0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
24bc0 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d  .  }.  if( objc=
24bd0 3d 33 20 29 7b 0a 20 20 20 20 7a 44 62 4e 61 6d  =3 ){.    zDbNam
24be0 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
24bf0 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7d 0a  g(objv[2]);.  }.
24c00 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63    sqlite3_file_c
24c10 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62 4e 61  ontrol(db, zDbNa
24c20 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  me, SQLITE_FCNTL
24c30 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 2c 20 28  _TEMPFILENAME, (
24c40 76 6f 69 64 2a 29 26 7a 54 4e 61 6d 65 29 3b 0a  void*)&zTName);.
24c50 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
24c60 6c 74 28 69 6e 74 65 72 70 2c 20 7a 54 4e 61 6d  lt(interp, zTNam
24c70 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  e, (char*)0);.  
24c80 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 4e  sqlite3_free(zTN
24c90 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ame);.  return T
24ca0 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a  CL_OK;  .}.../*.
24cb0 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 73 71 6c  ** tclcmd:   sql
24cc0 69 74 65 33 5f 76 66 73 5f 6c 69 73 74 0a 2a 2a  ite3_vfs_list.**
24cd0 0a 2a 2a 20 20 20 52 65 74 75 72 6e 20 61 20 74  .**   Return a t
24ce0 63 6c 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69  cl list containi
24cf0 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ng the names of 
24d00 61 6c 6c 20 72 65 67 69 73 74 65 72 65 64 20 76  all registered v
24d10 66 73 27 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  fs's..*/.static 
24d20 69 6e 74 20 76 66 73 5f 6c 69 73 74 28 0a 20 20  int vfs_list(.  
24d30 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
24d40 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
24d50 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
24d60 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
24d70 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
24d80 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
24d90 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
24da0 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
24db0 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
24dc0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
24dd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
24de0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
24df0 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
24e00 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
24e10 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
24e20 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
24e30 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20 20 54  3_vfs *pVfs;.  T
24e40 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 20 3d 20 54  cl_Obj *pRet = T
24e50 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 69  cl_NewObj();.  i
24e60 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20  f( objc!=1 ){.  
24e70 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
24e80 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
24e90 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 72 65 74  jv, "");.    ret
24ea0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
24eb0 20 7d 0a 20 20 66 6f 72 28 70 56 66 73 3d 73 71   }.  for(pVfs=sq
24ec0 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
24ed0 29 3b 20 70 56 66 73 3b 20 70 56 66 73 3d 70 56  ); pVfs; pVfs=pV
24ee0 66 73 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  fs->pNext){.    
24ef0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
24f00 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
24f10 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74   pRet, Tcl_NewSt
24f20 72 69 6e 67 4f 62 6a 28 70 56 66 73 2d 3e 7a 4e  ringObj(pVfs->zN
24f30 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a 20  ame, -1));.  }. 
24f40 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
24f50 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b  t(interp, pRet);
24f60 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
24f70 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  ;  .}../*.** tcl
24f80 63 6d 64 3a 20 20 20 73 71 6c 69 74 65 33 5f 6c  cmd:   sqlite3_l
24f90 69 6d 69 74 20 44 42 20 49 44 20 56 41 4c 55 45  imit DB ID VALUE
24fa0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20  .**.** This TCL 
24fb0 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65  command runs the
24fc0 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 20 69   sqlite3_limit i
24fd0 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20  nterface and.** 
24fe0 76 65 72 69 66 69 65 73 20 63 6f 72 72 65 63 74  verifies correct
24ff0 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   operation of th
25000 65 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  e same..*/.stati
25010 63 20 69 6e 74 20 74 65 73 74 5f 6c 69 6d 69 74  c int test_limit
25020 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
25030 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
25040 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
25050 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
25060 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
25070 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
25080 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
25090 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
250a0 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
250b0 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
250c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
250d0 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
250e0 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
250f0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
25100 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
25110 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
25120 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
25130 20 72 63 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   rc;.  static co
25140 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
25150 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
25160 20 20 20 20 69 6e 74 20 69 64 3b 0a 20 20 7d 20      int id;.  } 
25170 61 49 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  aId[] = {.    { 
25180 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45  "SQLITE_LIMIT_LE
25190 4e 47 54 48 22 2c 20 20 20 20 20 20 20 20 20 20  NGTH",          
251a0 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
251b0 5f 4c 45 4e 47 54 48 20 20 20 20 20 20 20 20 20  _LENGTH         
251c0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
251d0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c  SQLITE_LIMIT_SQL
251e0 5f 4c 45 4e 47 54 48 22 2c 20 20 20 20 20 20 20  _LENGTH",       
251f0 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
25200 53 51 4c 5f 4c 45 4e 47 54 48 20 20 20 20 20 20  SQL_LENGTH      
25210 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53       },.    { "S
25220 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
25230 4d 4e 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  MN",            
25240 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43    SQLITE_LIMIT_C
25250 4f 4c 55 4d 4e 20 20 20 20 20 20 20 20 20 20 20  OLUMN           
25260 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
25270 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f  LITE_LIMIT_EXPR_
25280 44 45 50 54 48 22 2c 20 20 20 20 20 20 20 20 20  DEPTH",         
25290 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58   SQLITE_LIMIT_EX
252a0 50 52 5f 44 45 50 54 48 20 20 20 20 20 20 20 20  PR_DEPTH        
252b0 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c     },.    { "SQL
252c0 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55  ITE_LIMIT_COMPOU
252d0 4e 44 5f 53 45 4c 45 43 54 22 2c 20 20 20 20 20  ND_SELECT",     
252e0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d  SQLITE_LIMIT_COM
252f0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 20 20 20  POUND_SELECT    
25300 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
25310 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50  TE_LIMIT_VDBE_OP
25320 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 53  ",             S
25330 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45  QLITE_LIMIT_VDBE
25340 5f 4f 50 20 20 20 20 20 20 20 20 20 20 20 20 20  _OP             
25350 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
25360 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e  E_LIMIT_FUNCTION
25370 5f 41 52 47 22 2c 20 20 20 20 20 20 20 20 53 51  _ARG",        SQ
25380 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54  LITE_LIMIT_FUNCT
25390 49 4f 4e 5f 41 52 47 20 20 20 20 20 20 20 20 20  ION_ARG         
253a0 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  },.    { "SQLITE
253b0 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44 22  _LIMIT_ATTACHED"
253c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c  ,            SQL
253d0 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48  ITE_LIMIT_ATTACH
253e0 45 44 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  ED             }
253f0 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f  ,.    { "SQLITE_
25400 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45  LIMIT_LIKE_PATTE
25410 52 4e 5f 4c 45 4e 47 54 48 22 2c 20 53 51 4c 49  RN_LENGTH", SQLI
25420 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41  TE_LIMIT_LIKE_PA
25430 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 20 7d 2c  TTERN_LENGTH  },
25440 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c  .    { "SQLITE_L
25450 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
25460 4d 42 45 52 22 2c 20 20 20 20 20 53 51 4c 49 54  MBER",     SQLIT
25470 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
25480 5f 4e 55 4d 42 45 52 20 20 20 20 20 20 7d 2c 0a  _NUMBER      },.
25490 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49      { "SQLITE_LI
254a0 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MIT_TRIGGER_DEPT
254b0 48 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45  H",       SQLITE
254c0 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44  _LIMIT_TRIGGER_D
254d0 45 50 54 48 20 20 20 20 20 20 20 20 7d 2c 0a 20  EPTH        },. 
254e0 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d     { "SQLITE_LIM
254f0 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  IT_WORKER_THREAD
25500 53 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f  S",      SQLITE_
25510 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52  LIMIT_WORKER_THR
25520 45 41 44 53 20 20 20 20 20 20 20 7d 2c 0a 20 20  EADS       },.  
25530 20 20 0a 20 20 20 20 2f 2a 20 4f 75 74 20 6f 66    .    /* Out of
25540 20 72 61 6e 67 65 20 74 65 73 74 20 63 61 73 65   range test case
25550 73 20 2a 2f 0a 20 20 20 20 7b 20 22 53 51 4c 49  s */.    { "SQLI
25560 54 45 5f 4c 49 4d 49 54 5f 54 4f 4f 53 4d 41 4c  TE_LIMIT_TOOSMAL
25570 4c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 2d  L",            -
25580 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
25590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255a0 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
255b0 45 5f 4c 49 4d 49 54 5f 54 4f 4f 42 49 47 22 2c  E_LIMIT_TOOBIG",
255c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
255d0 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45  LITE_LIMIT_WORKE
255e0 52 5f 54 48 52 45 41 44 53 2b 31 20 20 20 20 20  R_THREADS+1     
255f0 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c  },.  };.  int i,
25600 20 69 64 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a   id;.  int val;.
25610 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
25620 64 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  d;..  if( objc!=
25630 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
25640 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
25650 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
25660 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
25670 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
25680 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
25690 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 49  v[0], 0), " DB I
256a0 44 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20  D VALUE", 0);.  
256b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
256c0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
256d0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
256e0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
256f0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
25700 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
25710 4f 52 3b 0a 20 20 7a 49 64 20 3d 20 54 63 6c 5f  OR;.  zId = Tcl_
25720 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
25730 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ]);.  for(i=0; i
25740 3c 73 69 7a 65 6f 66 28 61 49 64 29 2f 73 69 7a  <sizeof(aId)/siz
25750 65 6f 66 28 61 49 64 5b 30 5d 29 3b 20 69 2b 2b  eof(aId[0]); i++
25760 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
25770 70 28 7a 49 64 2c 20 61 49 64 5b 69 5d 2e 7a 4e  p(zId, aId[i].zN
25780 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
25790 20 69 64 20 3d 20 61 49 64 5b 69 5d 2e 69 64 3b   id = aId[i].id;
257a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
257b0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 3e    }.  }.  if( i>
257c0 3d 73 69 7a 65 6f 66 28 61 49 64 29 2f 73 69 7a  =sizeof(aId)/siz
257d0 65 6f 66 28 61 49 64 5b 30 5d 29 20 29 7b 0a 20  eof(aId[0]) ){. 
257e0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
257f0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b  ult(interp, "unk
25800 6e 6f 77 6e 20 6c 69 6d 69 74 20 74 79 70 65 3a  nown limit type:
25810 20 22 2c 20 7a 49 64 2c 20 28 63 68 61 72 2a 29   ", zId, (char*)
25820 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
25830 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
25840 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
25850 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
25860 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72  jv[3], &val) ) r
25870 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
25880 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
25890 6c 69 6d 69 74 28 64 62 2c 20 69 64 2c 20 76 61  limit(db, id, va
258a0 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  l);.  Tcl_SetObj
258b0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
258c0 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29  cl_NewIntObj(rc)
258d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
258e0 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  OK;  .}../*.** t
258f0 63 6c 63 6d 64 3a 20 20 73 61 76 65 5f 70 72 6e  clcmd:  save_prn
25900 67 5f 73 74 61 74 65 0a 2a 2a 0a 2a 2a 20 53 61  g_state.**.** Sa
25910 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ve the state of 
25920 74 68 65 20 70 73 65 75 64 6f 2d 72 61 6e 64 6f  the pseudo-rando
25930 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74  m number generat
25940 6f 72 2e 0a 2a 2a 20 41 74 20 74 68 65 20 73 61  or..** At the sa
25950 6d 65 20 74 69 6d 65 2c 20 76 65 72 69 66 79 20  me time, verify 
25960 74 68 61 74 20 73 71 6c 69 74 65 33 5f 74 65 73  that sqlite3_tes
25970 74 5f 63 6f 6e 74 72 6f 6c 20 77 6f 72 6b 73 20  t_control works 
25980 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 63 61 6c  even when.** cal
25990 6c 65 64 20 77 69 74 68 20 61 6e 20 6f 75 74 2d  led with an out-
259a0 6f 66 2d 72 61 6e 67 65 20 6f 70 63 6f 64 65 2e  of-range opcode.
259b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
259c0 61 76 65 5f 70 72 6e 67 5f 73 74 61 74 65 28 0a  ave_prng_state(.
259d0 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
259e0 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
259f0 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
25a00 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
25a10 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
25a20 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
25a30 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
25a40 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
25a50 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
25a60 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
25a70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
25a80 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
25a90 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
25aa0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
25ab0 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
25ac0 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nts */.){.  int 
25ad0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73  rc = sqlite3_tes
25ae0 74 5f 63 6f 6e 74 72 6f 6c 28 39 39 39 39 29 3b  t_control(9999);
25af0 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30  .  assert( rc==0
25b00 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
25b10 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
25b20 2d 31 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  -1);.  assert( r
25b30 63 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  c==0 );.  sqlite
25b40 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
25b50 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
25b60 52 4e 47 5f 53 41 56 45 29 3b 0a 20 20 72 65 74  RNG_SAVE);.  ret
25b70 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a  urn TCL_OK;.}./*
25b80 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 72 65 73  .** tclcmd:  res
25b90 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 0a  tore_prng_state.
25ba0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
25bb0 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65  store_prng_state
25bc0 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
25bd0 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
25be0 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
25bf0 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
25c00 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
25c10 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
25c20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
25c30 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
25c40 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
25c50 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
25c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25c70 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
25c80 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
25c90 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
25ca0 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
25cb0 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
25cc0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
25cd0 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
25ce0 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 29  RL_PRNG_RESTORE)
25cf0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
25d00 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  K;.}./*.** tclcm
25d10 64 3a 20 20 72 65 73 65 74 5f 70 72 6e 67 5f 73  d:  reset_prng_s
25d20 74 61 74 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tate.*/.static i
25d30 6e 74 20 72 65 73 65 74 5f 70 72 6e 67 5f 73 74  nt reset_prng_st
25d40 61 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  ate(.  ClientDat
25d50 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
25d60 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
25d70 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
25d80 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
25d90 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
25da0 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
25db0 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
25dc0 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
25dd0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
25de0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
25df0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
25e00 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
25e10 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
25e20 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
25e30 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
25e40 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
25e50 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
25e60 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54  TCTRL_PRNG_RESET
25e70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
25e80 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  OK;.}../*.** tcl
25e90 63 6d 64 3a 20 20 64 61 74 61 62 61 73 65 5f 6d  cmd:  database_m
25ea0 61 79 5f 62 65 5f 63 6f 72 72 75 70 74 0a 2a 2a  ay_be_corrupt.**
25eb0 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61  .** Indicate tha
25ec0 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  t database files
25ed0 20 6d 69 67 68 74 20 62 65 20 63 6f 72 72 75 70   might be corrup
25ee0 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  t.  In other wor
25ef0 64 73 2c 20 73 65 74 20 74 68 65 20 6e 6f 72 6d  ds, set the norm
25f00 61 6c 0a 2a 2a 20 73 74 61 74 65 20 6f 66 20 6f  al.** state of o
25f10 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  peration..*/.sta
25f20 74 69 63 20 69 6e 74 20 64 61 74 61 62 61 73 65  tic int database
25f30 5f 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70 74 28  _may_be_corrupt(
25f40 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
25f50 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
25f60 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
25f70 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
25f80 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
25f90 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
25fa0 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
25fb0 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
25fc0 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
25fd0 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
25fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25ff0 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
26000 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
26010 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
26020 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
26030 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
26040 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
26050 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
26060 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 2c  L_NEVER_CORRUPT,
26070 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43   0);.  return TC
26080 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63  L_OK;.}./*.** tc
26090 6c 63 6d 64 3a 20 20 64 61 74 61 62 61 73 65 5f  lcmd:  database_
260a0 6e 65 76 65 72 5f 63 6f 72 72 75 70 74 0a 2a 2a  never_corrupt.**
260b0 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61  .** Indicate tha
260c0 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  t database files
260d0 20 61 72 65 20 61 6c 77 61 79 73 20 77 65 6c 6c   are always well
260e0 2d 66 6f 72 6d 65 64 2e 20 20 54 68 69 73 20 65  -formed.  This e
260f0 6e 61 62 6c 65 73 20 65 78 74 72 61 20 61 73 73  nables extra ass
26100 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65  ert().** stateme
26110 6e 74 73 20 74 68 61 74 20 74 65 73 74 20 63 6f  nts that test co
26120 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 61 72  nditions that ar
26130 65 20 61 6c 77 61 79 73 20 74 72 75 65 20 66 6f  e always true fo
26140 72 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  r well-formed da
26150 74 61 62 61 73 65 73 2e 0a 2a 2f 0a 73 74 61 74  tabases..*/.stat
26160 69 63 20 69 6e 74 20 64 61 74 61 62 61 73 65 5f  ic int database_
26170 6e 65 76 65 72 5f 63 6f 72 72 75 70 74 28 0a 20  never_corrupt(. 
26180 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
26190 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
261a0 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
261b0 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
261c0 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
261d0 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
261e0 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
261f0 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
26200 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
26210 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
26220 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
26230 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
26240 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
26250 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
26260 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
26270 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
26280 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
26290 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
262a0 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 2c 20 31  NEVER_CORRUPT, 1
262b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
262c0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  OK;.}../*.** tcl
262d0 63 6d 64 3a 20 20 70 63 61 63 68 65 5f 73 74 61  cmd:  pcache_sta
262e0 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ts.*/.static int
262f0 20 74 65 73 74 5f 70 63 61 63 68 65 5f 73 74 61   test_pcache_sta
26300 74 73 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  ts(.  ClientData
26310 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
26320 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
26330 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
26340 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
26350 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
26360 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
26370 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
26380 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
26390 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
263a0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
263b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
263c0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
263d0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
263e0 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
263f0 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
26400 69 6e 74 20 6e 4d 69 6e 3b 0a 20 20 69 6e 74 20  int nMin;.  int 
26410 6e 4d 61 78 3b 0a 20 20 69 6e 74 20 6e 43 75 72  nMax;.  int nCur
26420 72 65 6e 74 3b 0a 20 20 69 6e 74 20 6e 52 65 63  rent;.  int nRec
26430 79 63 6c 61 62 6c 65 3b 0a 20 20 54 63 6c 5f 4f  yclable;.  Tcl_O
26440 62 6a 20 2a 70 52 65 74 3b 0a 0a 20 20 73 71 6c  bj *pRet;..  sql
26450 69 74 65 33 50 63 61 63 68 65 53 74 61 74 73 28  ite3PcacheStats(
26460 26 6e 43 75 72 72 65 6e 74 2c 20 26 6e 4d 61 78  &nCurrent, &nMax
26470 2c 20 26 6e 4d 69 6e 2c 20 26 6e 52 65 63 79 63  , &nMin, &nRecyc
26480 6c 61 62 6c 65 29 3b 0a 0a 20 20 70 52 65 74 20  lable);..  pRet 
26490 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a  = Tcl_NewObj();.
264a0 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
264b0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
264c0 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
264d0 53 74 72 69 6e 67 4f 62 6a 28 22 63 75 72 72 65  StringObj("curre
264e0 6e 74 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  nt", -1));.  Tcl
264f0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
26500 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
26510 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  et, Tcl_NewIntOb
26520 6a 28 6e 43 75 72 72 65 6e 74 29 29 3b 0a 20 20  j(nCurrent));.  
26530 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
26540 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
26550 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74   pRet, Tcl_NewSt
26560 72 69 6e 67 4f 62 6a 28 22 6d 61 78 22 2c 20 2d  ringObj("max", -
26570 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  1));.  Tcl_ListO
26580 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
26590 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63  interp, pRet, Tc
265a0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 4d 61 78  l_NewIntObj(nMax
265b0 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
265c0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
265d0 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c  nterp, pRet, Tcl
265e0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d  _NewStringObj("m
265f0 69 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  in", -1));.  Tcl
26600 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
26610 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
26620 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  et, Tcl_NewIntOb
26630 6a 28 6e 4d 69 6e 29 29 3b 0a 20 20 54 63 6c 5f  j(nMin));.  Tcl_
26640 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
26650 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
26660 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  t, Tcl_NewString
26670 4f 62 6a 28 22 72 65 63 79 63 6c 61 62 6c 65 22  Obj("recyclable"
26680 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
26690 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
266a0 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c  nt(interp, pRet,
266b0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e   Tcl_NewIntObj(n
266c0 52 65 63 79 63 6c 61 62 6c 65 29 29 3b 0a 0a 20  Recyclable));.. 
266d0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
266e0 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b  t(interp, pRet);
266f0 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
26700 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  K;.}..#ifdef SQL
26710 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43  ITE_ENABLE_UNLOC
26720 4b 5f 4e 4f 54 49 46 59 0a 73 74 61 74 69 63 20  K_NOTIFY.static 
26730 76 6f 69 64 20 74 65 73 74 5f 75 6e 6c 6f 63 6b  void test_unlock
26740 5f 6e 6f 74 69 66 79 5f 63 62 28 76 6f 69 64 20  _notify_cb(void 
26750 2a 2a 61 41 72 67 2c 20 69 6e 74 20 6e 41 72 67  **aArg, int nArg
26760 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 66  ){.  int ii;.  f
26770 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 41 72 67  or(ii=0; ii<nArg
26780 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c  ; ii++){.    Tcl
26790 5f 45 76 61 6c 45 78 28 28 54 63 6c 5f 49 6e 74  _EvalEx((Tcl_Int
267a0 65 72 70 20 2a 29 61 41 72 67 5b 69 69 5d 2c 20  erp *)aArg[ii], 
267b0 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c  "unlock_notify",
267c0 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c   -1, TCL_EVAL_GL
267d0 4f 42 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  OBAL);.  }.}.#en
267e0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
267f0 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49  ABLE_UNLOCK_NOTI
26800 46 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  FY */../*.** tcl
26810 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 6e  cmd:  sqlite3_un
26820 6c 6f 63 6b 5f 6e 6f 74 69 66 79 20 64 62 0a 2a  lock_notify db.*
26830 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
26840 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f  ENABLE_UNLOCK_NO
26850 54 49 46 59 0a 73 74 61 74 69 63 20 69 6e 74 20  TIFY.static int 
26860 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69  test_unlock_noti
26870 66 79 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  fy(.  ClientData
26880 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
26890 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  Unused */.  Tcl_
268a0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
268b0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
268c0 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
268d0 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
268e0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
268f0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
26900 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
26910 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
26920 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
26930 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
26940 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
26950 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
26960 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
26970 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
26980 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
26990 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
269a0 44 42 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  DB");.    return
269b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
269c0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
269d0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
269e0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
269f0 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20  ]), &db) ){.    
26a00 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
26a10 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
26a20 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69  ite3_unlock_noti
26a30 66 79 28 64 62 2c 20 74 65 73 74 5f 75 6e 6c 6f  fy(db, test_unlo
26a40 63 6b 5f 6e 6f 74 69 66 79 5f 63 62 2c 20 28 76  ck_notify_cb, (v
26a50 6f 69 64 20 2a 29 69 6e 74 65 72 70 29 3b 0a 20  oid *)interp);. 
26a60 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
26a70 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
26a80 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
26a90 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72  TCL_STATIC);.  r
26aa0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
26ab0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 74 63  #endif../*.** tc
26ac0 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 77  lcmd:  sqlite3_w
26ad0 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62  al_checkpoint db
26ae0 20 3f 4e 41 4d 45 3f 0a 2a 2f 0a 73 74 61 74 69   ?NAME?.*/.stati
26af0 63 20 69 6e 74 20 74 65 73 74 5f 77 61 6c 5f 63  c int test_wal_c
26b00 68 65 63 6b 70 6f 69 6e 74 28 0a 20 20 43 6c 69  heckpoint(.  Cli
26b10 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
26b20 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f  ta, /* Unused */
26b30 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
26b40 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
26b50 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
26b60 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
26b70 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
26b80 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
26b90 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
26ba0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
26bb0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
26bc0 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
26bd0 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
26be0 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62  /.){.  char *zDb
26bf0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20   = 0;.  sqlite3 
26c00 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  *db;.  int rc;..
26c10 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26    if( objc!=3 &&
26c20 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
26c30 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
26c40 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
26c50 2c 20 22 44 42 20 3f 4e 41 4d 45 3f 22 29 3b 0a  , "DB ?NAME?");.
26c60 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
26c70 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
26c80 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
26c90 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
26ca0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
26cb0 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
26cc0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
26cd0 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b    if( objc==3 ){
26ce0 0a 20 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47  .    zDb = Tcl_G
26cf0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
26d00 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
26d10 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
26d20 6f 69 6e 74 28 64 62 2c 20 7a 44 62 29 3b 0a 20  oint(db, zDb);. 
26d30 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
26d40 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
26d50 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
26d60 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72  TCL_STATIC);.  r
26d70 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
26d80 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
26d90 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
26da0 6b 70 6f 69 6e 74 5f 76 32 20 64 62 20 4d 4f 44  kpoint_v2 db MOD
26db0 45 20 3f 4e 41 4d 45 3f 0a 2a 2a 0a 2a 2a 20 54  E ?NAME?.**.** T
26dc0 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63 61 6c 6c  his command call
26dd0 73 20 74 68 65 20 77 61 6c 5f 63 68 65 63 6b 70  s the wal_checkp
26de0 6f 69 6e 74 5f 76 32 28 29 20 66 75 6e 63 74 69  oint_v2() functi
26df0 6f 6e 20 77 69 74 68 20 74 68 65 20 73 70 65 63  on with the spec
26e00 69 66 69 65 64 0a 2a 2a 20 6d 6f 64 65 20 61 72  ified.** mode ar
26e10 67 75 6d 65 6e 74 20 28 70 61 73 73 69 76 65 2c  gument (passive,
26e20 20 66 75 6c 6c 20 6f 72 20 72 65 73 74 61 72 74   full or restart
26e30 29 2e 20 49 66 20 70 72 65 73 65 6e 74 2c 20 74  ). If present, t
26e40 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
26e50 0a 2a 2a 20 4e 41 4d 45 20 69 73 20 70 61 73 73  .** NAME is pass
26e60 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
26e70 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 77 61 6c   argument to wal
26e80 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 29  _checkpoint_v2()
26e90 2e 20 49 66 20 69 74 20 74 68 65 0a 2a 2a 20 4e  . If it the.** N
26ea0 41 4d 45 20 61 72 67 75 6d 65 6e 74 20 69 73 20  AME argument is 
26eb0 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 61 20 4e  not present, a N
26ec0 55 4c 4c 20 70 6f 69 6e 74 65 72 20 69 73 20 70  ULL pointer is p
26ed0 61 73 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a  assed instead..*
26ee0 2a 0a 2a 2a 20 49 66 20 77 61 6c 5f 63 68 65 63  *.** If wal_chec
26ef0 6b 70 6f 69 6e 74 5f 76 32 28 29 20 72 65 74 75  kpoint_v2() retu
26f00 72 6e 73 20 61 6e 79 20 76 61 6c 75 65 20 6f 74  rns any value ot
26f10 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
26f20 42 55 53 59 20 6f 72 0a 2a 2a 20 53 51 4c 49 54  BUSY or.** SQLIT
26f30 45 5f 4f 4b 2c 20 74 68 65 6e 20 74 68 69 73 20  E_OK, then this 
26f40 63 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 73 20  command returns 
26f50 54 43 4c 5f 45 52 52 4f 52 2e 20 54 68 65 20 54  TCL_ERROR. The T
26f60 63 6c 20 72 65 73 75 6c 74 20 69 73 20 73 65 74  cl result is set
26f70 0a 2a 2a 20 74 6f 20 74 68 65 20 65 72 72 6f 72  .** to the error
26f80 20 6d 65 73 73 61 67 65 20 6f 62 74 61 69 6e 65   message obtaine
26f90 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65  d from sqlite3_e
26fa0 72 72 6d 73 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 4f  rrmsg()..**.** O
26fb0 74 68 65 72 77 69 73 65 2c 20 74 68 69 73 20 63  therwise, this c
26fc0 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 73 20 61  ommand returns a
26fd0 20 6c 69 73 74 20 6f 66 20 74 68 72 65 65 20 69   list of three i
26fe0 6e 74 65 67 65 72 73 2e 20 54 68 65 20 66 69 72  ntegers. The fir
26ff0 73 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 73  st integer.** is
27000 20 31 20 69 66 20 53 51 4c 49 54 45 5f 42 55 53   1 if SQLITE_BUS
27010 59 20 77 61 73 20 72 65 74 75 72 6e 65 64 2c 20  Y was returned, 
27020 6f 72 20 30 20 6f 74 68 65 72 77 69 73 65 2e 20  or 0 otherwise. 
27030 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77  The following tw
27040 6f 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 72  o integers.** ar
27050 65 20 74 68 65 20 76 61 6c 75 65 73 20 72 65 74  e the values ret
27060 75 72 6e 65 64 20 76 69 61 20 74 68 65 20 6f 75  urned via the ou
27070 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73 20  tput parameters 
27080 62 79 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  by wal_checkpoin
27090 74 5f 76 32 28 29 20 2d 0a 2a 2a 20 74 68 65 20  t_v2() -.** the 
270a0 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73  number of frames
270b0 20 69 6e 20 74 68 65 20 6c 6f 67 20 61 6e 64 20   in the log and 
270c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  the number of fr
270d0 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 0a  ames in the log.
270e0 2a 2a 20 74 68 61 74 20 68 61 76 65 20 62 65 65  ** that have bee
270f0 6e 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 0a  n checkpointed..
27100 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
27110 73 74 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  st_wal_checkpoin
27120 74 5f 76 32 28 0a 20 20 43 6c 69 65 6e 74 44 61  t_v2(.  ClientDa
27130 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
27140 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63  * Unused */.  Tc
27150 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
27160 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
27170 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
27180 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
27190 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
271a0 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
271b0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
271c0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
271d0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
271e0 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
271f0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
27200 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b    char *zDb = 0;
27210 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
27220 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 6e 74    int rc;..  int
27230 20 65 4d 6f 64 65 3b 0a 20 20 69 6e 74 20 6e 4c   eMode;.  int nL
27240 6f 67 20 3d 20 2d 35 35 35 3b 0a 20 20 69 6e 74  og = -555;.  int
27250 20 6e 43 6b 70 74 20 3d 20 2d 35 35 35 3b 0a 20   nCkpt = -555;. 
27260 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a   Tcl_Obj *pRet;.
27270 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20  .  const char * 
27280 61 4d 6f 64 65 5b 5d 20 3d 20 7b 20 22 70 61 73  aMode[] = { "pas
27290 73 69 76 65 22 2c 20 22 66 75 6c 6c 22 2c 20 22  sive", "full", "
272a0 72 65 73 74 61 72 74 22 2c 20 30 20 7d 3b 0a 20  restart", 0 };. 
272b0 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
272c0 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49  CHECKPOINT_PASSI
272d0 56 45 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  VE==0 );.  asser
272e0 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  t( SQLITE_CHECKP
272f0 4f 49 4e 54 5f 46 55 4c 4c 3d 3d 31 20 29 3b 0a  OINT_FULL==1 );.
27300 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
27310 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54  _CHECKPOINT_REST
27320 41 52 54 3d 3d 32 20 29 3b 0a 0a 20 20 69 66 28  ART==2 );..  if(
27330 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63   objc!=3 && objc
27340 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=4 ){.    Tcl_W
27350 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
27360 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
27370 20 4d 4f 44 45 20 3f 4e 41 4d 45 3f 22 29 3b 0a   MODE ?NAME?");.
27380 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
27390 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
273a0 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20   objc==4 ){.    
273b0 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  zDb = Tcl_GetStr
273c0 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20  ing(objv[3]);.  
273d0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
273e0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
273f0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
27400 31 5d 29 2c 20 26 64 62 29 0a 20 20 20 7c 7c 20  1]), &db).   || 
27410 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
27420 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
27430 5b 32 5d 2c 20 61 4d 6f 64 65 2c 20 22 6d 6f 64  [2], aMode, "mod
27440 65 22 2c 20 30 2c 20 26 65 4d 6f 64 65 29 20 0a  e", 0, &eMode) .
27450 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
27460 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
27470 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77    rc = sqlite3_w
27480 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32  al_checkpoint_v2
27490 28 64 62 2c 20 7a 44 62 2c 20 65 4d 6f 64 65 2c  (db, zDb, eMode,
274a0 20 26 6e 4c 6f 67 2c 20 26 6e 43 6b 70 74 29 3b   &nLog, &nCkpt);
274b0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
274c0 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
274d0 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 54  TE_BUSY ){.    T
274e0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
274f0 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
27500 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c  ite3_errmsg(db),
27510 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
27520 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
27530 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 52 65  RROR;.  }..  pRe
27540 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29  t = Tcl_NewObj()
27550 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
27560 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
27570 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  erp, pRet, Tcl_N
27580 65 77 49 6e 74 4f 62 6a 28 72 63 3d 3d 53 51 4c  ewIntObj(rc==SQL
27590 49 54 45 5f 42 55 53 59 3f 31 3a 30 29 29 3b 0a  ITE_BUSY?1:0));.
275a0 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
275b0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
275c0 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
275d0 49 6e 74 4f 62 6a 28 6e 4c 6f 67 29 29 3b 0a 20  IntObj(nLog));. 
275e0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
275f0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
27600 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49  , pRet, Tcl_NewI
27610 6e 74 4f 62 6a 28 6e 43 6b 70 74 29 29 3b 0a 20  ntObj(nCkpt));. 
27620 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
27630 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b  t(interp, pRet);
27640 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
27650 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  K;.}../*.** tclc
27660 6d 64 3a 20 20 74 65 73 74 5f 73 71 6c 69 74 65  md:  test_sqlite
27670 33 5f 6c 6f 67 20 3f 53 43 52 49 50 54 3f 0a 2a  3_log ?SCRIPT?.*
27680 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
27690 4c 6f 67 43 61 6c 6c 62 61 63 6b 20 7b 0a 20 20  LogCallback {.  
276a0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 70 49 6e 74  Tcl_Interp *pInt
276b0 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  erp;.  Tcl_Obj *
276c0 70 4f 62 6a 3b 0a 7d 20 6c 6f 67 63 61 6c 6c 62  pObj;.} logcallb
276d0 61 63 6b 20 3d 20 7b 30 2c 20 30 7d 3b 0a 73 74  ack = {0, 0};.st
276e0 61 74 69 63 20 76 6f 69 64 20 78 4c 6f 67 63 61  atic void xLogca
276f0 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 75 6e 75  llback(void *unu
27700 73 65 64 2c 20 69 6e 74 20 65 72 72 2c 20 63 68  sed, int err, ch
27710 61 72 20 2a 7a 4d 73 67 29 7b 0a 20 20 54 63 6c  ar *zMsg){.  Tcl
27720 5f 4f 62 6a 20 2a 70 4e 65 77 20 3d 20 54 63 6c  _Obj *pNew = Tcl
27730 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 6c 6f  _DuplicateObj(lo
27740 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 29 3b  gcallback.pObj);
27750 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
27760 75 6e 74 28 70 4e 65 77 29 3b 0a 20 20 54 63 6c  unt(pNew);.  Tcl
27770 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
27780 65 6d 65 6e 74 28 0a 20 20 20 20 20 20 30 2c 20  ement(.      0, 
27790 70 4e 65 77 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pNew, Tcl_NewStr
277a0 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 45 72  ingObj(sqlite3Er
277b0 72 4e 61 6d 65 28 65 72 72 29 2c 20 2d 31 29 0a  rName(err), -1).
277c0 20 20 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f    );.  Tcl_ListO
277d0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
277e0 30 2c 20 70 4e 65 77 2c 20 54 63 6c 5f 4e 65 77  0, pNew, Tcl_New
277f0 53 74 72 69 6e 67 4f 62 6a 28 7a 4d 73 67 2c 20  StringObj(zMsg, 
27800 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c  -1));.  Tcl_Eval
27810 4f 62 6a 45 78 28 6c 6f 67 63 61 6c 6c 62 61 63  ObjEx(logcallbac
27820 6b 2e 70 49 6e 74 65 72 70 2c 20 70 4e 65 77 2c  k.pInterp, pNew,
27830 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c   TCL_EVAL_GLOBAL
27840 7c 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54  |TCL_EVAL_DIRECT
27850 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  );.  Tcl_DecrRef
27860 43 6f 75 6e 74 28 70 4e 65 77 29 3b 0a 7d 0a 73  Count(pNew);.}.s
27870 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
27880 71 6c 69 74 65 33 5f 6c 6f 67 28 0a 20 20 43 6c  qlite3_log(.  Cl
27890 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
278a0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
278b0 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
278c0 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
278d0 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
278e0 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
278f0 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
27900 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
27910 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
27920 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
27930 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
27940 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
27950 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6f  ts */.){.  if( o
27960 62 6a 63 3e 32 20 29 7b 0a 20 20 20 20 54 63 6c  bjc>2 ){.    Tcl
27970 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
27980 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
27990 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 72 65  SCRIPT");.    re
279a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
279b0 20 20 7d 0a 20 20 69 66 28 20 6c 6f 67 63 61 6c    }.  if( logcal
279c0 6c 62 61 63 6b 2e 70 4f 62 6a 20 29 7b 0a 20 20  lback.pObj ){.  
279d0 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
279e0 6e 74 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70  nt(logcallback.p
279f0 4f 62 6a 29 3b 0a 20 20 20 20 6c 6f 67 63 61 6c  Obj);.    logcal
27a00 6c 62 61 63 6b 2e 70 4f 62 6a 20 3d 20 30 3b 0a  lback.pObj = 0;.
27a10 20 20 20 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e      logcallback.
27a20 70 49 6e 74 65 72 70 20 3d 20 30 3b 0a 20 20 20  pInterp = 0;.   
27a30 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
27a40 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f  SQLITE_CONFIG_LO
27a50 47 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  G, 0, 0);.  }.  
27a60 69 66 28 20 6f 62 6a 63 3e 31 20 29 7b 0a 20 20  if( objc>1 ){.  
27a70 20 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f    logcallback.pO
27a80 62 6a 20 3d 20 6f 62 6a 76 5b 31 5d 3b 0a 20 20  bj = objv[1];.  
27a90 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
27aa0 6e 74 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70  nt(logcallback.p
27ab0 4f 62 6a 29 3b 0a 20 20 20 20 6c 6f 67 63 61 6c  Obj);.    logcal
27ac0 6c 62 61 63 6b 2e 70 49 6e 74 65 72 70 20 3d 20  lback.pInterp = 
27ad0 69 6e 74 65 72 70 3b 0a 20 20 20 20 73 71 6c 69  interp;.    sqli
27ae0 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54  te3_config(SQLIT
27af0 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 2c 20 78 4c  E_CONFIG_LOG, xL
27b00 6f 67 63 61 6c 6c 62 61 63 6b 2c 20 30 29 3b 0a  ogcallback, 0);.
27b10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
27b20 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20  _OK;.}../*.**   
27b30 20 20 74 63 6c 5f 6f 62 6a 70 72 6f 63 20 43 4f    tcl_objproc CO
27b40 4d 4d 41 4e 44 4e 41 4d 45 20 41 52 47 53 2e 2e  MMANDNAME ARGS..
27b50 2e 0a 2a 2a 0a 2a 2a 20 52 75 6e 20 61 20 54 43  ..**.** Run a TC
27b60 4c 20 63 6f 6d 6d 61 6e 64 20 75 73 69 6e 67 20  L command using 
27b70 69 74 73 20 6f 62 6a 50 72 6f 63 20 69 6e 74 65  its objProc inte
27b80 72 66 61 63 65 2e 20 20 54 68 72 6f 77 20 61 6e  rface.  Throw an
27b90 20 65 72 72 6f 72 20 69 66 0a 2a 2a 20 74 68 65   error if.** the
27ba0 20 63 6f 6d 6d 61 6e 64 20 68 61 73 20 6e 6f 20   command has no 
27bb0 6f 62 6a 50 72 6f 63 20 69 6e 74 65 72 66 61 63  objProc interfac
27bc0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
27bd0 20 72 75 6e 41 73 4f 62 6a 50 72 6f 63 28 0a 20   runAsObjProc(. 
27be0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
27bf0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
27c00 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
27c10 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
27c20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
27c30 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63  .  Tcl_CmdInfo c
27c40 6d 64 49 6e 66 6f 3b 0a 20 20 69 66 28 20 6f 62  mdInfo;.  if( ob
27c50 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  jc<2 ){.    Tcl_
27c60 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
27c70 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 43  erp, 1, objv, "C
27c80 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20  OMMAND ...");.  
27c90 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
27ca0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 54  OR;.  }.  if( !T
27cb0 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66  cl_GetCommandInf
27cc0 6f 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  o(interp, Tcl_Ge
27cd0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
27ce0 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20  , &cmdInfo) ){. 
27cf0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
27d00 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d  ult(interp, "com
27d10 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20  mand not found: 
27d20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 54 63  ",.           Tc
27d30 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
27d40 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29 30 29 3b  [1]), (char*)0);
27d50 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
27d60 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
27d70 20 63 6d 64 49 6e 66 6f 2e 6f 62 6a 50 72 6f 63   cmdInfo.objProc
27d80 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  ==0 ){.    Tcl_A
27d90 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
27da0 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20 68 61 73  rp, "command has
27db0 20 6e 6f 20 6f 62 6a 50 72 6f 63 3a 20 22 2c 0a   no objProc: ",.
27dc0 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47             Tcl_G
27dd0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
27de0 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
27df0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
27e00 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
27e10 20 63 6d 64 49 6e 66 6f 2e 6f 62 6a 50 72 6f 63   cmdInfo.objProc
27e20 28 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65  (cmdInfo.objClie
27e30 6e 74 44 61 74 61 2c 20 69 6e 74 65 72 70 2c 20  ntData, interp, 
27e40 6f 62 6a 63 2d 31 2c 20 6f 62 6a 76 2b 31 29 3b  objc-1, objv+1);
27e50 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
27e60 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
27e70 2f 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 54  /*.** WARNING: T
27e80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e  he following fun
27e90 63 74 69 6f 6e 2c 20 70 72 69 6e 74 45 78 70 6c  ction, printExpl
27ea0 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 29 20 69  ainQueryPlan() i
27eb0 73 20 61 6e 20 65 78 61 63 74 0a 2a 2a 20 63 6f  s an exact.** co
27ec0 70 79 20 6f 66 20 65 78 61 6d 70 6c 65 20 63 6f  py of example co
27ed0 64 65 20 66 72 6f 6d 20 65 71 70 2e 69 6e 20 28  de from eqp.in (
27ee0 65 71 70 2e 68 74 6d 6c 29 2e 20 49 66 20 74 68  eqp.html). If th
27ef0 69 73 20 63 6f 64 65 20 69 73 20 6d 6f 64 69 66  is code is modif
27f00 69 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ied,.** then the
27f10 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 63   documentation c
27f20 6f 70 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20  opy needs to be 
27f30 6d 6f 64 69 66 69 65 64 20 61 73 20 77 65 6c 6c  modified as well
27f40 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  ..*/./*.** Argum
27f50 65 6e 74 20 70 53 74 6d 74 20 69 73 20 61 20 70  ent pStmt is a p
27f60 72 65 70 61 72 65 64 20 53 51 4c 20 73 74 61 74  repared SQL stat
27f70 65 6d 65 6e 74 2e 20 54 68 69 73 20 66 75 6e 63  ement. This func
27f80 74 69 6f 6e 20 63 6f 6d 70 69 6c 65 73 0a 2a 2a  tion compiles.**
27f90 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52   an EXPLAIN QUER
27fa0 59 20 50 4c 41 4e 20 63 6f 6d 6d 61 6e 64 20 74  Y PLAN command t
27fb0 6f 20 72 65 70 6f 72 74 20 6f 6e 20 74 68 65 20  o report on the 
27fc0 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
27fd0 6e 74 2c 0a 2a 2a 20 61 6e 64 20 70 72 69 6e 74  nt,.** and print
27fe0 73 20 74 68 65 20 72 65 70 6f 72 74 20 74 6f 20  s the report to 
27ff0 73 74 64 6f 75 74 20 75 73 69 6e 67 20 70 72 69  stdout using pri
28000 6e 74 66 28 29 2e 0a 2a 2f 0a 69 6e 74 20 70 72  ntf()..*/.int pr
28010 69 6e 74 45 78 70 6c 61 69 6e 51 75 65 72 79 50  intExplainQueryP
28020 6c 61 6e 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  lan(sqlite3_stmt
28030 20 2a 70 53 74 6d 74 29 7b 0a 20 20 63 6f 6e 73   *pStmt){.  cons
28040 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20  t char *zSql;   
28050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
28060 6e 70 75 74 20 53 51 4c 20 2a 2f 0a 20 20 63 68  nput SQL */.  ch
28070 61 72 20 2a 7a 45 78 70 6c 61 69 6e 3b 20 20 20  ar *zExplain;   
28080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28090 20 53 51 4c 20 77 69 74 68 20 45 58 50 4c 41 49   SQL with EXPLAI
280a0 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 70 72 65  N QUERY PLAN pre
280b0 70 65 6e 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69  pended */.  sqli
280c0 74 65 33 5f 73 74 6d 74 20 2a 70 45 78 70 6c 61  te3_stmt *pExpla
280d0 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  in;         /* C
280e0 6f 6d 70 69 6c 65 64 20 45 58 50 4c 41 49 4e 20  ompiled EXPLAIN 
280f0 51 55 45 52 59 20 50 4c 41 4e 20 63 6f 6d 6d 61  QUERY PLAN comma
28100 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  nd */.  int rc; 
28110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28120 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
28130 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 71 6c 69  n code from sqli
28140 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29  te3_prepare_v2()
28150 20 2a 2f 0a 0a 20 20 7a 53 71 6c 20 3d 20 73 71   */..  zSql = sq
28160 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29  lite3_sql(pStmt)
28170 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20  ;.  if( zSql==0 
28180 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
28190 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 78 70 6c 61  ERROR;..  zExpla
281a0 69 6e 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  in = sqlite3_mpr
281b0 69 6e 74 66 28 22 45 58 50 4c 41 49 4e 20 51 55  intf("EXPLAIN QU
281c0 45 52 59 20 50 4c 41 4e 20 25 73 22 2c 20 7a 53  ERY PLAN %s", zS
281d0 71 6c 29 3b 0a 20 20 69 66 28 20 7a 45 78 70 6c  ql);.  if( zExpl
281e0 61 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ain==0 ) return 
281f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20  SQLITE_NOMEM;.. 
28200 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
28210 65 70 61 72 65 5f 76 32 28 73 71 6c 69 74 65 33  epare_v2(sqlite3
28220 5f 64 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74  _db_handle(pStmt
28230 29 2c 20 7a 45 78 70 6c 61 69 6e 2c 20 2d 31 2c  ), zExplain, -1,
28240 20 26 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a   &pExplain, 0);.
28250 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
28260 45 78 70 6c 61 69 6e 29 3b 0a 20 20 69 66 28 20  Explain);.  if( 
28270 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
28280 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 77 68  return rc;..  wh
28290 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d  ile( SQLITE_ROW=
282a0 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 45  =sqlite3_step(pE
282b0 78 70 6c 61 69 6e 29 20 29 7b 0a 20 20 20 20 69  xplain) ){.    i
282c0 6e 74 20 69 53 65 6c 65 63 74 69 64 20 3d 20 73  nt iSelectid = s
282d0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
282e0 74 28 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a  t(pExplain, 0);.
282f0 20 20 20 20 69 6e 74 20 69 4f 72 64 65 72 20 3d      int iOrder =
28300 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
28310 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 31 29  int(pExplain, 1)
28320 3b 0a 20 20 20 20 69 6e 74 20 69 46 72 6f 6d 20  ;.    int iFrom 
28330 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
28340 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 32  _int(pExplain, 2
28350 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  );.    const cha
28360 72 20 2a 7a 44 65 74 61 69 6c 20 3d 20 28 63 6f  r *zDetail = (co
28370 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74  nst char *)sqlit
28380 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
28390 45 78 70 6c 61 69 6e 2c 20 33 29 3b 0a 0a 20 20  Explain, 3);..  
283a0 20 20 70 72 69 6e 74 66 28 22 25 64 20 25 64 20    printf("%d %d 
283b0 25 64 20 25 73 5c 6e 22 2c 20 69 53 65 6c 65 63  %d %s\n", iSelec
283c0 74 69 64 2c 20 69 4f 72 64 65 72 2c 20 69 46 72  tid, iOrder, iFr
283d0 6f 6d 2c 20 7a 44 65 74 61 69 6c 29 3b 0a 20 20  om, zDetail);.  
283e0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  }..  return sqli
283f0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78  te3_finalize(pEx
28400 70 6c 61 69 6e 29 3b 0a 7d 0a 0a 73 74 61 74 69  plain);.}..stati
28410 63 20 69 6e 74 20 74 65 73 74 5f 70 72 69 6e 74  c int test_print
28420 5f 65 71 70 28 0a 20 20 76 6f 69 64 20 2a 20 63  _eqp(.  void * c
28430 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
28440 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
28450 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
28460 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
28470 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 72 63  jv[].){.  int rc
28480 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
28490 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20   *pStmt;..  if( 
284a0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
284b0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
284c0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
284d0 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65   "STMT");.    re
284e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
284f0 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d    }.  if( getStm
28500 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
28510 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
28520 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
28530 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
28540 52 4f 52 3b 0a 20 20 72 63 20 3d 20 70 72 69 6e  ROR;.  rc = prin
28550 74 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61  tExplainQueryPla
28560 6e 28 70 53 74 6d 74 29 3b 0a 20 20 2f 2a 20 54  n(pStmt);.  /* T
28570 68 69 73 20 69 73 20 6e 65 65 64 65 64 20 6f 6e  his is needed on
28580 20 57 69 6e 64 6f 77 73 20 73 6f 20 74 68 61 74   Windows so that
28590 20 61 20 74 65 73 74 20 63 61 73 65 20 75 73 69   a test case usi
285a0 6e 67 20 74 68 69 73 20 0a 20 20 2a 2a 20 66 75  ng this .  ** fu
285b0 6e 63 74 69 6f 6e 20 63 61 6e 20 6f 70 65 6e 20  nction can open 
285c0 61 20 72 65 61 64 20 70 69 70 65 20 61 6e 64 20  a read pipe and 
285d0 67 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 6f  get the output o
285e0 66 0a 20 20 2a 2a 20 70 72 69 6e 74 45 78 70 6c  f.  ** printExpl
285f0 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 29 20 69  ainQueryPlan() i
28600 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f  mmediately..  */
28610 0a 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74  .  fflush(stdout
28620 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  );.  Tcl_SetResu
28630 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
28640 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
28650 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  c), 0);.  return
28660 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69   TCL_OK;.}.#endi
28670 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
28680 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a 0a  _EXPLAIN */../*.
28690 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  ** sqlite3_test_
286a0 63 6f 6e 74 72 6f 6c 20 56 45 52 42 20 41 52 47  control VERB ARG
286b0 53 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  S....*/.static i
286c0 6e 74 20 74 65 73 74 5f 74 65 73 74 5f 63 6f 6e  nt test_test_con
286d0 74 72 6f 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63  trol(.  void * c
286e0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
286f0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
28700 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
28710 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
28720 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74 72 75 63 74  jv[].){.  struct
28730 20 56 65 72 62 20 7b 0a 20 20 20 20 63 6f 6e 73   Verb {.    cons
28740 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  t char *zName;. 
28750 20 20 20 69 6e 74 20 69 3b 0a 20 20 7d 20 61 56     int i;.  } aV
28760 65 72 62 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  erb[] = {.    { 
28770 22 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  "SQLITE_TESTCTRL
28780 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54  _LOCALTIME_FAULT
28790 22 2c 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ", SQLITE_TESTCT
287a0 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55  RL_LOCALTIME_FAU
287b0 4c 54 20 7d 2c 20 0a 20 20 20 20 7b 20 22 53 51  LT }, .    { "SQ
287c0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f  LITE_TESTCTRL_SO
287d0 52 54 45 52 5f 4d 4d 41 50 22 2c 20 53 51 4c 49  RTER_MMAP", SQLI
287e0 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54  TE_TESTCTRL_SORT
287f0 45 52 5f 4d 4d 41 50 20 7d 2c 20 0a 20 20 7d 3b  ER_MMAP }, .  };
28800 0a 20 20 69 6e 74 20 69 56 65 72 62 3b 0a 20 20  .  int iVerb;.  
28810 69 6e 74 20 69 46 6c 61 67 3b 0a 20 20 69 6e 74  int iFlag;.  int
28820 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
28830 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  <2 ){.    Tcl_Wr
28840 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
28850 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 56 45 52  p, 1, objv, "VER
28860 42 20 41 52 47 53 2e 2e 2e 22 29 3b 0a 20 20 20  B ARGS...");.   
28870 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
28880 52 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 54  R;.  }..  rc = T
28890 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
288a0 62 6a 53 74 72 75 63 74 28 0a 20 20 20 20 20 20  bjStruct(.      
288b0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
288c0 20 61 56 65 72 62 2c 20 73 69 7a 65 6f 66 28 61   aVerb, sizeof(a
288d0 56 65 72 62 5b 30 5d 29 2c 20 22 56 45 52 42 22  Verb[0]), "VERB"
288e0 2c 20 30 2c 20 26 69 56 65 72 62 0a 20 20 29 3b  , 0, &iVerb.  );
288f0 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f  .  if( rc!=TCL_O
28900 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
28910 20 20 69 46 6c 61 67 20 3d 20 61 56 65 72 62 5b    iFlag = aVerb[
28920 69 56 65 72 62 5d 2e 69 3b 0a 20 20 73 77 69 74  iVerb].i;.  swit
28930 63 68 28 20 69 46 6c 61 67 20 29 7b 0a 20 20 20  ch( iFlag ){.   
28940 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
28950 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f  TCTRL_LOCALTIME_
28960 46 41 55 4c 54 3a 20 7b 0a 20 20 20 20 20 20 69  FAULT: {.      i
28970 6e 74 20 76 61 6c 3b 0a 20 20 20 20 20 20 69 66  nt val;.      if
28980 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
28990 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
289a0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
289b0 20 6f 62 6a 76 2c 20 22 4f 4e 4f 46 46 22 29 3b   objv, "ONOFF");
289c0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
289d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
289e0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c   }.      if( Tcl
289f0 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
28a00 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
28a10 32 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75  2], &val) ) retu
28a20 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
28a30 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74      sqlite3_test
28a40 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
28a50 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49  TESTCTRL_LOCALTI
28a60 4d 45 5f 46 41 55 4c 54 2c 20 76 61 6c 29 3b 0a  ME_FAULT, val);.
28a70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
28a80 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c   }..    case SQL
28a90 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52  ITE_TESTCTRL_SOR
28aa0 54 45 52 5f 4d 4d 41 50 3a 20 7b 0a 20 20 20 20  TER_MMAP: {.    
28ab0 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20 20 20 20    int val;.     
28ac0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
28ad0 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20      if( objc!=4 
28ae0 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57  ){.        Tcl_W
28af0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
28b00 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 2, objv, "DB
28b10 20 4c 49 4d 49 54 22 29 3b 0a 20 20 20 20 20 20   LIMIT");.      
28b20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
28b30 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
28b40 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
28b50 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
28b60 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
28b70 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
28b80 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
28b90 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
28ba0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
28bb0 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29  objv[3], &val) )
28bc0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
28bd0 52 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  R;.      sqlite3
28be0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
28bf0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f  LITE_TESTCTRL_SO
28c00 52 54 45 52 5f 4d 4d 41 50 2c 20 64 62 2c 20 76  RTER_MMAP, db, v
28c10 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  al);.      break
28c20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 54  ;.    }.  }..  T
28c30 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
28c40 6e 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e  nterp);.  return
28c50 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20   TCL_OK;.}..#if 
28c60 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 0a 23  SQLITE_OS_UNIX.#
28c70 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d  include <sys/tim
28c80 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  e.h>.#include <s
28c90 79 73 2f 72 65 73 6f 75 72 63 65 2e 68 3e 0a 0a  ys/resource.h>..
28ca0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
28cb0 67 65 74 72 75 73 61 67 65 28 0a 20 20 76 6f 69  getrusage(.  voi
28cc0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
28cd0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
28ce0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
28cf0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
28d00 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63  ST objv[].){.  c
28d10 68 61 72 20 62 75 66 5b 31 30 32 34 5d 3b 0a 20  har buf[1024];. 
28d20 20 73 74 72 75 63 74 20 72 75 73 61 67 65 20 72   struct rusage r
28d30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 72 2c 20 30  ;.  memset(&r, 0
28d40 2c 20 73 69 7a 65 6f 66 28 72 29 29 3b 0a 20 20  , sizeof(r));.  
28d50 67 65 74 72 75 73 61 67 65 28 52 55 53 41 47 45  getrusage(RUSAGE
28d60 5f 53 45 4c 46 2c 20 26 72 29 3b 0a 0a 20 20 73  _SELF, &r);..  s
28d70 70 72 69 6e 74 66 28 62 75 66 2c 20 22 72 75 5f  printf(buf, "ru_
28d80 75 74 69 6d 65 3d 25 64 2e 25 30 36 64 20 72 75  utime=%d.%06d ru
28d90 5f 73 74 69 6d 65 3d 25 64 2e 25 30 36 64 20 72  _stime=%d.%06d r
28da0 75 5f 6d 69 6e 66 6c 74 3d 25 64 20 72 75 5f 6d  u_minflt=%d ru_m
28db0 61 6a 66 6c 74 3d 25 64 22 2c 20 0a 20 20 20 20  ajflt=%d", .    
28dc0 28 69 6e 74 29 72 2e 72 75 5f 75 74 69 6d 65 2e  (int)r.ru_utime.
28dd0 74 76 5f 73 65 63 2c 20 28 69 6e 74 29 72 2e 72  tv_sec, (int)r.r
28de0 75 5f 75 74 69 6d 65 2e 74 76 5f 75 73 65 63 2c  u_utime.tv_usec,
28df0 20 0a 20 20 20 20 28 69 6e 74 29 72 2e 72 75 5f   .    (int)r.ru_
28e00 73 74 69 6d 65 2e 74 76 5f 73 65 63 2c 20 28 69  stime.tv_sec, (i
28e10 6e 74 29 72 2e 72 75 5f 73 74 69 6d 65 2e 74 76  nt)r.ru_stime.tv
28e20 5f 75 73 65 63 2c 20 0a 20 20 20 20 28 69 6e 74  _usec, .    (int
28e30 29 72 2e 72 75 5f 6d 69 6e 66 6c 74 2c 20 28 69  )r.ru_minflt, (i
28e40 6e 74 29 72 2e 72 75 5f 6d 61 6a 66 6c 74 0a 20  nt)r.ru_majflt. 
28e50 20 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a   );.  Tcl_SetObj
28e60 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
28e70 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
28e80 62 75 66 2c 20 2d 31 29 29 3b 0a 20 20 72 65 74  buf, -1));.  ret
28e90 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
28ea0 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
28eb0 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20 49 6e  _OS_WIN./*.** In
28ec0 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73 65 64  formation passed
28ed0 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 74   from the main t
28ee0 68 72 65 61 64 20 69 6e 74 6f 20 74 68 65 20 77  hread into the w
28ef0 69 6e 64 6f 77 73 20 66 69 6c 65 20 6c 6f 63 6b  indows file lock
28f00 65 72 0a 2a 2a 20 62 61 63 6b 67 72 6f 75 6e 64  er.** background
28f10 20 74 68 72 65 61 64 2e 0a 2a 2f 0a 73 74 72 75   thread..*/.stru
28f20 63 74 20 77 69 6e 33 32 46 69 6c 65 4c 6f 63 6b  ct win32FileLock
28f30 65 72 20 7b 0a 20 20 63 68 61 72 20 2a 65 76 4e  er {.  char *evN
28f40 61 6d 65 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  ame;       /* Na
28f50 6d 65 20 6f 66 20 65 76 65 6e 74 20 74 6f 20 73  me of event to s
28f60 69 67 6e 61 6c 20 74 68 72 65 61 64 20 73 74 61  ignal thread sta
28f70 72 74 75 70 20 2a 2f 0a 20 20 48 41 4e 44 4c 45  rtup */.  HANDLE
28f80 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   h;           /*
28f90 20 48 61 6e 64 6c 65 20 6f 66 20 74 68 65 20 66   Handle of the f
28fa0 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ile to be locked
28fb0 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 61 79 31   */.  int delay1
28fc0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c  ;         /* Del
28fd0 61 79 20 62 65 66 6f 72 65 20 6c 6f 63 6b 69 6e  ay before lockin
28fe0 67 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 61 79  g */.  int delay
28ff0 32 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65  2;         /* De
29000 6c 61 79 20 62 65 66 6f 72 65 20 75 6e 6c 6f 63  lay before unloc
29010 6b 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6f 6b  king */.  int ok
29020 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
29030 20 46 69 6e 69 73 68 65 64 20 6f 6b 20 2a 2f 0a   Finished ok */.
29040 20 20 69 6e 74 20 65 72 72 3b 20 20 20 20 20 20    int err;      
29050 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
29060 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
29070 20 2a 2f 0a 7d 3b 0a 23 65 6e 64 69 66 0a 0a 0a   */.};.#endif...
29080 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
29090 4e 0a 23 69 6e 63 6c 75 64 65 20 3c 70 72 6f 63  N.#include <proc
290a0 65 73 73 2e 68 3e 0a 2f 2a 0a 2a 2a 20 54 68 65  ess.h>./*.** The
290b0 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72 65   background thre
290c0 61 64 20 74 68 61 74 20 64 6f 65 73 20 66 69 6c  ad that does fil
290d0 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74  e locking..*/.st
290e0 61 74 69 63 20 76 6f 69 64 20 77 69 6e 33 32 5f  atic void win32_
290f0 66 69 6c 65 5f 6c 6f 63 6b 65 72 28 76 6f 69 64  file_locker(void
29100 20 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20 73   *pAppData){.  s
29110 74 72 75 63 74 20 77 69 6e 33 32 46 69 6c 65 4c  truct win32FileL
29120 6f 63 6b 65 72 20 2a 70 20 3d 20 28 73 74 72 75  ocker *p = (stru
29130 63 74 20 77 69 6e 33 32 46 69 6c 65 4c 6f 63 6b  ct win32FileLock
29140 65 72 2a 29 70 41 70 70 44 61 74 61 3b 0a 20 20  er*)pAppData;.  
29150 69 66 28 20 70 2d 3e 65 76 4e 61 6d 65 20 29 7b  if( p->evName ){
29160 0a 20 20 20 20 48 41 4e 44 4c 45 20 65 76 20 3d  .    HANDLE ev =
29170 20 4f 70 65 6e 45 76 65 6e 74 28 45 56 45 4e 54   OpenEvent(EVENT
29180 5f 4d 4f 44 49 46 59 5f 53 54 41 54 45 2c 20 46  _MODIFY_STATE, F
29190 41 4c 53 45 2c 20 70 2d 3e 65 76 4e 61 6d 65 29  ALSE, p->evName)
291a0 3b 0a 20 20 20 20 69 66 20 28 20 65 76 20 29 7b  ;.    if ( ev ){
291b0 0a 20 20 20 20 20 20 53 65 74 45 76 65 6e 74 28  .      SetEvent(
291c0 65 76 29 3b 0a 20 20 20 20 20 20 43 6c 6f 73 65  ev);.      Close
291d0 48 61 6e 64 6c 65 28 65 76 29 3b 0a 20 20 20 20  Handle(ev);.    
291e0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 64  }.  }.  if( p->d
291f0 65 6c 61 79 31 20 29 20 53 6c 65 65 70 28 70 2d  elay1 ) Sleep(p-
29200 3e 64 65 6c 61 79 31 29 3b 0a 20 20 69 66 28 20  >delay1);.  if( 
29210 4c 6f 63 6b 46 69 6c 65 28 70 2d 3e 68 2c 20 30  LockFile(p->h, 0
29220 2c 20 30 2c 20 31 30 30 30 30 30 30 30 30 2c 20  , 0, 100000000, 
29230 30 29 20 29 7b 0a 20 20 20 20 53 6c 65 65 70 28  0) ){.    Sleep(
29240 70 2d 3e 64 65 6c 61 79 32 29 3b 0a 20 20 20 20  p->delay2);.    
29250 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 2d 3e 68 2c  UnlockFile(p->h,
29260 20 30 2c 20 30 2c 20 31 30 30 30 30 30 30 30 30   0, 0, 100000000
29270 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 6f 6b 20  , 0);.    p->ok 
29280 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
29290 20 20 70 2d 3e 65 72 72 20 3d 20 31 3b 0a 20 20    p->err = 1;.  
292a0 7d 0a 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28  }.  CloseHandle(
292b0 70 2d 3e 68 29 3b 0a 20 20 70 2d 3e 68 20 3d 20  p->h);.  p->h = 
292c0 30 3b 0a 20 20 70 2d 3e 64 65 6c 61 79 31 20 3d  0;.  p->delay1 =
292d0 20 30 3b 0a 20 20 70 2d 3e 64 65 6c 61 79 32 20   0;.  p->delay2 
292e0 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  = 0;.}.#endif..#
292f0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
29300 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 6c 6f 63 6b  ./*.**      lock
29310 5f 77 69 6e 33 32 5f 66 69 6c 65 20 46 49 4c 45  _win32_file FILE
29320 4e 41 4d 45 20 44 45 4c 41 59 31 20 44 45 4c 41  NAME DELAY1 DELA
29330 59 32 0a 2a 2a 0a 2a 2a 20 47 65 74 20 61 6e 20  Y2.**.** Get an 
29340 65 78 63 6c 75 73 69 76 65 20 6d 61 6e 64 69 74  exclusive mandit
29350 6f 72 79 20 6c 6f 63 6b 20 6f 6e 20 66 69 6c 65  ory lock on file
29360 20 66 6f 72 20 44 45 4c 41 59 32 20 6d 69 6c 6c   for DELAY2 mill
29370 69 73 65 63 6f 6e 64 73 2e 0a 2a 2a 20 57 61 69  iseconds..** Wai
29380 74 20 44 45 4c 41 59 31 20 6d 69 6c 6c 69 73 65  t DELAY1 millise
29390 63 6f 6e 64 73 20 62 65 66 6f 72 65 20 61 63 71  conds before acq
293a0 75 69 72 69 6e 67 20 74 68 65 20 6c 6f 63 6b 2e  uiring the lock.
293b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
293c0 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b 28 0a  in32_file_lock(.
293d0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
293e0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
293f0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
29400 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
29410 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
29420 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63  {.  static struc
29430 74 20 77 69 6e 33 32 46 69 6c 65 4c 6f 63 6b 65  t win32FileLocke
29440 72 20 78 20 3d 20 7b 20 22 77 69 6e 33 32 5f 66  r x = { "win32_f
29450 69 6c 65 5f 6c 6f 63 6b 22 2c 20 30 2c 20 30 2c  ile_lock", 0, 0,
29460 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 63 6f   0, 0, 0 };.  co
29470 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
29480 61 6d 65 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  ame;.  char zBuf
29490 5b 32 30 30 5d 3b 0a 20 20 69 6e 74 20 72 65 74  [200];.  int ret
294a0 72 79 20 3d 20 30 3b 0a 20 20 48 41 4e 44 4c 45  ry = 0;.  HANDLE
294b0 20 65 76 3b 0a 20 20 44 57 4f 52 44 20 77 52 65   ev;.  DWORD wRe
294c0 73 75 6c 74 3b 0a 20 20 0a 20 20 69 66 28 20 6f  sult;.  .  if( o
294d0 62 6a 63 21 3d 34 20 26 26 20 6f 62 6a 63 21 3d  bjc!=4 && objc!=
294e0 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  1 ){.    Tcl_Wro
294f0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
29500 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 46 49 4c 45  , 1, objv, "FILE
29510 4e 41 4d 45 20 44 45 4c 41 59 31 20 44 45 4c 41  NAME DELAY1 DELA
29520 59 32 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Y2");.    return
29530 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
29540 20 20 69 66 28 20 6f 62 6a 63 3d 3d 31 20 29 7b    if( objc==1 ){
29550 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
29560 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
29570 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 20 25 64  f), zBuf, "%d %d
29580 20 25 64 20 25 64 20 25 64 22 2c 0a 20 20 20 20   %d %d %d",.    
29590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
295a0 20 78 2e 6f 6b 2c 20 78 2e 65 72 72 2c 20 78 2e   x.ok, x.err, x.
295b0 64 65 6c 61 79 31 2c 20 78 2e 64 65 6c 61 79 32  delay1, x.delay2
295c0 2c 20 78 2e 68 29 3b 0a 20 20 20 20 54 63 6c 5f  , x.h);.    Tcl_
295d0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
295e0 65 72 70 2c 20 7a 42 75 66 2c 20 28 63 68 61 72  erp, zBuf, (char
295f0 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  *)0);.    return
29600 20 54 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 77   TCL_OK;.  }.  w
29610 68 69 6c 65 28 20 78 2e 68 20 26 26 20 72 65 74  hile( x.h && ret
29620 72 79 3c 33 30 20 29 7b 0a 20 20 20 20 72 65 74  ry<30 ){.    ret
29630 72 79 2b 2b 3b 0a 20 20 20 20 53 6c 65 65 70 28  ry++;.    Sleep(
29640 31 30 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  100);.  }.  if( 
29650 78 2e 68 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  x.h ){.    Tcl_A
29660 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
29670 72 70 2c 20 22 62 75 73 79 22 2c 20 28 63 68 61  rp, "busy", (cha
29680 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
29690 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
296a0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
296b0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
296c0 20 6f 62 6a 76 5b 32 5d 2c 20 26 78 2e 64 65 6c   objv[2], &x.del
296d0 61 79 31 29 20 29 20 72 65 74 75 72 6e 20 54 43  ay1) ) return TC
296e0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
296f0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
29700 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
29710 2c 20 26 78 2e 64 65 6c 61 79 32 29 20 29 20 72  , &x.delay2) ) r
29720 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
29730 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 54  .  zFilename = T
29740 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
29750 76 5b 31 5d 29 3b 0a 20 20 78 2e 68 20 3d 20 43  v[1]);.  x.h = C
29760 72 65 61 74 65 46 69 6c 65 28 7a 46 69 6c 65 6e  reateFile(zFilen
29770 61 6d 65 2c 20 47 45 4e 45 52 49 43 5f 52 45 41  ame, GENERIC_REA
29780 44 7c 47 45 4e 45 52 49 43 5f 57 52 49 54 45 2c  D|GENERIC_WRITE,
29790 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46  .              F
297a0 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 7c 46  ILE_SHARE_READ|F
297b0 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 54 45 2c  ILE_SHARE_WRITE,
297c0 20 30 2c 20 4f 50 45 4e 5f 41 4c 57 41 59 53 2c   0, OPEN_ALWAYS,
297d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46  .              F
297e0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f  ILE_ATTRIBUTE_NO
297f0 52 4d 41 4c 2c 20 30 29 3b 0a 20 20 69 66 28 20  RMAL, 0);.  if( 
29800 21 78 2e 68 20 29 7b 0a 20 20 20 20 54 63 6c 5f  !x.h ){.    Tcl_
29810 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
29820 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65  erp, "cannot ope
29830 6e 20 66 69 6c 65 3a 20 22 2c 20 7a 46 69 6c 65  n file: ", zFile
29840 6e 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b  name, (char*)0);
29850 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
29860 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 65 76 20  ERROR;.  }.  ev 
29870 3d 20 43 72 65 61 74 65 45 76 65 6e 74 28 4e 55  = CreateEvent(NU
29880 4c 4c 2c 20 54 52 55 45 2c 20 46 41 4c 53 45 2c  LL, TRUE, FALSE,
29890 20 78 2e 65 76 4e 61 6d 65 29 3b 0a 20 20 69 66   x.evName);.  if
298a0 20 28 20 21 65 76 20 29 7b 0a 20 20 20 20 54 63   ( !ev ){.    Tc
298b0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
298c0 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 63  nterp, "cannot c
298d0 72 65 61 74 65 20 65 76 65 6e 74 3a 20 22 2c 20  reate event: ", 
298e0 78 2e 65 76 4e 61 6d 65 2c 20 28 63 68 61 72 2a  x.evName, (char*
298f0 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )0);.    return 
29900 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
29910 20 5f 62 65 67 69 6e 74 68 72 65 61 64 28 77 69   _beginthread(wi
29920 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b 65 72 2c  n32_file_locker,
29930 20 30 2c 20 28 76 6f 69 64 2a 29 26 78 29 3b 0a   0, (void*)&x);.
29940 20 20 53 6c 65 65 70 28 30 29 3b 0a 20 20 69 66    Sleep(0);.  if
29950 20 28 20 28 77 52 65 73 75 6c 74 20 3d 20 57 61   ( (wResult = Wa
29960 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
29970 74 28 65 76 2c 20 31 30 30 30 30 29 29 21 3d 57  t(ev, 10000))!=W
29980 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 29 7b 0a  AIT_OBJECT_0 ){.
29990 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
299a0 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
299b0 29 2c 20 7a 42 75 66 2c 20 22 30 78 25 78 22 2c  ), zBuf, "0x%x",
299c0 20 77 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 54   wResult);.    T
299d0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
299e0 69 6e 74 65 72 70 2c 20 22 77 61 69 74 20 66 61  interp, "wait fa
299f0 69 6c 65 64 3a 20 22 2c 20 7a 42 75 66 2c 20 28  iled: ", zBuf, (
29a00 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 43 6c  char*)0);.    Cl
29a10 6f 73 65 48 61 6e 64 6c 65 28 65 76 29 3b 0a 20  oseHandle(ev);. 
29a20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
29a30 52 4f 52 3b 0a 20 20 7d 0a 20 20 43 6c 6f 73 65  ROR;.  }.  Close
29a40 48 61 6e 64 6c 65 28 65 76 29 3b 0a 20 20 72 65  Handle(ev);.  re
29a50 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
29a60 2f 2a 0a 2a 2a 20 20 20 20 20 20 65 78 69 73 74  /*.**      exist
29a70 73 5f 77 69 6e 33 32 5f 70 61 74 68 20 50 41 54  s_win32_path PAT
29a80 48 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  H.**.** Returns 
29a90 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
29aa0 73 70 65 63 69 66 69 65 64 20 70 61 74 68 20 65  specified path e
29ab0 78 69 73 74 73 2c 20 77 68 6f 73 65 20 66 75 6c  xists, whose ful
29ac0 6c 79 20 71 75 61 6c 69 66 69 65 64 20 6e 61 6d  ly qualified nam
29ad0 65 0a 2a 2a 20 6d 61 79 20 65 78 63 65 65 64 20  e.** may exceed 
29ae0 32 36 30 20 63 68 61 72 61 63 74 65 72 73 20 69  260 characters i
29af0 66 20 69 74 20 69 73 20 70 72 65 66 69 78 65 64  f it is prefixed
29b00 20 77 69 74 68 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f   with "\\?\"..*/
29b10 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33  .static int win3
29b20 32 5f 65 78 69 73 74 73 5f 70 61 74 68 28 0a 20  2_exists_path(. 
29b30 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74   void *clientDat
29b40 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
29b50 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
29b60 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
29b70 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
29b80 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
29b90 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
29ba0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
29bb0 20 6f 62 6a 76 2c 20 22 50 41 54 48 22 29 3b 0a   objv, "PATH");.
29bc0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
29bd0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  RROR;.  }.  Tcl_
29be0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
29bf0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c  erp, Tcl_NewBool
29c00 65 61 6e 4f 62 6a 28 0a 20 20 20 20 20 20 47 65  eanObj(.      Ge
29c10 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57  tFileAttributesW
29c20 28 20 54 63 6c 5f 47 65 74 55 6e 69 63 6f 64 65  ( Tcl_GetUnicode
29c30 28 6f 62 6a 76 5b 31 5d 29 29 21 3d 49 4e 56 41  (objv[1]))!=INVA
29c40 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
29c50 54 45 53 20 29 29 3b 0a 20 20 72 65 74 75 72 6e  TES ));.  return
29c60 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
29c70 2a 20 20 20 20 20 20 66 69 6e 64 5f 77 69 6e 33  *      find_win3
29c80 32 5f 66 69 6c 65 20 50 41 54 54 45 52 4e 0a 2a  2_file PATTERN.*
29c90 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 61 20 6c  *.** Returns a l
29ca0 69 73 74 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ist of entries i
29cb0 6e 20 61 20 64 69 72 65 63 74 6f 72 79 20 74 68  n a directory th
29cc0 61 74 20 6d 61 74 63 68 20 74 68 65 20 73 70 65  at match the spe
29cd0 63 69 66 69 65 64 20 70 61 74 74 65 72 6e 2c 0a  cified pattern,.
29ce0 2a 2a 20 77 68 6f 73 65 20 66 75 6c 6c 79 20 71  ** whose fully q
29cf0 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6d 61  ualified name ma
29d00 79 20 65 78 63 65 65 64 20 32 34 38 20 63 68 61  y exceed 248 cha
29d10 72 61 63 74 65 72 73 20 69 66 20 69 74 20 69 73  racters if it is
29d20 20 70 72 65 66 69 78 65 64 20 77 69 74 68 0a 2a   prefixed with.*
29d30 2a 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61  * "\\?\"..*/.sta
29d40 74 69 63 20 69 6e 74 20 77 69 6e 33 32 5f 66 69  tic int win32_fi
29d50 6e 64 5f 66 69 6c 65 28 0a 20 20 76 6f 69 64 20  nd_file(.  void 
29d60 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54  *clientData,.  T
29d70 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
29d80 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
29d90 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
29da0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 48 41 4e 44  objv[].){.  HAND
29db0 4c 45 20 68 46 69 6e 64 46 69 6c 65 20 3d 20 49  LE hFindFile = I
29dc0 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
29dd0 4c 55 45 3b 0a 20 20 57 49 4e 33 32 5f 46 49 4e  LUE;.  WIN32_FIN
29de0 44 5f 44 41 54 41 57 20 66 69 6e 64 44 61 74 61  D_DATAW findData
29df0 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73  ;.  Tcl_Obj *lis
29e00 74 4f 62 6a 3b 0a 20 20 44 57 4f 52 44 20 6c 61  tObj;.  DWORD la
29e10 73 74 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f  stErrno;.  if( o
29e20 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
29e30 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
29e40 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
29e50 22 50 41 54 54 45 52 4e 22 29 3b 0a 20 20 20 20  "PATTERN");.    
29e60 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
29e70 3b 0a 20 20 7d 0a 20 20 68 46 69 6e 64 46 69 6c  ;.  }.  hFindFil
29e80 65 20 3d 20 46 69 6e 64 46 69 72 73 74 46 69 6c  e = FindFirstFil
29e90 65 57 28 54 63 6c 5f 47 65 74 55 6e 69 63 6f 64  eW(Tcl_GetUnicod
29ea0 65 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 66 69 6e  e(objv[1]), &fin
29eb0 64 44 61 74 61 29 3b 0a 20 20 69 66 28 20 68 46  dData);.  if( hF
29ec0 69 6e 64 46 69 6c 65 3d 3d 49 4e 56 41 4c 49 44  indFile==INVALID
29ed0 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b  _HANDLE_VALUE ){
29ee0 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
29ef0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
29f00 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
29f10 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 29  GetLastError()))
29f20 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
29f30 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6c 69  _ERROR;.  }.  li
29f40 73 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f  stObj = Tcl_NewO
29f50 62 6a 28 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72  bj();.  Tcl_Incr
29f60 52 65 66 43 6f 75 6e 74 28 6c 69 73 74 4f 62 6a  RefCount(listObj
29f70 29 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 54 63  );.  do {.    Tc
29f80 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
29f90 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c  lement(interp, l
29fa0 69 73 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 55  istObj, Tcl_NewU
29fb0 6e 69 63 6f 64 65 4f 62 6a 28 0a 20 20 20 20 20  nicodeObj(.     
29fc0 20 20 20 66 69 6e 64 44 61 74 61 2e 63 46 69 6c     findData.cFil
29fd0 65 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 20  eName, -1));.   
29fe0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
29ff0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2a000 2c 20 6c 69 73 74 4f 62 6a 2c 20 54 63 6c 5f 4e  , listObj, Tcl_N
2a010 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 0a 20 20  ewWideIntObj(.  
2a020 20 20 20 20 20 20 66 69 6e 64 44 61 74 61 2e 64        findData.d
2a030 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 29  wFileAttributes)
2a040 29 3b 0a 20 20 7d 20 77 68 69 6c 65 28 20 46 69  );.  } while( Fi
2a050 6e 64 4e 65 78 74 46 69 6c 65 57 28 68 46 69 6e  ndNextFileW(hFin
2a060 64 46 69 6c 65 2c 20 26 66 69 6e 64 44 61 74 61  dFile, &findData
2a070 29 20 29 3b 0a 20 20 6c 61 73 74 45 72 72 6e 6f  ) );.  lastErrno
2a080 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28   = GetLastError(
2a090 29 3b 0a 20 20 69 66 28 20 6c 61 73 74 45 72 72  );.  if( lastErr
2a0a0 6e 6f 21 3d 4e 4f 5f 45 52 52 4f 52 20 26 26 20  no!=NO_ERROR && 
2a0b0 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52  lastErrno!=ERROR
2a0c0 5f 4e 4f 5f 4d 4f 52 45 5f 46 49 4c 45 53 20 29  _NO_MORE_FILES )
2a0d0 7b 0a 20 20 20 20 46 69 6e 64 43 6c 6f 73 65 28  {.    FindClose(
2a0e0 68 46 69 6e 64 46 69 6c 65 29 3b 0a 20 20 20 20  hFindFile);.    
2a0f0 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
2a100 28 6c 69 73 74 4f 62 6a 29 3b 0a 20 20 20 20 54  (listObj);.    T
2a110 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
2a120 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57  interp, Tcl_NewW
2a130 69 64 65 49 6e 74 4f 62 6a 28 47 65 74 4c 61 73  ideIntObj(GetLas
2a140 74 45 72 72 6f 72 28 29 29 29 3b 0a 20 20 20 20  tError()));.    
2a150 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2a160 3b 0a 20 20 7d 0a 20 20 46 69 6e 64 43 6c 6f 73  ;.  }.  FindClos
2a170 65 28 68 46 69 6e 64 46 69 6c 65 29 3b 0a 20 20  e(hFindFile);.  
2a180 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
2a190 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a  (interp, listObj
2a1a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
2a1b0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20  OK;.}../*.**    
2a1c0 20 20 64 65 6c 65 74 65 5f 77 69 6e 33 32 5f 66    delete_win32_f
2a1d0 69 6c 65 20 46 49 4c 45 4e 41 4d 45 0a 2a 2a 0a  ile FILENAME.**.
2a1e0 2a 2a 20 44 65 6c 65 74 65 73 20 74 68 65 20 73  ** Deletes the s
2a1f0 70 65 63 69 66 69 65 64 20 66 69 6c 65 2c 20 77  pecified file, w
2a200 68 6f 73 65 20 66 75 6c 6c 79 20 71 75 61 6c 69  hose fully quali
2a210 66 69 65 64 20 6e 61 6d 65 20 6d 61 79 20 65 78  fied name may ex
2a220 63 65 65 64 20 32 36 30 0a 2a 2a 20 63 68 61 72  ceed 260.** char
2a230 61 63 74 65 72 73 20 69 66 20 69 74 20 69 73 20  acters if it is 
2a240 70 72 65 66 69 78 65 64 20 77 69 74 68 20 22 5c  prefixed with "\
2a250 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  \?\"..*/.static 
2a260 69 6e 74 20 77 69 6e 33 32 5f 64 65 6c 65 74 65  int win32_delete
2a270 5f 66 69 6c 65 28 0a 20 20 76 6f 69 64 20 2a 63  _file(.  void *c
2a280 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
2a290 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2a2a0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
2a2b0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
2a2c0 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66 28 20 6f 62  jv[].){.  if( ob
2a2d0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
2a2e0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
2a2f0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
2a300 46 49 4c 45 4e 41 4d 45 22 29 3b 0a 20 20 20 20  FILENAME");.    
2a310 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2a320 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 44 65 6c  ;.  }.  if( !Del
2a330 65 74 65 46 69 6c 65 57 28 54 63 6c 5f 47 65 74  eteFileW(Tcl_Get
2a340 55 6e 69 63 6f 64 65 28 6f 62 6a 76 5b 31 5d 29  Unicode(objv[1])
2a350 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  ) ){.    Tcl_Set
2a360 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
2a370 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
2a380 4f 62 6a 28 47 65 74 4c 61 73 74 45 72 72 6f 72  Obj(GetLastError
2a390 28 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ()));.    return
2a3a0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2a3b0 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
2a3c0 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65 74  t(interp);.  ret
2a3d0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
2a3e0 2a 0a 2a 2a 20 20 20 20 20 20 6d 61 6b 65 5f 77  *.**      make_w
2a3f0 69 6e 33 32 5f 64 69 72 20 44 49 52 45 43 54 4f  in32_dir DIRECTO
2a400 52 59 0a 2a 2a 0a 2a 2a 20 43 72 65 61 74 65 73  RY.**.** Creates
2a410 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 64   the specified d
2a420 69 72 65 63 74 6f 72 79 2c 20 77 68 6f 73 65 20  irectory, whose 
2a430 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20  fully qualified 
2a440 6e 61 6d 65 20 6d 61 79 20 65 78 63 65 65 64 20  name may exceed 
2a450 32 34 38 0a 2a 2a 20 63 68 61 72 61 63 74 65 72  248.** character
2a460 73 20 69 66 20 69 74 20 69 73 20 70 72 65 66 69  s if it is prefi
2a470 78 65 64 20 77 69 74 68 20 22 5c 5c 3f 5c 22 2e  xed with "\\?\".
2a480 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
2a490 69 6e 33 32 5f 6d 6b 64 69 72 28 0a 20 20 76 6f  in32_mkdir(.  vo
2a4a0 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a  id *clientData,.
2a4b0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2a4c0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
2a4d0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
2a4e0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69  ST objv[].){.  i
2a4f0 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
2a500 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
2a510 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
2a520 6a 76 2c 20 22 44 49 52 45 43 54 4f 52 59 22 29  jv, "DIRECTORY")
2a530 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2a540 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
2a550 28 20 21 43 72 65 61 74 65 44 69 72 65 63 74 6f  ( !CreateDirecto
2a560 72 79 57 28 54 63 6c 5f 47 65 74 55 6e 69 63 6f  ryW(Tcl_GetUnico
2a570 64 65 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c  de(objv[1]), NUL
2a580 4c 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  L) ){.    Tcl_Se
2a590 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
2a5a0 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e  p, Tcl_NewWideIn
2a5b0 74 4f 62 6a 28 47 65 74 4c 61 73 74 45 72 72 6f  tObj(GetLastErro
2a5c0 72 28 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72  r()));.    retur
2a5d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2a5e0 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75  .  Tcl_ResetResu
2a5f0 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65  lt(interp);.  re
2a600 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
2a610 2f 2a 0a 2a 2a 20 20 20 20 20 20 72 65 6d 6f 76  /*.**      remov
2a620 65 5f 77 69 6e 33 32 5f 64 69 72 20 44 49 52 45  e_win32_dir DIRE
2a630 43 54 4f 52 59 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f  CTORY.**.** Remo
2a640 76 65 73 20 74 68 65 20 73 70 65 63 69 66 69 65  ves the specifie
2a650 64 20 64 69 72 65 63 74 6f 72 79 2c 20 77 68 6f  d directory, who
2a660 73 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  se fully qualifi
2a670 65 64 20 6e 61 6d 65 20 6d 61 79 20 65 78 63 65  ed name may exce
2a680 65 64 20 32 34 38 0a 2a 2a 20 63 68 61 72 61 63  ed 248.** charac
2a690 74 65 72 73 20 69 66 20 69 74 20 69 73 20 70 72  ters if it is pr
2a6a0 65 66 69 78 65 64 20 77 69 74 68 20 22 5c 5c 3f  efixed with "\\?
2a6b0 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  \"..*/.static in
2a6c0 74 20 77 69 6e 33 32 5f 72 6d 64 69 72 28 0a 20  t win32_rmdir(. 
2a6d0 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74   void *clientDat
2a6e0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
2a6f0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
2a700 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
2a710 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
2a720 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
2a730 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
2a740 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
2a750 20 6f 62 6a 76 2c 20 22 44 49 52 45 43 54 4f 52   objv, "DIRECTOR
2a760 59 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  Y");.    return 
2a770 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2a780 20 69 66 28 20 21 52 65 6d 6f 76 65 44 69 72 65   if( !RemoveDire
2a790 63 74 6f 72 79 57 28 54 63 6c 5f 47 65 74 55 6e  ctoryW(Tcl_GetUn
2a7a0 69 63 6f 64 65 28 6f 62 6a 76 5b 31 5d 29 29 20  icode(objv[1])) 
2a7b0 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  ){.    Tcl_SetOb
2a7c0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
2a7d0 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
2a7e0 6a 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  j(GetLastError()
2a7f0 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ));.    return T
2a800 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2a810 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
2a820 69 6e 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72  interp);.  retur
2a830 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  n TCL_OK;.}.#end
2a840 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20  if.../*.**      
2a850 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e  optimization_con
2a860 74 72 6f 6c 20 44 42 20 4f 50 54 20 42 4f 4f 4c  trol DB OPT BOOL
2a870 45 41 4e 0a 2a 2a 0a 2a 2a 20 45 6e 61 62 6c 65  EAN.**.** Enable
2a880 20 6f 72 20 64 69 73 61 62 6c 65 20 71 75 65 72   or disable quer
2a890 79 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  y optimizations 
2a8a0 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  using the sqlite
2a8b0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 29  3_test_control()
2a8c0 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 20 20  .** interface.  
2a8d0 44 69 73 61 62 6c 65 20 69 66 20 42 4f 4f 4c 45  Disable if BOOLE
2a8e0 41 4e 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20  AN is false and 
2a8f0 65 6e 61 62 6c 65 20 69 66 20 42 4f 4f 4c 45 41  enable if BOOLEA
2a900 4e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 20 4f 50  N is true..** OP
2a910 54 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  T is the name of
2a920 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
2a930 6e 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64  n to be disabled
2a940 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a950 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e  optimization_con
2a960 74 72 6f 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63  trol(.  void * c
2a970 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
2a980 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2a990 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
2a9a0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
2a9b0 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  jv[].){.  int i;
2a9c0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
2a9d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
2a9e0 70 74 3b 0a 20 20 69 6e 74 20 6f 6e 6f 66 66 3b  pt;.  int onoff;
2a9f0 0a 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b  .  int mask = 0;
2aa00 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
2aa10 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e  struct {.    con
2aa20 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 4e 61 6d  st char *zOptNam
2aa30 65 3b 0a 20 20 20 20 69 6e 74 20 6d 61 73 6b 3b  e;.    int mask;
2aa40 0a 20 20 7d 20 61 4f 70 74 5b 5d 20 3d 20 7b 0a  .  } aOpt[] = {.
2aa50 20 20 20 20 7b 20 22 61 6c 6c 22 2c 20 20 20 20      { "all",    
2aa60 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
2aa70 49 54 45 5f 41 6c 6c 4f 70 74 73 20 20 20 20 20  ITE_AllOpts     
2aa80 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6e 6f 6e     },.    { "non
2aa90 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
2aaa0 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
2aab0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2aac0 7b 20 22 71 75 65 72 79 2d 66 6c 61 74 74 65 6e  { "query-flatten
2aad0 65 72 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f  er",     SQLITE_
2aae0 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72 20 7d  QueryFlattener }
2aaf0 2c 0a 20 20 20 20 7b 20 22 63 6f 6c 75 6d 6e 2d  ,.    { "column-
2ab00 63 61 63 68 65 22 2c 20 20 20 20 20 20 20 20 53  cache",        S
2ab10 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68  QLITE_ColumnCach
2ab20 65 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 67  e    },.    { "g
2ab30 72 6f 75 70 62 79 2d 6f 72 64 65 72 22 2c 20 20  roupby-order",  
2ab40 20 20 20 20 20 53 51 4c 49 54 45 5f 47 72 6f 75       SQLITE_Grou
2ab50 70 42 79 4f 72 64 65 72 20 20 20 7d 2c 0a 20 20  pByOrder   },.  
2ab60 20 20 7b 20 22 66 61 63 74 6f 72 2d 63 6f 6e 73    { "factor-cons
2ab70 74 61 6e 74 73 22 2c 20 20 20 20 53 51 4c 49 54  tants",    SQLIT
2ab80 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74  E_FactorOutConst
2ab90 20 7d 2c 0a 20 20 20 20 7b 20 22 64 69 73 74 69   },.    { "disti
2aba0 6e 63 74 2d 6f 70 74 22 2c 20 20 20 20 20 20 20  nct-opt",       
2abb0 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74   SQLITE_Distinct
2abc0 4f 70 74 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20  Opt    },.    { 
2abd0 22 63 6f 76 65 72 2d 69 64 78 2d 73 63 61 6e 22  "cover-idx-scan"
2abe0 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43 6f  ,      SQLITE_Co
2abf0 76 65 72 49 64 78 53 63 61 6e 20 20 20 7d 2c 0a  verIdxScan   },.
2ac00 20 20 20 20 7b 20 22 6f 72 64 65 72 2d 62 79 2d      { "order-by-
2ac10 69 64 78 2d 6a 6f 69 6e 22 2c 20 20 20 53 51 4c  idx-join",   SQL
2ac20 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f  ITE_OrderByIdxJo
2ac30 69 6e 20 7d 2c 0a 20 20 20 20 7b 20 22 74 72 61  in },.    { "tra
2ac40 6e 73 69 74 69 76 65 22 2c 20 20 20 20 20 20 20  nsitive",       
2ac50 20 20 20 53 51 4c 49 54 45 5f 54 72 61 6e 73 69     SQLITE_Transi
2ac60 74 69 76 65 20 20 20 20 20 7d 2c 0a 20 20 20 20  tive     },.    
2ac70 7b 20 22 73 75 62 71 75 65 72 79 2d 63 6f 72 6f  { "subquery-coro
2ac80 75 74 69 6e 65 22 2c 20 20 53 51 4c 49 54 45 5f  utine",  SQLITE_
2ac90 53 75 62 71 43 6f 72 6f 75 74 69 6e 65 20 20 7d  SubqCoroutine  }
2aca0 2c 0a 20 20 20 20 7b 20 22 6f 6d 69 74 2d 6e 6f  ,.    { "omit-no
2acb0 6f 70 2d 6a 6f 69 6e 22 2c 20 20 20 20 20 20 53  op-join",      S
2acc0 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f  QLITE_OmitNoopJo
2acd0 69 6e 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73  in   },.    { "s
2ace0 74 61 74 33 22 2c 20 20 20 20 20 20 20 20 20 20  tat3",          
2acf0 20 20 20 20 20 53 51 4c 49 54 45 5f 53 74 61 74       SQLITE_Stat
2ad00 33 34 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  34         },.  
2ad10 20 20 7b 20 22 73 74 61 74 34 22 2c 20 20 20 20    { "stat4",    
2ad20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
2ad30 45 5f 53 74 61 74 33 34 20 20 20 20 20 20 20 20  E_Stat34        
2ad40 20 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20   },.  };..  if( 
2ad50 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
2ad60 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
2ad70 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
2ad80 20 22 44 42 20 4f 50 54 20 42 4f 4f 4c 45 41 4e   "DB OPT BOOLEAN
2ad90 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
2ada0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2adb0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
2adc0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
2add0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
2ade0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
2adf0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
2ae00 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
2ae10 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
2ae20 6a 76 5b 33 5d 2c 20 26 6f 6e 6f 66 66 29 20 29  jv[3], &onoff) )
2ae30 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2ae40 52 3b 0a 20 20 7a 4f 70 74 20 3d 20 54 63 6c 5f  R;.  zOpt = Tcl_
2ae50 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
2ae60 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ]);.  for(i=0; i
2ae70 3c 73 69 7a 65 6f 66 28 61 4f 70 74 29 2f 73 69  <sizeof(aOpt)/si
2ae80 7a 65 6f 66 28 61 4f 70 74 5b 30 5d 29 3b 20 69  zeof(aOpt[0]); i
2ae90 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
2aea0 63 6d 70 28 7a 4f 70 74 2c 20 61 4f 70 74 5b 69  cmp(zOpt, aOpt[i
2aeb0 5d 2e 7a 4f 70 74 4e 61 6d 65 29 3d 3d 30 20 29  ].zOptName)==0 )
2aec0 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 61  {.      mask = a
2aed0 4f 70 74 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20  Opt[i].mask;.   
2aee0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2aef0 20 20 7d 0a 20 20 69 66 28 20 6f 6e 6f 66 66 20    }.  if( onoff 
2af00 29 20 6d 61 73 6b 20 3d 20 7e 6d 61 73 6b 3b 0a  ) mask = ~mask;.
2af10 20 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28    if( i>=sizeof(
2af20 61 4f 70 74 29 2f 73 69 7a 65 6f 66 28 61 4f 70  aOpt)/sizeof(aOp
2af30 74 5b 30 5d 29 20 29 7b 0a 20 20 20 20 54 63 6c  t[0]) ){.    Tcl
2af40 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
2af50 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f  terp, "unknown o
2af60 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 73 68  ptimization - sh
2af70 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a 22  ould be one of:"
2af80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2af90 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29         (char*)0)
2afa0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2afb0 3c 73 69 7a 65 6f 66 28 61 4f 70 74 29 2f 73 69  <sizeof(aOpt)/si
2afc0 7a 65 6f 66 28 61 4f 70 74 5b 30 5d 29 3b 20 69  zeof(aOpt[0]); i
2afd0 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  ++){.      Tcl_A
2afe0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
2aff0 72 70 2c 20 22 20 22 2c 20 61 4f 70 74 5b 69 5d  rp, " ", aOpt[i]
2b000 2e 7a 4f 70 74 4e 61 6d 65 2c 20 28 63 68 61 72  .zOptName, (char
2b010 2a 29 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  *)0);.    }.    
2b020 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2b030 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
2b040 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
2b050 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54  ITE_TESTCTRL_OPT
2b060 49 4d 49 5a 41 54 49 4f 4e 53 2c 20 64 62 2c 20  IMIZATIONS, db, 
2b070 6d 61 73 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20  mask);.  return 
2b080 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 74 79 70 65 64  TCL_OK;.}..typed
2b090 65 66 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  ef struct sqlite
2b0a0 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 20 73  3_api_routines s
2b0b0 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69  qlite3_api_routi
2b0c0 6e 65 73 3b 0a 2f 2a 0a 2a 2a 20 20 20 20 20 6c  nes;./*.**     l
2b0d0 6f 61 64 5f 73 74 61 74 69 63 5f 65 78 74 65 6e  oad_static_exten
2b0e0 73 69 6f 6e 20 44 42 20 4e 41 4d 45 20 2e 2e 2e  sion DB NAME ...
2b0f0 0a 2a 2a 0a 2a 2a 20 4c 6f 61 64 20 6f 6e 65 20  .**.** Load one 
2b100 6f 72 20 6d 6f 72 65 20 73 74 61 74 69 63 61 6c  or more statical
2b110 6c 79 20 6c 69 6e 6b 65 64 20 65 78 74 65 6e 73  ly linked extens
2b120 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ions..*/.static 
2b130 69 6e 74 20 74 63 6c 4c 6f 61 64 53 74 61 74 69  int tclLoadStati
2b140 63 45 78 74 65 6e 73 69 6f 6e 43 6d 64 28 0a 20  cExtensionCmd(. 
2b150 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
2b160 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
2b170 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
2b180 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
2b190 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
2b1a0 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
2b1b0 6c 69 74 65 33 5f 61 6d 61 74 63 68 5f 69 6e 69  lite3_amatch_ini
2b1c0 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a  t(sqlite3*,char*
2b1d0 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  *,const sqlite3_
2b1e0 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a  api_routines*);.
2b1f0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
2b200 69 74 65 33 5f 63 6c 6f 73 75 72 65 5f 69 6e 69  ite3_closure_ini
2b210 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a  t(sqlite3*,char*
2b220 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  *,const sqlite3_
2b230 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a  api_routines*);.
2b240 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
2b250 69 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e 69 74  ite3_fileio_init
2b260 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a  (sqlite3*,char**
2b270 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61  ,const sqlite3_a
2b280 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20  pi_routines*);. 
2b290 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
2b2a0 74 65 33 5f 66 75 7a 7a 65 72 5f 69 6e 69 74 28  te3_fuzzer_init(
2b2b0 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c  sqlite3*,char**,
2b2c0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70  const sqlite3_ap
2b2d0 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20  i_routines*);.  
2b2e0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
2b2f0 65 33 5f 69 65 65 65 5f 69 6e 69 74 28 73 71 6c  e3_ieee_init(sql
2b300 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e  ite3*,char**,con
2b310 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
2b320 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74  outines*);.  ext
2b330 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
2b340 6e 65 78 74 63 68 61 72 5f 69 6e 69 74 28 73 71  nextchar_init(sq
2b350 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f  lite3*,char**,co
2b360 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f  nst sqlite3_api_
2b370 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78  routines*);.  ex
2b380 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
2b390 5f 70 65 72 63 65 6e 74 69 6c 65 5f 69 6e 69 74  _percentile_init
2b3a0 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a  (sqlite3*,char**
2b3b0 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61  ,const sqlite3_a
2b3c0 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20  pi_routines*);. 
2b3d0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
2b3e0 74 65 33 5f 72 65 67 65 78 70 5f 69 6e 69 74 28  te3_regexp_init(
2b3f0 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c  sqlite3*,char**,
2b400 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70  const sqlite3_ap
2b410 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20  i_routines*);.  
2b420 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
2b430 65 33 5f 73 70 65 6c 6c 66 69 78 5f 69 6e 69 74  e3_spellfix_init
2b440 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a  (sqlite3*,char**
2b450 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61  ,const sqlite3_a
2b460 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20  pi_routines*);. 
2b470 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
2b480 74 65 33 5f 74 6f 74 79 70 65 5f 69 6e 69 74 28  te3_totype_init(
2b490 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c  sqlite3*,char**,
2b4a0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70  const sqlite3_ap
2b4b0 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20  i_routines*);.  
2b4c0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
2b4d0 65 33 5f 77 68 6f 6c 65 6e 75 6d 62 65 72 5f 69  e3_wholenumber_i
2b4e0 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61  nit(sqlite3*,cha
2b4f0 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65  r**,const sqlite
2b500 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29  3_api_routines*)
2b510 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
2b520 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f   struct {.    co
2b530 6e 73 74 20 63 68 61 72 20 2a 7a 45 78 74 4e 61  nst char *zExtNa
2b540 6d 65 3b 0a 20 20 20 20 69 6e 74 20 28 2a 70 49  me;.    int (*pI
2b550 6e 69 74 29 28 73 71 6c 69 74 65 33 2a 2c 63 68  nit)(sqlite3*,ch
2b560 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74  ar**,const sqlit
2b570 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a  e3_api_routines*
2b580 29 3b 0a 20 20 7d 20 61 45 78 74 65 6e 73 69 6f  );.  } aExtensio
2b590 6e 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 61  n[] = {.    { "a
2b5a0 6d 61 74 63 68 22 2c 20 20 20 20 20 20 20 20 20  match",         
2b5b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 61         sqlite3_a
2b5c0 6d 61 74 63 68 5f 69 6e 69 74 20 20 20 20 20 20  match_init      
2b5d0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2b5e0 7b 20 22 63 6c 6f 73 75 72 65 22 2c 20 20 20 20  { "closure",    
2b5f0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2b600 65 33 5f 63 6c 6f 73 75 72 65 5f 69 6e 69 74 20  e3_closure_init 
2b610 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
2b620 20 20 20 20 7b 20 22 66 69 6c 65 69 6f 22 2c 20      { "fileio", 
2b630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2b640 71 6c 69 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e  qlite3_fileio_in
2b650 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  it              
2b660 20 7d 2c 0a 20 20 20 20 7b 20 22 66 75 7a 7a 65   },.    { "fuzze
2b670 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  r",             
2b680 20 20 20 73 71 6c 69 74 65 33 5f 66 75 7a 7a 65     sqlite3_fuzze
2b690 72 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20  r_init          
2b6a0 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69       },.    { "i
2b6b0 65 65 65 37 35 34 22 2c 20 20 20 20 20 20 20 20  eee754",        
2b6c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69         sqlite3_i
2b6d0 65 65 65 5f 69 6e 69 74 20 20 20 20 20 20 20 20  eee_init        
2b6e0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2b6f0 7b 20 22 6e 65 78 74 63 68 61 72 22 2c 20 20 20  { "nextchar",   
2b700 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2b710 65 33 5f 6e 65 78 74 63 68 61 72 5f 69 6e 69 74  e3_nextchar_init
2b720 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
2b730 20 20 20 20 7b 20 22 70 65 72 63 65 6e 74 69 6c      { "percentil
2b740 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 73  e",            s
2b750 71 6c 69 74 65 33 5f 70 65 72 63 65 6e 74 69 6c  qlite3_percentil
2b760 65 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20  e_init          
2b770 20 7d 2c 0a 20 20 20 20 7b 20 22 72 65 67 65 78   },.    { "regex
2b780 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p",             
2b790 20 20 20 73 71 6c 69 74 65 33 5f 72 65 67 65 78     sqlite3_regex
2b7a0 70 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20  p_init          
2b7b0 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73       },.    { "s
2b7c0 70 65 6c 6c 66 69 78 22 2c 20 20 20 20 20 20 20  pellfix",       
2b7d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
2b7e0 70 65 6c 6c 66 69 78 5f 69 6e 69 74 20 20 20 20  pellfix_init    
2b7f0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2b800 7b 20 22 74 6f 74 79 70 65 22 2c 20 20 20 20 20  { "totype",     
2b810 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2b820 65 33 5f 74 6f 74 79 70 65 5f 69 6e 69 74 20 20  e3_totype_init  
2b830 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
2b840 20 20 20 20 7b 20 22 77 68 6f 6c 65 6e 75 6d 62      { "wholenumb
2b850 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 73  er",           s
2b860 71 6c 69 74 65 33 5f 77 68 6f 6c 65 6e 75 6d 62  qlite3_wholenumb
2b870 65 72 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20  er_init         
2b880 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73 71 6c 69 74   },.  };.  sqlit
2b890 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
2b8a0 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69  char *zName;.  i
2b8b0 6e 74 20 69 2c 20 6a 2c 20 72 63 3b 0a 20 20 63  nt i, j, rc;.  c
2b8c0 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
2b8d0 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3c 33 20 29  ;.  if( objc<3 )
2b8e0 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
2b8f0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
2b900 2c 20 6f 62 6a 76 2c 20 22 44 42 20 4e 41 4d 45  , objv, "DB NAME
2b910 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74 75   ...");.    retu
2b920 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2b930 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
2b940 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
2b950 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
2b960 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
2b970 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2b980 66 6f 72 28 6a 3d 32 3b 20 6a 3c 6f 62 6a 63 3b  for(j=2; j<objc;
2b990 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 4e 61 6d 65   j++){.    zName
2b9a0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
2b9b0 28 6f 62 6a 76 5b 6a 5d 29 3b 0a 20 20 20 20 66  (objv[j]);.    f
2b9c0 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
2b9d0 69 7a 65 28 61 45 78 74 65 6e 73 69 6f 6e 29 3b  ize(aExtension);
2b9e0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
2b9f0 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
2ba00 45 78 74 65 6e 73 69 6f 6e 5b 69 5d 2e 7a 45 78  Extension[i].zEx
2ba10 74 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61  tName)==0 ) brea
2ba20 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
2ba30 20 69 3e 3d 41 72 72 61 79 53 69 7a 65 28 61 45   i>=ArraySize(aE
2ba40 78 74 65 6e 73 69 6f 6e 29 20 29 7b 0a 20 20 20  xtension) ){.   
2ba50 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
2ba60 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20  ult(interp, "no 
2ba70 73 75 63 68 20 65 78 74 65 6e 73 69 6f 6e 3a 20  such extension: 
2ba80 22 2c 20 7a 4e 61 6d 65 2c 20 28 63 68 61 72 2a  ", zName, (char*
2ba90 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  )0);.      retur
2baa0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
2bab0 20 7d 0a 20 20 20 20 72 63 20 3d 20 61 45 78 74   }.    rc = aExt
2bac0 65 6e 73 69 6f 6e 5b 69 5d 2e 70 49 6e 69 74 28  ension[i].pInit(
2bad0 64 62 2c 20 26 7a 45 72 72 4d 73 67 2c 20 30 29  db, &zErrMsg, 0)
2bae0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2baf0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 7a 45 72 72 4d  LITE_OK || zErrM
2bb00 73 67 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  sg ){.      Tcl_
2bb10 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
2bb20 65 72 70 2c 20 22 69 6e 69 74 69 61 6c 69 7a 61  erp, "initializa
2bb30 74 69 6f 6e 20 6f 66 20 22 2c 20 7a 4e 61 6d 65  tion of ", zName
2bb40 2c 20 22 20 66 61 69 6c 65 64 3a 20 22 2c 20 7a  , " failed: ", z
2bb50 45 72 72 4d 73 67 2c 0a 20 20 20 20 20 20 20 20  ErrMsg,.        
2bb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2bb70 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
2bb80 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
2bb90 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 65 74  rMsg);.      ret
2bba0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2bbb0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2bbc0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
2bbd0 2a 2a 20 20 20 20 20 73 6f 72 74 65 72 5f 74 65  **     sorter_te
2bbe0 73 74 5f 66 61 6b 65 68 65 61 70 20 42 4f 4f 4c  st_fakeheap BOOL
2bbf0 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
2bc00 74 20 73 6f 72 74 65 72 5f 74 65 73 74 5f 66 61  t sorter_test_fa
2bc10 6b 65 68 65 61 70 28 0a 20 20 76 6f 69 64 20 2a  keheap(.  void *
2bc20 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
2bc30 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2bc40 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
2bc50 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
2bc60 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20  objv[].){.  int 
2bc70 62 41 72 67 3b 0a 20 20 69 66 28 20 6f 62 6a 63  bArg;.  if( objc
2bc80 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
2bc90 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
2bca0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 42 4f  rp, 1, objv, "BO
2bcb0 4f 4c 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  OL");.    return
2bcc0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2bcd0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f  .  if( Tcl_GetBo
2bce0 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
2bcf0 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 62  erp, objv[1], &b
2bd00 41 72 67 29 20 29 7b 0a 20 20 20 20 72 65 74 75  Arg) ){.    retu
2bd10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2bd20 7d 0a 0a 20 20 69 66 28 20 62 41 72 67 20 29 7b  }..  if( bArg ){
2bd30 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2bd40 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65  GlobalConfig.pHe
2bd50 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ap==0 ){.      s
2bd60 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2bd70 69 67 2e 70 48 65 61 70 20 3d 20 53 51 4c 49 54  ig.pHeap = SQLIT
2bd80 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 2d 31 29  E_INT_TO_PTR(-1)
2bd90 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
2bda0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2bdb0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65  GlobalConfig.pHe
2bdc0 61 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 5f 54  ap==SQLITE_INT_T
2bdd0 4f 5f 50 54 52 28 2d 31 29 20 29 7b 0a 20 20 20  O_PTR(-1) ){.   
2bde0 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
2bdf0 43 6f 6e 66 69 67 2e 70 48 65 61 70 20 3d 20 30  Config.pHeap = 0
2be00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 54  ;.    }.  }..  T
2be10 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
2be20 6e 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e  nterp);.  return
2be30 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
2be40 2a 20 20 20 20 20 73 6f 72 74 65 72 5f 74 65 73  *     sorter_tes
2be50 74 5f 73 6f 72 74 34 5f 68 65 6c 70 65 72 20 44  t_sort4_helper D
2be60 42 20 53 51 4c 31 20 4e 53 54 45 50 20 53 51 4c  B SQL1 NSTEP SQL
2be70 32 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20  2.**.** Compile 
2be80 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 24 53  SQL statement $S
2be90 51 4c 31 20 61 6e 64 20 73 74 65 70 20 69 74 20  QL1 and step it 
2bea0 24 4e 53 54 45 50 20 74 69 6d 65 73 2e 20 46 6f  $NSTEP times. Fo
2beb0 72 20 65 61 63 68 20 72 6f 77 2c 20 0a 2a 2a 20  r each row, .** 
2bec0 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6c  check that the l
2bed0 65 66 74 6d 6f 73 74 20 61 6e 64 20 72 69 67 68  eftmost and righ
2bee0 74 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 72 65  tmost columns re
2bef0 74 75 72 6e 65 64 20 61 72 65 20 62 6f 74 68 20  turned are both 
2bf00 69 6e 74 65 67 65 72 73 2c 0a 2a 2a 20 61 6e 64  integers,.** and
2bf10 20 74 68 61 74 20 62 6f 74 68 20 63 6f 6e 74 61   that both conta
2bf20 69 6e 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75  in the same valu
2bf30 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 65 78  e..**.** Then ex
2bf40 65 63 75 74 65 20 73 74 61 74 65 6d 65 6e 74 20  ecute statement 
2bf50 24 53 51 4c 32 2e 20 43 68 65 63 6b 20 74 68 61  $SQL2. Check tha
2bf60 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
2bf70 72 65 74 75 72 6e 73 20 74 68 65 20 73 61 6d 65  returns the same
2bf80 0a 2a 2a 20 73 65 74 20 6f 66 20 69 6e 74 65 67  .** set of integ
2bf90 65 72 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ers in the same 
2bfa0 6f 72 64 65 72 20 61 73 20 69 6e 20 74 68 65 20  order as in the 
2bfb0 70 72 65 76 69 6f 75 73 20 73 74 65 70 20 28 75  previous step (u
2bfc0 73 69 6e 67 20 24 53 51 4c 31 29 2e 0a 2a 2f 0a  sing $SQL1)..*/.
2bfd0 73 74 61 74 69 63 20 69 6e 74 20 73 6f 72 74 65  static int sorte
2bfe0 72 5f 74 65 73 74 5f 73 6f 72 74 34 5f 68 65 6c  r_test_sort4_hel
2bff0 70 65 72 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  per(.  void * cl
2c000 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
2c010 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
2c020 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
2c030 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
2c040 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63  v[].){.  const c
2c050 68 61 72 20 2a 7a 53 71 6c 31 3b 0a 20 20 63 6f  har *zSql1;.  co
2c060 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 32 3b  nst char *zSql2;
2c070 0a 20 20 69 6e 74 20 6e 53 74 65 70 3b 20 0a 20  .  int nStep; . 
2c080 20 69 6e 74 20 69 53 74 65 70 3b 20 0a 20 20 69   int iStep; .  i
2c090 6e 74 20 69 43 6b 73 75 6d 31 20 3d 20 30 3b 20  nt iCksum1 = 0; 
2c0a0 0a 20 20 69 6e 74 20 69 43 6b 73 75 6d 32 20 3d  .  int iCksum2 =
2c0b0 20 30 3b 20 0a 20 20 69 6e 74 20 72 63 3b 0a 20   0; .  int rc;. 
2c0c0 20 69 6e 74 20 69 42 3b 0a 20 20 73 71 6c 69 74   int iB;.  sqlit
2c0d0 65 33 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65  e3 *db;.  sqlite
2c0e0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
2c0f0 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20   .  if( objc!=5 
2c100 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
2c110 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
2c120 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 53 51 4c  1, objv, "DB SQL
2c130 31 20 4e 53 54 45 50 20 53 51 4c 32 22 29 3b 0a  1 NSTEP SQL2");.
2c140 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2c150 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
2c160 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
2c170 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
2c180 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
2c190 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
2c1a0 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 31 20 3d  ERROR;.  zSql1 =
2c1b0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
2c1c0 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54  bjv[2]);.  if( T
2c1d0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
2c1e0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
2c1f0 2c 20 26 6e 53 74 65 70 29 20 29 20 72 65 74 75  , &nStep) ) retu
2c200 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2c210 7a 53 71 6c 32 20 3d 20 54 63 6c 5f 47 65 74 53  zSql2 = Tcl_GetS
2c220 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a  tring(objv[4]);.
2c230 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
2c240 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a  prepare_v2(db, z
2c250 53 71 6c 31 2c 20 2d 31 2c 20 26 70 53 74 6d 74  Sql1, -1, &pStmt
2c260 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
2c270 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
2c280 20 73 71 6c 5f 65 72 72 6f 72 3b 0a 0a 20 20 69   sql_error;..  i
2c290 42 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  B = sqlite3_colu
2c2a0 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 2d  mn_count(pStmt)-
2c2b0 31 3b 0a 20 20 66 6f 72 28 69 53 74 65 70 3d 30  1;.  for(iStep=0
2c2c0 3b 20 69 53 74 65 70 3c 6e 53 74 65 70 20 26 26  ; iStep<nStep &&
2c2d0 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
2c2e0 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
2c2f0 3b 20 69 53 74 65 70 2b 2b 29 7b 0a 20 20 20 20  ; iStep++){.    
2c300 69 6e 74 20 61 20 3d 20 73 71 6c 69 74 65 33 5f  int a = sqlite3_
2c310 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
2c320 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 61 21  , 0);.    if( a!
2c330 3d 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  =sqlite3_column_
2c340 69 6e 74 28 70 53 74 6d 74 2c 20 69 42 29 20 29  int(pStmt, iB) )
2c350 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
2c360 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2c370 20 22 64 61 74 61 20 65 72 72 6f 72 3a 20 28 61   "data error: (a
2c380 21 3d 62 29 22 2c 20 30 29 3b 0a 20 20 20 20 20  !=b)", 0);.     
2c390 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2c3a0 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 43  R;.    }..    iC
2c3b0 6b 73 75 6d 31 20 2b 3d 20 28 69 43 6b 73 75 6d  ksum1 += (iCksum
2c3c0 31 20 3c 3c 20 33 29 20 2b 20 61 3b 0a 20 20 7d  1 << 3) + a;.  }
2c3d0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
2c3e0 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
2c3f0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2c400 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 71 6c 5f  E_OK ) goto sql_
2c410 65 72 72 6f 72 3b 0a 0a 20 20 72 63 20 3d 20 73  error;..  rc = s
2c420 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
2c430 32 28 64 62 2c 20 7a 53 71 6c 32 2c 20 2d 31 2c  2(db, zSql2, -1,
2c440 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69   &pStmt, 0);.  i
2c450 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2c460 20 29 20 67 6f 74 6f 20 73 71 6c 5f 65 72 72 6f   ) goto sql_erro
2c470 72 3b 0a 20 20 66 6f 72 28 69 53 74 65 70 3d 30  r;.  for(iStep=0
2c480 3b 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ; SQLITE_ROW==sq
2c490 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
2c4a0 29 3b 20 69 53 74 65 70 2b 2b 29 7b 0a 20 20 20  ); iStep++){.   
2c4b0 20 69 6e 74 20 61 20 3d 20 73 71 6c 69 74 65 33   int a = sqlite3
2c4c0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
2c4d0 74 2c 20 30 29 3b 0a 20 20 20 20 69 43 6b 73 75  t, 0);.    iCksu
2c4e0 6d 32 20 2b 3d 20 28 69 43 6b 73 75 6d 32 20 3c  m2 += (iCksum2 <
2c4f0 3c 20 33 29 20 2b 20 61 3b 0a 20 20 7d 0a 20 20  < 3) + a;.  }.  
2c500 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  rc = sqlite3_fin
2c510 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
2c520 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2c530 4b 20 29 20 67 6f 74 6f 20 73 71 6c 5f 65 72 72  K ) goto sql_err
2c540 6f 72 3b 0a 0a 20 20 69 66 28 20 69 43 6b 73 75  or;..  if( iCksu
2c550 6d 31 21 3d 69 43 6b 73 75 6d 32 20 29 7b 0a 20  m1!=iCksum2 ){. 
2c560 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
2c570 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 68 65  ult(interp, "che
2c580 63 6b 73 75 6d 20 6d 69 73 6d 61 74 63 68 22 2c  cksum mismatch",
2c590 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
2c5a0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
2c5b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2c5c0 0a 20 73 71 6c 5f 65 72 72 6f 72 3a 0a 20 20 54  . sql_error:.  T
2c5d0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2c5e0 69 6e 74 65 72 70 2c 20 22 73 71 6c 20 65 72 72  interp, "sql err
2c5f0 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65  or: ", sqlite3_e
2c600 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20  rrmsg(db), 0);. 
2c610 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2c620 52 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51  R;.}...#ifdef SQ
2c630 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
2c640 54 49 43 41 54 49 4f 4e 0a 23 69 6e 63 6c 75 64  TICATION.#includ
2c650 65 20 22 73 71 6c 69 74 65 33 75 73 65 72 61 75  e "sqlite3userau
2c660 74 68 2e 68 22 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  th.h"./*.** tclc
2c670 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 73 65  md:  sqlite3_use
2c680 72 5f 61 75 74 68 65 6e 74 69 63 61 74 65 20 44  r_authenticate D
2c690 42 20 55 53 45 52 4e 41 4d 45 20 50 41 53 53 57  B USERNAME PASSW
2c6a0 4f 52 44 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ORD.*/.static in
2c6b0 74 20 74 65 73 74 5f 75 73 65 72 5f 61 75 74 68  t test_user_auth
2c6c0 65 6e 74 69 63 61 74 65 28 0a 20 20 43 6c 69 65  enticate(.  Clie
2c6d0 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
2c6e0 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a  a, /* Unused */.
2c6f0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2c700 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
2c710 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
2c720 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
2c730 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
2c740 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
2c750 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2c760 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
2c770 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
2c780 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
2c790 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
2c7a0 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 55 73 65  .){.  char *zUse
2c7b0 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  r = 0;.  char *z
2c7c0 50 61 73 73 77 64 20 3d 20 30 3b 0a 20 20 69 6e  Passwd = 0;.  in
2c7d0 74 20 6e 50 61 73 73 77 64 20 3d 20 30 3b 0a 20  t nPasswd = 0;. 
2c7e0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
2c7f0 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
2c800 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
2c810 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
2c820 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
2c830 22 44 42 20 55 53 45 52 4e 41 4d 45 20 50 41 53  "DB USERNAME PAS
2c840 53 57 4f 52 44 22 29 3b 0a 20 20 20 20 72 65 74  SWORD");.    ret
2c850 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2c860 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
2c870 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
2c880 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
2c890 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20  [1]), &db) ){.  
2c8a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2c8b0 4f 52 3b 0a 20 20 7d 0a 20 20 7a 55 73 65 72 20  OR;.  }.  zUser 
2c8c0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
2c8d0 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7a 50 61 73  objv[2]);.  zPas
2c8e0 73 77 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  swd = Tcl_GetStr
2c8f0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
2c900 33 5d 2c 20 26 6e 50 61 73 73 77 64 29 3b 0a 20  3], &nPasswd);. 
2c910 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 75 73   rc = sqlite3_us
2c920 65 72 5f 61 75 74 68 65 6e 74 69 63 61 74 65 28  er_authenticate(
2c930 64 62 2c 20 7a 55 73 65 72 2c 20 7a 50 61 73 73  db, zUser, zPass
2c940 77 64 2c 20 6e 50 61 73 73 77 64 29 3b 0a 20 20  wd, nPasswd);.  
2c950 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
2c960 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
2c970 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
2c980 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65  CL_STATIC);.  re
2c990 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23  turn TCL_OK;.}.#
2c9a0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2c9b0 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54  USER_AUTHENTICAT
2c9c0 49 4f 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  ION */..#ifdef S
2c9d0 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45  QLITE_USER_AUTHE
2c9e0 4e 54 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20  NTICATION./*.** 
2c9f0 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65 33  tclcmd:  sqlite3
2ca00 5f 75 73 65 72 5f 61 64 64 20 44 42 20 55 53 45  _user_add DB USE
2ca10 52 4e 41 4d 45 20 50 41 53 53 57 4f 52 44 20 49  RNAME PASSWORD I
2ca20 53 41 44 4d 49 4e 0a 2a 2f 0a 73 74 61 74 69 63  SADMIN.*/.static
2ca30 20 69 6e 74 20 74 65 73 74 5f 75 73 65 72 5f 61   int test_user_a
2ca40 64 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  dd(.  ClientData
2ca50 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
2ca60 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  Unused */.  Tcl_
2ca70 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
2ca80 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
2ca90 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
2caa0 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
2cab0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
2cac0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2cad0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
2cae0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
2caf0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
2cb00 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
2cb10 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
2cb20 63 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 30 3b  char *zUser = 0;
2cb30 0a 20 20 63 68 61 72 20 2a 7a 50 61 73 73 77 64  .  char *zPasswd
2cb40 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50 61 73   = 0;.  int nPas
2cb50 73 77 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  swd = 0;.  int i
2cb60 73 41 64 6d 69 6e 20 3d 20 30 3b 0a 20 20 73 71  sAdmin = 0;.  sq
2cb70 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
2cb80 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
2cb90 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=5 ){.    Tcl_W
2cba0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
2cbb0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
2cbc0 20 55 53 45 52 4e 41 4d 45 20 50 41 53 53 57 4f   USERNAME PASSWO
2cbd0 52 44 20 49 53 41 44 4d 49 4e 22 29 3b 0a 20 20  RD ISADMIN");.  
2cbe0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2cbf0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
2cc00 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
2cc10 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
2cc20 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
2cc30 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
2cc40 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
2cc50 55 73 65 72 20 3d 20 54 63 6c 5f 47 65 74 53 74  User = Tcl_GetSt
2cc60 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
2cc70 20 7a 50 61 73 73 77 64 20 3d 20 54 63 6c 5f 47   zPasswd = Tcl_G
2cc80 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
2cc90 6f 62 6a 76 5b 33 5d 2c 20 26 6e 50 61 73 73 77  objv[3], &nPassw
2cca0 64 29 3b 0a 20 20 54 63 6c 5f 47 65 74 42 6f 6f  d);.  Tcl_GetBoo
2ccb0 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
2ccc0 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 69 73  rp, objv[4], &is
2ccd0 41 64 6d 69 6e 29 3b 0a 20 20 72 63 20 3d 20 73  Admin);.  rc = s
2cce0 71 6c 69 74 65 33 5f 75 73 65 72 5f 61 64 64 28  qlite3_user_add(
2ccf0 64 62 2c 20 7a 55 73 65 72 2c 20 7a 50 61 73 73  db, zUser, zPass
2cd00 77 64 2c 20 6e 50 61 73 73 77 64 2c 20 69 73 41  wd, nPasswd, isA
2cd10 64 6d 69 6e 29 3b 0a 20 20 54 63 6c 5f 53 65 74  dmin);.  Tcl_Set
2cd20 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
2cd30 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
2cd40 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
2cd50 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  IC);.  return TC
2cd60 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  L_OK;.}.#endif /
2cd70 2a 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55  * SQLITE_USER_AU
2cd80 54 48 45 4e 54 49 43 41 54 49 4f 4e 20 2a 2f 0a  THENTICATION */.
2cd90 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55  .#ifdef SQLITE_U
2cda0 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49  SER_AUTHENTICATI
2cdb0 4f 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  ON./*.** tclcmd:
2cdc0 20 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 63    sqlite3_user_c
2cdd0 68 61 6e 67 65 20 44 42 20 55 53 45 52 4e 41 4d  hange DB USERNAM
2cde0 45 20 50 41 53 53 57 4f 52 44 20 49 53 41 44 4d  E PASSWORD ISADM
2cdf0 49 4e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  IN.*/.static int
2ce00 20 74 65 73 74 5f 75 73 65 72 5f 63 68 61 6e 67   test_user_chang
2ce10 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  e(.  ClientData 
2ce20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55  clientData, /* U
2ce30 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49  nused */.  Tcl_I
2ce40 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
2ce50 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
2ce60 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
2ce70 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
2ce80 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
2ce90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2cea0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
2ceb0 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
2cec0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
2ced0 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
2cee0 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63  uments */.){.  c
2cef0 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 30 3b 0a  har *zUser = 0;.
2cf00 20 20 63 68 61 72 20 2a 7a 50 61 73 73 77 64 20    char *zPasswd 
2cf10 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50 61 73 73  = 0;.  int nPass
2cf20 77 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73  wd = 0;.  int is
2cf30 41 64 6d 69 6e 20 3d 20 30 3b 0a 20 20 73 71 6c  Admin = 0;.  sql
2cf40 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
2cf50 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
2cf60 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =5 ){.    Tcl_Wr
2cf70 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
2cf80 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
2cf90 55 53 45 52 4e 41 4d 45 20 50 41 53 53 57 4f 52  USERNAME PASSWOR
2cfa0 44 20 49 53 41 44 4d 49 4e 22 29 3b 0a 20 20 20  D ISADMIN");.   
2cfb0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2cfc0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
2cfd0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
2cfe0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
2cff0 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
2d000 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
2d010 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 55  _ERROR;.  }.  zU
2d020 73 65 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ser = Tcl_GetStr
2d030 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
2d040 7a 50 61 73 73 77 64 20 3d 20 54 63 6c 5f 47 65  zPasswd = Tcl_Ge
2d050 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
2d060 62 6a 76 5b 33 5d 2c 20 26 6e 50 61 73 73 77 64  bjv[3], &nPasswd
2d070 29 3b 0a 20 20 54 63 6c 5f 47 65 74 42 6f 6f 6c  );.  Tcl_GetBool
2d080 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
2d090 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 69 73 41  p, objv[4], &isA
2d0a0 64 6d 69 6e 29 3b 0a 20 20 72 63 20 3d 20 73 71  dmin);.  rc = sq
2d0b0 6c 69 74 65 33 5f 75 73 65 72 5f 63 68 61 6e 67  lite3_user_chang
2d0c0 65 28 64 62 2c 20 7a 55 73 65 72 2c 20 7a 50 61  e(db, zUser, zPa
2d0d0 73 73 77 64 2c 20 6e 50 61 73 73 77 64 2c 20 69  sswd, nPasswd, i
2d0e0 73 41 64 6d 69 6e 29 3b 0a 20 20 54 63 6c 5f 53  sAdmin);.  Tcl_S
2d0f0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
2d100 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
2d110 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54  Name(rc), TCL_ST
2d120 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20  ATIC);.  return 
2d130 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
2d140 20 2f 2a 20 53 51 4c 49 54 45 5f 55 53 45 52 5f   /* SQLITE_USER_
2d150 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 20 2a  AUTHENTICATION *
2d160 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
2d170 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41  _USER_AUTHENTICA
2d180 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  TION./*.** tclcm
2d190 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 73 65 72  d:  sqlite3_user
2d1a0 5f 64 65 6c 65 74 65 20 44 42 20 55 53 45 52 4e  _delete DB USERN
2d1b0 41 4d 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  AME.*/.static in
2d1c0 74 20 74 65 73 74 5f 75 73 65 72 5f 64 65 6c 65  t test_user_dele
2d1d0 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  te(.  ClientData
2d1e0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
2d1f0 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  Unused */.  Tcl_
2d200 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
2d210 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
2d220 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
2d230 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
2d240 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
2d250 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2d260 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
2d270 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
2d280 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
2d290 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
2d2a0 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
2d2b0 63 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 30 3b  char *zUser = 0;
2d2c0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
2d2d0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
2d2e0 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
2d2f0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
2d300 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
2d310 2c 20 22 44 42 20 55 53 45 52 4e 41 4d 45 22 29  , "DB USERNAME")
2d320 3b 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 69 66  _ERROR;.  }.  if
2d340 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
2d350 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
2d360 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
2d370 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
2d380 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2d390 0a 20 20 7a 55 73 65 72 20 3d 20 54 63 6c 5f 47  .  zUser = Tcl_G
2d3a0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
2d3b0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
2d3c0 33 5f 75 73 65 72 5f 64 65 6c 65 74 65 28 64 62  3_user_delete(db
2d3d0 2c 20 7a 55 73 65 72 29 3b 0a 20 20 54 63 6c 5f  , zUser);.  Tcl_
2d3e0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
2d3f0 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
2d400 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53  rName(rc), TCL_S
2d410 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e  TATIC);.  return
2d420 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69   TCL_OK;.}.#endi
2d430 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55 53 45 52  f /* SQLITE_USER
2d440 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 20  _AUTHENTICATION 
2d450 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  */../*.** Regist
2d460 65 72 20 63 6f 6d 6d 61 6e 64 73 20 77 69 74 68  er commands with
2d470 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   the TCL interpr
2d480 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 53 71 6c  eter..*/.int Sql
2d490 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28 54 63  itetest1_Init(Tc
2d4a0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2d4b0 29 7b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  ){.  extern int 
2d4c0 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
2d4d0 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69  ount;.  extern i
2d4e0 6e 74 20 73 71 6c 69 74 65 33 5f 66 6f 75 6e 64  nt sqlite3_found
2d4f0 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e  _count;.  extern
2d500 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6e 74   int sqlite3_int
2d510 65 72 72 75 70 74 5f 63 6f 75 6e 74 3b 0a 20 20  errupt_count;.  
2d520 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
2d530 65 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75  e3_open_file_cou
2d540 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  nt;.  extern int
2d550 20 73 71 6c 69 74 65 33 5f 73 6f 72 74 5f 63 6f   sqlite3_sort_co
2d560 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  unt;.  extern in
2d570 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  t sqlite3_curren
2d580 74 5f 74 69 6d 65 3b 0a 23 69 66 20 53 51 4c 49  t_time;.#if SQLI
2d590 54 45 5f 4f 53 5f 55 4e 49 58 20 26 26 20 64 65  TE_OS_UNIX && de
2d5a0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2d5b0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
2d5c0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2d5d0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
2d5e0 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 3b  ite3_hostid_num;
2d5f0 0a 23 65 6e 64 69 66 0a 20 20 65 78 74 65 72 6e  .#endif.  extern
2d600 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 61 78   int sqlite3_max
2d610 5f 62 6c 6f 62 73 69 7a 65 3b 0a 20 20 65 78 74  _blobsize;.  ext
2d620 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 42  ern int sqlite3B
2d630 74 72 65 65 53 68 61 72 65 64 43 61 63 68 65 52  treeSharedCacheR
2d640 65 70 6f 72 74 28 76 6f 69 64 2a 2c 0a 20 20 20  eport(void*,.   
2d650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d670 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 74 65 72         Tcl_Inter
2d680 70 2a 2c 69 6e 74 2c 54 63 6c 5f 4f 62 6a 2a 43  p*,int,Tcl_Obj*C
2d690 4f 4e 53 54 2a 29 3b 0a 20 20 73 74 61 74 69 63  ONST*);.  static
2d6a0 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63   struct {.     c
2d6b0 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
2d6c0 20 54 63 6c 5f 43 6d 64 50 72 6f 63 20 2a 78 50   Tcl_CmdProc *xP
2d6d0 72 6f 63 3b 0a 20 20 7d 20 61 43 6d 64 5b 5d 20  roc;.  } aCmd[] 
2d6e0 3d 20 7b 0a 20 20 20 20 20 7b 20 22 64 62 5f 65  = {.     { "db_e
2d6f0 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20 20 20  nter",          
2d700 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
2d710 5f 43 6d 64 50 72 6f 63 2a 29 64 62 5f 65 6e 74  _CmdProc*)db_ent
2d720 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  er              
2d730 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 62 5f 6c   },.     { "db_l
2d740 65 61 76 65 22 2c 20 20 20 20 20 20 20 20 20 20  eave",          
2d750 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
2d760 5f 43 6d 64 50 72 6f 63 2a 29 64 62 5f 6c 65 61  _CmdProc*)db_lea
2d770 76 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ve              
2d780 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2d790 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 22  te3_mprintf_int"
2d7a0 2c 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c  ,           (Tcl
2d7b0 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65  _CmdProc*)sqlite
2d7c0 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 20 20 20  3_mprintf_int   
2d7d0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2d7e0 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36  te3_mprintf_int6
2d7f0 34 22 2c 20 20 20 20 20 20 20 20 20 28 54 63 6c  4",         (Tcl
2d800 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65  _CmdProc*)sqlite
2d810 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 20  3_mprintf_int64 
2d820 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2d830 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67  te3_mprintf_long
2d840 22 2c 20 20 20 20 20 20 20 20 20 20 28 54 63 6c  ",          (Tcl
2d850 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65  _CmdProc*)sqlite
2d860 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67 20 20  3_mprintf_long  
2d870 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2d880 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 22  te3_mprintf_str"
2d890 2c 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c  ,           (Tcl
2d8a0 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65  _CmdProc*)sqlite
2d8b0 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 20 20 20  3_mprintf_str   
2d8c0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2d8d0 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72  te3_snprintf_str
2d8e0 22 2c 20 20 20 20 20 20 20 20 20 20 28 54 63 6c  ",          (Tcl
2d8f0 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65  _CmdProc*)sqlite
2d900 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72 20 20  3_snprintf_str  
2d910 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2d920 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f  te3_mprintf_stro
2d930 6e 6c 79 22 2c 20 20 20 20 20 20 20 28 54 63 6c  nly",       (Tcl
2d940 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65  _CmdProc*)sqlite
2d950 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c  3_mprintf_stronl
2d960 79 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  y},.     { "sqli
2d970 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62  te3_mprintf_doub
2d980 6c 65 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c  le",        (Tcl
2d990 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65  _CmdProc*)sqlite
2d9a0 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65  3_mprintf_double
2d9b0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2d9c0 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c  te3_mprintf_scal
2d9d0 65 64 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c  ed",        (Tcl
2d9e0 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65  _CmdProc*)sqlite
2d9f0 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65 64  3_mprintf_scaled
2da00 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2da10 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64  te3_mprintf_hexd
2da20 6f 75 62 6c 65 22 2c 20 20 20 28 54 63 6c 5f 43  ouble",   (Tcl_C
2da30 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
2da40 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c  mprintf_hexdoubl
2da50 65 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  e},.     { "sqli
2da60 74 65 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f 74 65  te3_mprintf_z_te
2da70 73 74 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c  st",        (Tcl
2da80 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6d  _CmdProc*)test_m
2da90 70 72 69 6e 74 66 5f 7a 20 20 20 20 20 20 20 20  printf_z        
2daa0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2dab0 65 33 5f 6d 70 72 69 6e 74 66 5f 6e 5f 74 65 73  e3_mprintf_n_tes
2dac0 74 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f  t",        (Tcl_
2dad0 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6d 70  CmdProc*)test_mp
2dae0 72 69 6e 74 66 5f 6e 20 20 20 20 20 20 20 20 7d  rintf_n        }
2daf0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2db00 33 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74 22 2c  3_snprintf_int",
2db10 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
2db20 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 73 6e 70  mdProc*)test_snp
2db30 72 69 6e 74 66 5f 69 6e 74 20 20 20 20 20 7d 2c  rintf_int     },
2db40 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2db50 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
2db60 69 64 22 2c 20 20 20 20 20 28 54 63 6c 5f 43 6d  id",     (Tcl_Cm
2db70 64 50 72 6f 63 2a 29 74 65 73 74 5f 6c 61 73 74  dProc*)test_last
2db80 5f 72 6f 77 69 64 20 20 20 20 20 20 20 7d 2c 0a  _rowid       },.
2db90 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2dba0 65 78 65 63 5f 70 72 69 6e 74 66 22 2c 20 20 20  exec_printf",   
2dbb0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
2dbc0 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 5f  Proc*)test_exec_
2dbd0 70 72 69 6e 74 66 20 20 20 20 20 20 7d 2c 0a 20  printf      },. 
2dbe0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
2dbf0 78 65 63 5f 68 65 78 22 2c 20 20 20 20 20 20 20  xec_hex",       
2dc00 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
2dc10 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 5f 68  roc*)test_exec_h
2dc20 65 78 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  ex         },.  
2dc30 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78     { "sqlite3_ex
2dc40 65 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ec",            
2dc50 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
2dc60 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 20 20 20  oc*)test_exec   
2dc70 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2dc80 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 65    { "sqlite3_exe
2dc90 63 5f 6e 72 22 2c 20 20 20 20 20 20 20 20 20 20  c_nr",          
2dca0 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
2dcb0 63 2a 29 74 65 73 74 5f 65 78 65 63 5f 6e 72 20  c*)test_exec_nr 
2dcc0 20 20 20 20 20 20 20 20 20 7d 2c 0a 23 69 66 6e           },.#ifn
2dcd0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2dce0 47 45 54 5f 54 41 42 4c 45 0a 20 20 20 20 20 7b  GET_TABLE.     {
2dcf0 20 22 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61   "sqlite3_get_ta
2dd00 62 6c 65 5f 70 72 69 6e 74 66 22 2c 20 20 20 20  ble_printf",    
2dd10 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
2dd20 74 65 73 74 5f 67 65 74 5f 74 61 62 6c 65 5f 70  test_get_table_p
2dd30 72 69 6e 74 66 20 7d 2c 0a 23 65 6e 64 69 66 0a  rintf },.#endif.
2dd40 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2dd50 63 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20 20  close",         
2dd60 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
2dd70 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 74 65 73  Proc*)sqlite_tes
2dd80 74 5f 63 6c 6f 73 65 20 20 20 20 20 7d 2c 0a 20  t_close     },. 
2dd90 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
2dda0 6c 6f 73 65 5f 76 32 22 2c 20 20 20 20 20 20 20  lose_v2",       
2ddb0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
2ddc0 72 6f 63 2a 29 73 71 6c 69 74 65 5f 74 65 73 74  roc*)sqlite_test
2ddd0 5f 63 6c 6f 73 65 5f 76 32 20 20 7d 2c 0a 20 20  _close_v2  },.  
2dde0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72     { "sqlite3_cr
2ddf0 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 22 2c 20  eate_function", 
2de00 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
2de10 6f 63 2a 29 74 65 73 74 5f 63 72 65 61 74 65 5f  oc*)test_create_
2de20 66 75 6e 63 74 69 6f 6e 20 20 7d 2c 0a 20 20 20  function  },.   
2de30 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65    { "sqlite3_cre
2de40 61 74 65 5f 61 67 67 72 65 67 61 74 65 22 2c 20  ate_aggregate", 
2de50 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
2de60 63 2a 29 74 65 73 74 5f 63 72 65 61 74 65 5f 61  c*)test_create_a
2de70 67 67 72 65 67 61 74 65 20 7d 2c 0a 20 20 20 20  ggregate },.    
2de80 20 7b 20 22 73 71 6c 69 74 65 5f 72 65 67 69 73   { "sqlite_regis
2de90 74 65 72 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f  ter_test_functio
2dea0 6e 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63  n", (Tcl_CmdProc
2deb0 2a 29 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f  *)test_register_
2dec0 66 75 6e 63 20 20 20 20 7d 2c 0a 20 20 20 20 20  func    },.     
2ded0 7b 20 22 73 71 6c 69 74 65 5f 61 62 6f 72 74 22  { "sqlite_abort"
2dee0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2def0 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
2df00 29 73 71 6c 69 74 65 5f 61 62 6f 72 74 20 20 20  )sqlite_abort   
2df10 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
2df20 20 22 73 71 6c 69 74 65 5f 62 69 6e 64 22 2c 20   "sqlite_bind", 
2df30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df40 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
2df50 74 65 73 74 5f 62 69 6e 64 20 20 20 20 20 20 20  test_bind       
2df60 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
2df70 22 62 72 65 61 6b 70 6f 69 6e 74 22 2c 20 20 20  "breakpoint",   
2df80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df90 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
2dfa0 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 20 20  est_breakpoint  
2dfb0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
2dfc0 73 71 6c 69 74 65 33 5f 6b 65 79 22 2c 20 20 20  sqlite3_key",   
2dfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dfe0 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
2dff0 73 74 5f 6b 65 79 20 20 20 20 20 20 20 20 20 20  st_key          
2e000 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
2e010 71 6c 69 74 65 33 5f 72 65 6b 65 79 22 2c 20 20  qlite3_rekey",  
2e020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2e030 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
2e040 74 5f 72 65 6b 65 79 20 20 20 20 20 20 20 20 20  t_rekey         
2e050 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
2e060 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 22 2c  lite_set_magic",
2e070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
2e080 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
2e090 74 65 5f 73 65 74 5f 6d 61 67 69 63 20 20 20 20  te_set_magic    
2e0a0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2e0b0 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 22 2c  ite3_interrupt",
2e0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
2e0d0 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
2e0e0 69 6e 74 65 72 72 75 70 74 20 20 20 20 20 20 20  interrupt       
2e0f0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2e100 74 65 5f 64 65 6c 65 74 65 5f 66 75 6e 63 74 69  te_delete_functi
2e110 6f 6e 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c  on",        (Tcl
2e120 5f 43 6d 64 50 72 6f 63 2a 29 64 65 6c 65 74 65  _CmdProc*)delete
2e130 5f 66 75 6e 63 74 69 6f 6e 20 20 20 20 20 20 20  _function       
2e140 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2e150 65 5f 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69  e_delete_collati
2e160 6f 6e 22 2c 20 20 20 20 20 20 20 28 54 63 6c 5f  on",       (Tcl_
2e170 43 6d 64 50 72 6f 63 2a 29 64 65 6c 65 74 65 5f  CmdProc*)delete_
2e180 63 6f 6c 6c 61 74 69 6f 6e 20 20 20 20 20 20 7d  collation      }
2e190 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2e1a0 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74  3_get_autocommit
2e1b0 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43  ",        (Tcl_C
2e1c0 6d 64 50 72 6f 63 2a 29 67 65 74 5f 61 75 74 6f  mdProc*)get_auto
2e1d0 63 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 7d 2c  commit        },
2e1e0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2e1f0 5f 73 74 61 63 6b 5f 75 73 65 64 22 2c 20 20 20  _stack_used",   
2e200 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
2e210 64 50 72 6f 63 2a 29 74 65 73 74 5f 73 74 61 63  dProc*)test_stac
2e220 6b 5f 75 73 65 64 20 20 20 20 20 20 20 7d 2c 0a  k_used       },.
2e230 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2e240 62 75 73 79 5f 74 69 6d 65 6f 75 74 22 2c 20 20  busy_timeout",  
2e250 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
2e260 50 72 6f 63 2a 29 74 65 73 74 5f 62 75 73 79 5f  Proc*)test_busy_
2e270 74 69 6d 65 6f 75 74 20 20 20 20 20 7d 2c 0a 20  timeout     },. 
2e280 20 20 20 20 7b 20 22 70 72 69 6e 74 66 22 2c 20      { "printf", 
2e290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e2a0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
2e2b0 72 6f 63 2a 29 74 65 73 74 5f 70 72 69 6e 74 66  roc*)test_printf
2e2c0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2e2d0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 49 6f 54     { "sqlite3IoT
2e2e0 72 61 63 65 22 2c 20 20 20 20 20 20 20 20 20 20  race",          
2e2f0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2e300 2a 29 74 65 73 74 5f 69 6f 5f 74 72 61 63 65 20  *)test_io_trace 
2e310 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
2e320 7b 20 22 63 6c 61 6e 67 5f 73 61 6e 69 74 69 7a  { "clang_sanitiz
2e330 65 5f 61 64 64 72 65 73 73 22 2c 20 20 20 20 20  e_address",     
2e340 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
2e350 29 63 6c 61 6e 67 5f 73 61 6e 69 74 69 7a 65 5f  )clang_sanitize_
2e360 61 64 64 72 65 73 73 20 7d 2c 0a 20 20 7d 3b 0a  address },.  };.
2e370 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20    static struct 
2e380 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  {.     char *zNa
2e390 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f 4f 62 6a  me;.     Tcl_Obj
2e3a0 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b 0a  CmdProc *xProc;.
2e3b0 20 20 20 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e       void *clien
2e3c0 74 44 61 74 61 3b 0a 20 20 7d 20 61 4f 62 6a 43  tData;.  } aObjC
2e3d0 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20  md[] = {.     { 
2e3e0 22 73 71 6c 69 74 65 33 5f 63 6f 6e 6e 65 63 74  "sqlite3_connect
2e3f0 69 6f 6e 5f 70 6f 69 6e 74 65 72 22 2c 20 20 20  ion_pointer",   
2e400 20 67 65 74 5f 73 71 6c 69 74 65 5f 70 6f 69 6e   get_sqlite_poin
2e410 74 65 72 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b  ter, 0 },.     {
2e420 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69   "sqlite3_bind_i
2e430 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  nt",            
2e440 20 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74 2c    test_bind_int,
2e450 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20        0 },.     
2e460 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  { "sqlite3_bind_
2e470 7a 65 72 6f 62 6c 6f 62 22 2c 20 20 20 20 20 20  zeroblob",      
2e480 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 7a 65 72     test_bind_zer
2e490 6f 62 6c 6f 62 2c 20 30 20 7d 2c 0a 20 20 20 20  oblob, 0 },.    
2e4a0 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
2e4b0 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20  _int64",        
2e4c0 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e      test_bind_in
2e4d0 74 36 34 2c 20 20 20 20 30 20 7d 2c 0a 20 20 20  t64,    0 },.   
2e4e0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
2e4f0 64 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20 20 20  d_double",      
2e500 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 64       test_bind_d
2e510 6f 75 62 6c 65 2c 20 20 20 30 20 7d 2c 0a 20 20  ouble,   0 },.  
2e520 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
2e530 6e 64 5f 6e 75 6c 6c 22 2c 20 20 20 20 20 20 20  nd_null",       
2e540 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f        test_bind_
2e550 6e 75 6c 6c 20 20 20 20 20 2c 30 20 7d 2c 0a 20  null     ,0 },. 
2e560 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
2e570 69 6e 64 5f 74 65 78 74 22 2c 20 20 20 20 20 20  ind_text",      
2e580 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64         test_bind
2e590 5f 74 65 78 74 20 20 20 20 20 2c 30 20 7d 2c 0a  _text     ,0 },.
2e5a0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2e5b0 62 69 6e 64 5f 74 65 78 74 31 36 22 2c 20 20 20  bind_text16",   
2e5c0 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e          test_bin
2e5d0 64 5f 74 65 78 74 31 36 20 20 20 2c 30 20 7d 2c  d_text16   ,0 },
2e5e0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2e5f0 5f 62 69 6e 64 5f 62 6c 6f 62 22 2c 20 20 20 20  _bind_blob",    
2e600 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69           test_bi
2e610 6e 64 5f 62 6c 6f 62 20 20 20 20 20 2c 30 20 7d  nd_blob     ,0 }
2e620 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2e630 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
2e640 5f 63 6f 75 6e 74 22 2c 20 20 74 65 73 74 5f 62  _count",  test_b
2e650 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f  ind_parameter_co
2e660 75 6e 74 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20  unt, 0},.     { 
2e670 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61  "sqlite3_bind_pa
2e680 72 61 6d 65 74 65 72 5f 6e 61 6d 65 22 2c 20 20  rameter_name",  
2e690 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d   test_bind_param
2e6a0 65 74 65 72 5f 6e 61 6d 65 2c 20 20 30 7d 2c 0a  eter_name,  0},.
2e6b0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2e6c0 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69  bind_parameter_i
2e6d0 6e 64 65 78 22 2c 20 20 74 65 73 74 5f 62 69 6e  ndex",  test_bin
2e6e0 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65  d_parameter_inde
2e6f0 78 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73  x, 0},.     { "s
2e700 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e  qlite3_clear_bin
2e710 64 69 6e 67 73 22 2c 20 20 20 20 20 20 20 20 74  dings",        t
2e720 65 73 74 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e  est_clear_bindin
2e730 67 73 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22  gs, 0},.     { "
2e740 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 22 2c 20  sqlite3_sleep", 
2e750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e760 74 65 73 74 5f 73 6c 65 65 70 2c 20 20 20 20 20  test_sleep,     
2e770 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20       0},.     { 
2e780 22 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65  "sqlite3_errcode
2e790 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2e7a0 20 74 65 73 74 5f 65 72 72 63 6f 64 65 20 20 20   test_errcode   
2e7b0 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
2e7c0 20 22 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64   "sqlite3_extend
2e7d0 65 64 5f 65 72 72 63 6f 64 65 22 2c 20 20 20 20  ed_errcode",    
2e7e0 20 20 74 65 73 74 5f 65 78 5f 65 72 72 63 6f 64    test_ex_errcod
2e7f0 65 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20  e    ,0 },.     
2e800 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  { "sqlite3_errms
2e810 67 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  g",             
2e820 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67 20 20     test_errmsg  
2e830 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
2e840 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72 6d   { "sqlite3_errm
2e850 73 67 31 36 22 2c 20 20 20 20 20 20 20 20 20 20  sg16",          
2e860 20 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67 31      test_errmsg1
2e870 36 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20  6      ,0 },.   
2e880 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70 65    { "sqlite3_ope
2e890 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  n",             
2e8a0 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e 20 20       test_open  
2e8b0 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20          ,0 },.  
2e8c0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70     { "sqlite3_op
2e8d0 65 6e 31 36 22 2c 20 20 20 20 20 20 20 20 20 20  en16",          
2e8e0 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e 31        test_open1
2e8f0 36 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20  6        ,0 },. 
2e900 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f      { "sqlite3_o
2e910 70 65 6e 5f 76 32 22 2c 20 20 20 20 20 20 20 20  pen_v2",        
2e920 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e         test_open
2e930 5f 76 32 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a  _v2       ,0 },.
2e940 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2e950 63 6f 6d 70 6c 65 74 65 31 36 22 2c 20 20 20 20  complete16",    
2e960 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6d          test_com
2e970 70 6c 65 74 65 31 36 20 20 20 20 2c 30 20 7d 2c  plete16    ,0 },
2e980 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ..     { "sqlite
2e990 33 5f 70 72 65 70 61 72 65 22 2c 20 20 20 20 20  3_prepare",     
2e9a0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 70            test_p
2e9b0 72 65 70 61 72 65 20 20 20 20 20 20 20 2c 30 20  repare       ,0 
2e9c0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2e9d0 65 33 5f 70 72 65 70 61 72 65 31 36 22 2c 20 20  e3_prepare16",  
2e9e0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
2e9f0 70 72 65 70 61 72 65 31 36 20 20 20 20 20 2c 30  prepare16     ,0
2ea00 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2ea10 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 22 2c  te3_prepare_v2",
2ea20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
2ea30 5f 70 72 65 70 61 72 65 5f 76 32 20 20 20 20 2c  _prepare_v2    ,
2ea40 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
2ea50 69 74 65 33 5f 70 72 65 70 61 72 65 5f 74 6b 74  ite3_prepare_tkt
2ea60 33 31 33 34 22 2c 20 20 20 20 20 20 20 74 65 73  3134",       tes
2ea70 74 5f 70 72 65 70 61 72 65 5f 74 6b 74 33 31 33  t_prepare_tkt313
2ea80 34 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73  4, 0},.     { "s
2ea90 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36  qlite3_prepare16
2eaa0 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20 20 74  _v2",          t
2eab0 65 73 74 5f 70 72 65 70 61 72 65 31 36 5f 76 32  est_prepare16_v2
2eac0 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
2ead0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
2eae0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2eaf0 74 65 73 74 5f 66 69 6e 61 6c 69 7a 65 20 20 20  test_finalize   
2eb00 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
2eb10 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74  "sqlite3_stmt_st
2eb20 61 74 75 73 22 2c 20 20 20 20 20 20 20 20 20 20  atus",          
2eb30 20 74 65 73 74 5f 73 74 6d 74 5f 73 74 61 74 75   test_stmt_statu
2eb40 73 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  s   ,0 },.     {
2eb50 20 22 73 71 6c 69 74 65 33 5f 72 65 73 65 74 22   "sqlite3_reset"
2eb60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2eb70 20 20 74 65 73 74 5f 72 65 73 65 74 20 20 20 20    test_reset    
2eb80 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
2eb90 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 70 69 72  { "sqlite3_expir
2eba0 65 64 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ed",            
2ebb0 20 20 20 74 65 73 74 5f 65 78 70 69 72 65 64 20     test_expired 
2ebc0 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
2ebd0 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 72 61 6e   { "sqlite3_tran
2ebe0 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 22 2c 20  sfer_bindings", 
2ebf0 20 20 20 20 74 65 73 74 5f 74 72 61 6e 73 66 65      test_transfe
2ec00 72 5f 62 69 6e 64 20 2c 30 20 7d 2c 0a 20 20 20  r_bind ,0 },.   
2ec10 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 68 61    { "sqlite3_cha
2ec20 6e 67 65 73 22 2c 20 20 20 20 20 20 20 20 20 20  nges",          
2ec30 20 20 20 20 20 74 65 73 74 5f 63 68 61 6e 67 65       test_change
2ec40 73 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  s       ,0 },.  
2ec50 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 74     { "sqlite3_st
2ec60 65 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ep",            
2ec70 20 20 20 20 20 20 74 65 73 74 5f 73 74 65 70 20        test_step 
2ec80 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20           ,0 },. 
2ec90 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73      { "sqlite3_s
2eca0 71 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ql",            
2ecb0 20 20 20 20 20 20 20 74 65 73 74 5f 73 71 6c 20         test_sql 
2ecc0 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a            ,0 },.
2ecd0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2ece0 6e 65 78 74 5f 73 74 6d 74 22 2c 20 20 20 20 20  next_stmt",     
2ecf0 20 20 20 20 20 20 20 20 74 65 73 74 5f 6e 65 78          test_nex
2ed00 74 5f 73 74 6d 74 20 20 20 20 20 2c 30 20 7d 2c  t_stmt     ,0 },
2ed10 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2ed20 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 22 2c  _stmt_readonly",
2ed30 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 74           test_st
2ed40 6d 74 5f 72 65 61 64 6f 6e 6c 79 20 2c 30 20 7d  mt_readonly ,0 }
2ed50 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2ed60 33 5f 73 74 6d 74 5f 62 75 73 79 22 2c 20 20 20  3_stmt_busy",   
2ed70 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 73            test_s
2ed80 74 6d 74 5f 62 75 73 79 20 20 20 20 20 2c 30 20  tmt_busy     ,0 
2ed90 7d 2c 0a 20 20 20 20 20 7b 20 22 75 73 65 73 5f  },.     { "uses_
2eda0 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 22 2c 20 20  stmt_journal",  
2edb0 20 20 20 20 20 20 20 20 20 20 20 75 73 65 73 5f             uses_
2edc0 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 20 2c 30 20  stmt_journal ,0 
2edd0 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  },..     { "sqli
2ede0 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  te3_release_memo
2edf0 72 79 22 2c 20 20 20 20 20 20 20 20 74 65 73 74  ry",        test
2ee00 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 2c  _release_memory,
2ee10 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20       0},.     { 
2ee20 22 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65  "sqlite3_db_rele
2ee30 61 73 65 5f 6d 65 6d 6f 72 79 22 2c 20 20 20 20  ase_memory",    
2ee40 20 74 65 73 74 5f 64 62 5f 72 65 6c 65 61 73 65   test_db_release
2ee50 5f 6d 65 6d 6f 72 79 2c 20 20 30 7d 2c 0a 20 20  _memory,  0},.  
2ee60 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 64 62     { "sqlite3_db
2ee70 5f 66 69 6c 65 6e 61 6d 65 22 2c 20 20 20 20 20  _filename",     
2ee80 20 20 20 20 20 20 74 65 73 74 5f 64 62 5f 66 69        test_db_fi
2ee90 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 30  lename,        0
2eea0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2eeb0 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 22 2c  e3_db_readonly",
2eec0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
2eed0 64 62 5f 72 65 61 64 6f 6e 6c 79 2c 20 20 20 20  db_readonly,    
2eee0 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22      0},.     { "
2eef0 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61  sqlite3_soft_hea
2ef00 70 5f 6c 69 6d 69 74 22 2c 20 20 20 20 20 20 20  p_limit",       
2ef10 74 65 73 74 5f 73 6f 66 74 5f 68 65 61 70 5f 6c  test_soft_heap_l
2ef20 69 6d 69 74 2c 20 20 20 20 30 7d 2c 0a 20 20 20  imit,    0},.   
2ef30 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 68 72    { "sqlite3_thr
2ef40 65 61 64 5f 63 6c 65 61 6e 75 70 22 2c 20 20 20  ead_cleanup",   
2ef50 20 20 20 20 20 74 65 73 74 5f 74 68 72 65 61 64       test_thread
2ef60 5f 63 6c 65 61 6e 75 70 2c 20 20 20 20 20 30 7d  _cleanup,     0}
2ef70 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2ef80 33 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74  3_pager_refcount
2ef90 73 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f 70  s",       test_p
2efa0 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 2c 20  ager_refcounts, 
2efb0 20 20 20 30 7d 2c 0a 0a 20 20 20 20 20 7b 20 22     0},..     { "
2efc0 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74  sqlite3_load_ext
2efd0 65 6e 73 69 6f 6e 22 2c 20 20 20 20 20 20 20 20  ension",        
2efe0 74 65 73 74 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  test_load_extens
2eff0 69 6f 6e 2c 20 20 20 20 20 30 7d 2c 0a 20 20 20  ion,     0},.   
2f000 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 6e 61    { "sqlite3_ena
2f010 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  ble_load_extensi
2f020 6f 6e 22 2c 20 74 65 73 74 5f 65 6e 61 62 6c 65  on", test_enable
2f030 5f 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 30 7d  _load,        0}
2f040 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2f050 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c  3_extended_resul
2f060 74 5f 63 6f 64 65 73 22 2c 20 74 65 73 74 5f 65  t_codes", test_e
2f070 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63  xtended_result_c
2f080 6f 64 65 73 2c 20 30 7d 2c 0a 20 20 20 20 20 7b  odes, 0},.     {
2f090 20 22 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 22   "sqlite3_limit"
2f0a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2f0b0 20 20 74 65 73 74 5f 6c 69 6d 69 74 2c 20 20 20    test_limit,   
2f0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 7d                0}
2f0d0 2c 0a 0a 20 20 20 20 20 7b 20 22 73 61 76 65 5f  ,..     { "save_
2f0e0 70 72 6e 67 5f 73 74 61 74 65 22 2c 20 20 20 20  prng_state",    
2f0f0 20 20 20 20 20 20 20 20 20 20 20 73 61 76 65 5f             save_
2f100 70 72 6e 67 5f 73 74 61 74 65 2c 20 20 20 20 30  prng_state,    0
2f110 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65 73 74   },.     { "rest
2f120 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c  ore_prng_state",
2f130 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73 74              rest
2f140 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20  ore_prng_state, 
2f150 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65 73  0 },.     { "res
2f160 65 74 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c 20  et_prng_state", 
2f170 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73               res
2f180 65 74 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20 20  et_prng_state,  
2f190 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 61   0 },.     { "da
2f1a0 74 61 62 61 73 65 5f 6e 65 76 65 72 5f 63 6f 72  tabase_never_cor
2f1b0 72 75 70 74 22 2c 20 20 20 20 20 20 20 20 64 61  rupt",        da
2f1c0 74 61 62 61 73 65 5f 6e 65 76 65 72 5f 63 6f 72  tabase_never_cor
2f1d0 72 75 70 74 2c 20 30 7d 2c 0a 20 20 20 20 20 7b  rupt, 0},.     {
2f1e0 20 22 64 61 74 61 62 61 73 65 5f 6d 61 79 5f 62   "database_may_b
2f1f0 65 5f 63 6f 72 72 75 70 74 22 2c 20 20 20 20 20  e_corrupt",     
2f200 20 20 64 61 74 61 62 61 73 65 5f 6d 61 79 5f 62    database_may_b
2f210 65 5f 63 6f 72 72 75 70 74 2c 20 30 7d 2c 0a 20  e_corrupt, 0},. 
2f220 20 20 20 20 7b 20 22 6f 70 74 69 6d 69 7a 61 74      { "optimizat
2f230 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 22 2c 20 20 20  ion_control",   
2f240 20 20 20 20 20 20 20 6f 70 74 69 6d 69 7a 61 74         optimizat
2f250 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 2c 30 7d 2c 0a  ion_control,0},.
2f260 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
2f270 4e 0a 20 20 20 20 20 7b 20 22 6c 6f 63 6b 5f 77  N.     { "lock_w
2f280 69 6e 33 32 5f 66 69 6c 65 22 2c 20 20 20 20 20  in32_file",     
2f290 20 20 20 20 20 20 20 20 20 20 77 69 6e 33 32 5f            win32_
2f2a0 66 69 6c 65 5f 6c 6f 63 6b 2c 20 20 20 20 30 20  file_lock,    0 
2f2b0 7d 2c 0a 20 20 20 20 20 7b 20 22 65 78 69 73 74  },.     { "exist
2f2c0 73 5f 77 69 6e 33 32 5f 70 61 74 68 22 2c 20 20  s_win32_path",  
2f2d0 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 33 32             win32
2f2e0 5f 65 78 69 73 74 73 5f 70 61 74 68 2c 20 20 30  _exists_path,  0
2f2f0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6e 64   },.     { "find
2f300 5f 77 69 6e 33 32 5f 66 69 6c 65 22 2c 20 20 20  _win32_file",   
2f310 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 33              win3
2f320 32 5f 66 69 6e 64 5f 66 69 6c 65 2c 20 20 20 20  2_find_file,    
2f330 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 65 6c  0 },.     { "del
2f340 65 74 65 5f 77 69 6e 33 32 5f 66 69 6c 65 22 2c  ete_win32_file",
2f350 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e               win
2f360 33 32 5f 64 65 6c 65 74 65 5f 66 69 6c 65 2c 20  32_delete_file, 
2f370 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6d 61   0 },.     { "ma
2f380 6b 65 5f 77 69 6e 33 32 5f 64 69 72 22 2c 20 20  ke_win32_dir",  
2f390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
2f3a0 6e 33 32 5f 6d 6b 64 69 72 2c 20 20 20 20 20 20  n32_mkdir,      
2f3b0 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72    0 },.     { "r
2f3c0 65 6d 6f 76 65 5f 77 69 6e 33 32 5f 64 69 72 22  emove_win32_dir"
2f3d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  ,              w
2f3e0 69 6e 33 32 5f 72 6d 64 69 72 2c 20 20 20 20 20  in32_rmdir,     
2f3f0 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 20     0 },.#endif. 
2f400 20 20 20 20 7b 20 22 74 63 6c 5f 6f 62 6a 70 72      { "tcl_objpr
2f410 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  oc",            
2f420 20 20 20 20 20 20 20 72 75 6e 41 73 4f 62 6a 50         runAsObjP
2f430 72 6f 63 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a  roc,       0 },.
2f440 0a 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  .     /* sqlite3
2f450 5f 63 6f 6c 75 6d 6e 5f 2a 28 29 20 41 50 49 20  _column_*() API 
2f460 2a 2f 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  */.     { "sqlit
2f470 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 22  e3_column_count"
2f480 2c 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f  ,          test_
2f490 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 20 2c 30  column_count  ,0
2f4a0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2f4b0 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 22 2c  te3_data_count",
2f4c0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
2f4d0 5f 64 61 74 61 5f 63 6f 75 6e 74 20 20 20 20 2c  _data_count    ,
2f4e0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
2f4f0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
2f500 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ",           tes
2f510 74 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 20 20  t_column_type   
2f520 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
2f530 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
2f540 62 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65  b",           te
2f550 73 74 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20 20  st_column_blob  
2f560 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
2f570 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f  qlite3_column_do
2f580 75 62 6c 65 22 2c 20 20 20 20 20 20 20 20 20 74  uble",         t
2f590 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c  est_column_doubl
2f5a0 65 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22  e ,0 },.     { "
2f5b0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
2f5c0 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 20  nt64",          
2f5d0 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  test_column_int6
2f5e0 34 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20  4  ,0 },.     { 
2f5f0 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
2f600 74 65 78 74 22 2c 20 20 20 74 65 73 74 5f 73 74  text",   test_st
2f610 6d 74 5f 75 74 66 38 2c 20 20 28 76 6f 69 64 2a  mt_utf8,  (void*
2f620 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
2f630 74 65 78 74 20 7d 2c 0a 20 20 20 20 20 7b 20 22  text },.     { "
2f640 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
2f650 61 6d 65 22 2c 20 20 20 74 65 73 74 5f 73 74 6d  ame",   test_stm
2f660 74 5f 75 74 66 38 2c 20 20 28 76 6f 69 64 2a 29  t_utf8,  (void*)
2f670 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
2f680 61 6d 65 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  ame },.     { "s
2f690 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
2f6a0 74 22 2c 20 20 20 20 74 65 73 74 5f 73 74 6d 74  t",    test_stmt
2f6b0 5f 69 6e 74 2c 20 20 20 28 76 6f 69 64 2a 29 73  _int,   (void*)s
2f6c0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
2f6d0 74 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  t  },.     { "sq
2f6e0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
2f6f0 65 73 22 2c 20 20 74 65 73 74 5f 73 74 6d 74 5f  es",  test_stmt_
2f700 69 6e 74 2c 20 20 20 28 76 6f 69 64 2a 29 73 71  int,   (void*)sq
2f710 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
2f720 65 73 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c  es},.#ifndef SQL
2f730 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50  ITE_OMIT_DECLTYP
2f740 45 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  E.     { "sqlite
2f750 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70  3_column_decltyp
2f760 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74 66  e",test_stmt_utf
2f770 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  8,(void*)sqlite3
2f780 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65  _column_decltype
2f790 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  },.#endif.#ifdef
2f7a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
2f7b0 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 7b  OLUMN_METADATA.{
2f7c0 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
2f7d0 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 22 2c  _database_name",
2f7e0 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 28  test_stmt_utf8,(
2f7f0 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f  void*)sqlite3_co
2f800 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61  lumn_database_na
2f810 6d 65 7d 2c 0a 7b 20 22 73 71 6c 69 74 65 33 5f  me},.{ "sqlite3_
2f820 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d  column_table_nam
2f830 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74 66  e",test_stmt_utf
2f840 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  8,(void*)sqlite3
2f850 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61  _column_table_na
2f860 6d 65 7d 2c 0a 7b 20 22 73 71 6c 69 74 65 33 5f  me},.{ "sqlite3_
2f870 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61  column_origin_na
2f880 6d 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74  me",test_stmt_ut
2f890 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65  f8,(void*)sqlite
2f8a0 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f  3_column_origin_
2f8b0 6e 61 6d 65 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23  name},.#endif..#
2f8c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2f8d0 49 54 5f 55 54 46 31 36 0a 20 20 20 20 20 7b 20  IT_UTF16.     { 
2f8e0 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
2f8f0 62 79 74 65 73 31 36 22 2c 20 74 65 73 74 5f 73  bytes16", test_s
2f900 74 6d 74 5f 69 6e 74 2c 20 28 76 6f 69 64 2a 29  tmt_int, (void*)
2f910 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
2f920 79 74 65 73 31 36 20 7d 2c 0a 20 20 20 20 20 7b  ytes16 },.     {
2f930 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
2f940 5f 74 65 78 74 31 36 22 2c 20 20 74 65 73 74 5f  _text16",  test_
2f950 73 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f 69  stmt_utf16, (voi
2f960 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
2f970 6e 5f 74 65 78 74 31 36 7d 2c 0a 20 20 20 20 20  n_text16},.     
2f980 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
2f990 6e 5f 6e 61 6d 65 31 36 22 2c 20 20 74 65 73 74  n_name16",  test
2f9a0 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f  _stmt_utf16, (vo
2f9b0 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  id*)sqlite3_colu
2f9c0 6d 6e 5f 6e 61 6d 65 31 36 7d 2c 0a 20 20 20 20  mn_name16},.    
2f9d0 20 7b 20 22 61 64 64 5f 61 6c 69 67 6e 6d 65 6e   { "add_alignmen
2f9e0 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e  t_test_collation
2f9f0 73 22 2c 20 61 64 64 5f 61 6c 69 67 6e 6d 65 6e  s", add_alignmen
2fa00 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e  t_test_collation
2fa10 73 2c 20 30 20 20 20 20 20 20 7d 2c 0a 23 69 66  s, 0      },.#if
2fa20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2fa30 5f 44 45 43 4c 54 59 50 45 0a 20 20 20 20 20 7b  _DECLTYPE.     {
2fa40 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
2fa50 5f 64 65 63 6c 74 79 70 65 31 36 22 2c 74 65 73  _decltype16",tes
2fa60 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 28 76 6f  t_stmt_utf16,(vo
2fa70 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  id*)sqlite3_colu
2fa80 6d 6e 5f 64 65 63 6c 74 79 70 65 31 36 7d 2c 0a  mn_decltype16},.
2fa90 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
2faa0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
2fab0 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 7b 22 73 71  MN_METADATA.{"sq
2fac0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74  lite3_column_dat
2fad0 61 62 61 73 65 5f 6e 61 6d 65 31 36 22 2c 0a 20  abase_name16",. 
2fae0 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36   test_stmt_utf16
2faf0 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  , (void*)sqlite3
2fb00 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65  _column_database
2fb10 5f 6e 61 6d 65 31 36 7d 2c 0a 7b 22 73 71 6c 69  _name16},.{"sqli
2fb20 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65  te3_column_table
2fb30 5f 6e 61 6d 65 31 36 22 2c 20 74 65 73 74 5f 73  _name16", test_s
2fb40 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f 69 64  tmt_utf16, (void
2fb50 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
2fb60 5f 74 61 62 6c 65 5f 6e 61 6d 65 31 36 7d 2c 0a  _table_name16},.
2fb70 7b 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  {"sqlite3_column
2fb80 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 31 36 22 2c  _origin_name16",
2fb90 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36   test_stmt_utf16
2fba0 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  , (void*)sqlite3
2fbb0 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e  _column_origin_n
2fbc0 61 6d 65 31 36 7d 2c 0a 23 65 6e 64 69 66 0a 23  ame16},.#endif.#
2fbd0 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71  endif.     { "sq
2fbe0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
2fbf0 6c 61 74 69 6f 6e 5f 76 32 22 2c 20 74 65 73 74  lation_v2", test
2fc00 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
2fc10 6e 5f 76 32 2c 20 30 20 7d 2c 0a 20 20 20 20 20  n_v2, 0 },.     
2fc20 7b 20 22 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61  { "sqlite3_globa
2fc30 6c 5f 72 65 63 6f 76 65 72 22 2c 20 20 20 20 20  l_recover",     
2fc40 74 65 73 74 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f  test_global_reco
2fc50 76 65 72 2c 20 30 20 20 20 7d 2c 0a 20 20 20 20  ver, 0   },.    
2fc60 20 7b 20 22 77 6f 72 6b 69 6e 67 5f 36 34 62 69   { "working_64bi
2fc70 74 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20  t_int",         
2fc80 20 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69   working_64bit_i
2fc90 6e 74 2c 20 20 20 30 20 20 20 7d 2c 0a 20 20 20  nt,   0   },.   
2fca0 20 20 7b 20 22 76 66 73 5f 75 6e 6c 69 6e 6b 5f    { "vfs_unlink_
2fcb0 74 65 73 74 22 2c 20 20 20 20 20 20 20 20 20 20  test",          
2fcc0 20 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73    vfs_unlink_tes
2fcd0 74 2c 20 20 20 20 20 30 20 20 20 7d 2c 0a 20 20  t,     0   },.  
2fce0 20 20 20 7b 20 22 76 66 73 5f 69 6e 69 74 66 61     { "vfs_initfa
2fcf0 69 6c 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20  il_test",       
2fd00 20 20 20 76 66 73 5f 69 6e 69 74 66 61 69 6c 5f     vfs_initfail_
2fd10 74 65 73 74 2c 20 20 20 30 20 20 20 7d 2c 0a 20  test,   0   },. 
2fd20 20 20 20 20 7b 20 22 76 66 73 5f 75 6e 72 65 67      { "vfs_unreg
2fd30 69 73 74 65 72 5f 61 6c 6c 22 2c 20 20 20 20 20  ister_all",     
2fd40 20 20 20 20 76 66 73 5f 75 6e 72 65 67 69 73 74      vfs_unregist
2fd50 65 72 5f 61 6c 6c 2c 20 20 30 20 20 20 7d 2c 0a  er_all,  0   },.
2fd60 20 20 20 20 20 7b 20 22 76 66 73 5f 72 65 72 65       { "vfs_rere
2fd70 67 69 73 74 65 72 5f 61 6c 6c 22 2c 20 20 20 20  gister_all",    
2fd80 20 20 20 20 20 76 66 73 5f 72 65 72 65 67 69 73       vfs_reregis
2fd90 74 65 72 5f 61 6c 6c 2c 20 20 30 20 20 20 7d 2c  ter_all,  0   },
2fda0 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f  .     { "file_co
2fdb0 6e 74 72 6f 6c 5f 74 65 73 74 22 2c 20 20 20 20  ntrol_test",    
2fdc0 20 20 20 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72        file_contr
2fdd0 6f 6c 5f 74 65 73 74 2c 20 20 20 30 20 20 20 7d  ol_test,   0   }
2fde0 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63  ,.     { "file_c
2fdf0 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f  ontrol_lasterrno
2fe00 5f 74 65 73 74 22 2c 20 66 69 6c 65 5f 63 6f 6e  _test", file_con
2fe10 74 72 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f 5f 74  trol_lasterrno_t
2fe20 65 73 74 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20  est,  0   },.   
2fe30 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f    { "file_contro
2fe40 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74  l_lockproxy_test
2fe50 22 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  ", file_control_
2fe60 6c 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74 2c 20  lockproxy_test, 
2fe70 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   0   },.     { "
2fe80 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75  file_control_chu
2fe90 6e 6b 73 69 7a 65 5f 74 65 73 74 22 2c 20 66 69  nksize_test", fi
2fea0 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b  le_control_chunk
2feb0 73 69 7a 65 5f 74 65 73 74 2c 20 20 30 20 20 20  size_test,  0   
2fec0 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f  },.     { "file_
2fed0 63 6f 6e 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74  control_sizehint
2fee0 5f 74 65 73 74 22 2c 20 20 66 69 6c 65 5f 63 6f  _test",  file_co
2fef0 6e 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74  ntrol_sizehint_t
2ff00 65 73 74 2c 20 20 20 30 20 20 20 7d 2c 0a 23 69  est,   0   },.#i
2ff10 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a  f SQLITE_OS_WIN.
2ff20 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e       { "file_con
2ff30 74 72 6f 6c 5f 77 69 6e 33 32 5f 61 76 5f 72 65  trol_win32_av_re
2ff40 74 72 79 22 2c 20 66 69 6c 65 5f 63 6f 6e 74 72  try", file_contr
2ff50 6f 6c 5f 77 69 6e 33 32 5f 61 76 5f 72 65 74 72  ol_win32_av_retr
2ff60 79 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20  y,  0   },.     
2ff70 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  { "file_control_
2ff80 77 69 6e 33 32 5f 73 65 74 5f 68 61 6e 64 6c 65  win32_set_handle
2ff90 22 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  ", file_control_
2ffa0 77 69 6e 33 32 5f 73 65 74 5f 68 61 6e 64 6c 65  win32_set_handle
2ffb0 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20  , 0  },.#endif. 
2ffc0 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74      { "file_cont
2ffd0 72 6f 6c 5f 70 65 72 73 69 73 74 5f 77 61 6c 22  rol_persist_wal"
2ffe0 2c 20 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  ,    file_contro
2fff0 6c 5f 70 65 72 73 69 73 74 5f 77 61 6c 2c 20 20  l_persist_wal,  
30000 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b     0   },.     {
30010 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70   "file_control_p
30020 6f 77 65 72 73 61 66 65 5f 6f 76 65 72 77 72 69  owersafe_overwri
30030 74 65 22 2c 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te",file_control
30040 5f 70 6f 77 65 72 73 61 66 65 5f 6f 76 65 72 77  _powersafe_overw
30050 72 69 74 65 2c 30 7d 2c 0a 20 20 20 20 20 7b 20  rite,0},.     { 
30060 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66  "file_control_vf
30070 73 6e 61 6d 65 22 2c 20 20 20 20 20 20 20 20 66  sname",        f
30080 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e  ile_control_vfsn
30090 61 6d 65 2c 20 20 20 20 20 20 20 20 20 30 20 20  ame,         0  
300a0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65   },.     { "file
300b0 5f 63 6f 6e 74 72 6f 6c 5f 74 65 6d 70 66 69 6c  _control_tempfil
300c0 65 6e 61 6d 65 22 2c 20 20 20 66 69 6c 65 5f 63  ename",   file_c
300d0 6f 6e 74 72 6f 6c 5f 74 65 6d 70 66 69 6c 65 6e  ontrol_tempfilen
300e0 61 6d 65 2c 20 20 20 20 30 20 20 20 7d 2c 0a 20  ame,    0   },. 
300f0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 76      { "sqlite3_v
30100 66 73 5f 6c 69 73 74 22 2c 20 20 20 20 20 20 20  fs_list",       
30110 20 20 20 20 76 66 73 5f 6c 69 73 74 2c 20 20 20      vfs_list,   
30120 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20    0   },.     { 
30130 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f  "sqlite3_create_
30140 66 75 6e 63 74 69 6f 6e 5f 76 32 22 2c 20 74 65  function_v2", te
30150 73 74 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  st_create_functi
30160 6f 6e 5f 76 32 2c 20 30 20 7d 2c 0a 0a 20 20 20  on_v2, 0 },..   
30170 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 73 20 66    /* Functions f
30180 72 6f 6d 20 6f 73 2e 68 20 2a 2f 0a 23 69 66 6e  rom os.h */.#ifn
30190 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
301a0 55 54 46 31 36 0a 20 20 20 20 20 7b 20 22 61 64  UTF16.     { "ad
301b0 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c  d_test_collate",
301c0 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c          test_col
301d0 6c 61 74 65 2c 20 30 20 20 20 20 20 20 20 20 20  late, 0         
301e0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64     },.     { "ad
301f0 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e  d_test_collate_n
30200 65 65 64 65 64 22 2c 20 74 65 73 74 5f 63 6f 6c  eeded", test_col
30210 6c 61 74 65 5f 6e 65 65 64 65 64 2c 20 30 20 20  late_needed, 0  
30220 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64     },.     { "ad
30230 64 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22  d_test_function"
30240 2c 20 20 20 20 20 20 20 74 65 73 74 5f 66 75 6e  ,       test_fun
30250 63 74 69 6f 6e 2c 20 30 20 20 20 20 20 20 20 20  ction, 0        
30260 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64     },.     { "ad
30270 64 5f 74 65 73 74 5f 75 74 66 31 36 62 69 6e 5f  d_test_utf16bin_
30280 63 6f 6c 6c 61 74 65 22 2c 20 20 20 20 74 65 73  collate",    tes
30290 74 5f 75 74 66 31 36 62 69 6e 5f 63 6f 6c 6c 61  t_utf16bin_colla
302a0 74 65 2c 20 30 20 20 20 20 20 20 20 20 7d 2c 0a  te, 0        },.
302b0 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73  #endif.     { "s
302c0 71 6c 69 74 65 33 5f 74 65 73 74 5f 65 72 72 73  qlite3_test_errs
302d0 74 72 22 2c 20 20 20 20 20 74 65 73 74 5f 65 72  tr",     test_er
302e0 72 73 74 72 2c 20 30 20 20 20 20 20 20 20 20 20  rstr, 0         
302f0 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 74      },.     { "t
30300 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79 70 65  cl_variable_type
30310 22 2c 20 20 20 20 20 20 20 74 63 6c 5f 76 61 72  ",       tcl_var
30320 69 61 62 6c 65 5f 74 79 70 65 2c 20 30 20 20 20  iable_type, 0   
30330 20 20 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53      },.#ifndef S
30340 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
30350 44 5f 43 41 43 48 45 0a 20 20 20 20 20 7b 20 22  D_CACHE.     { "
30360 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73  sqlite3_enable_s
30370 68 61 72 65 64 5f 63 61 63 68 65 22 2c 20 74 65  hared_cache", te
30380 73 74 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64  st_enable_shared
30390 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  , 0  },.     { "
303a0 73 71 6c 69 74 65 33 5f 73 68 61 72 65 64 5f 63  sqlite3_shared_c
303b0 61 63 68 65 5f 72 65 70 6f 72 74 22 2c 20 73 71  ache_report", sq
303c0 6c 69 74 65 33 42 74 72 65 65 53 68 61 72 65 64  lite3BtreeShared
303d0 43 61 63 68 65 52 65 70 6f 72 74 2c 20 30 7d 2c  CacheReport, 0},
303e0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22  .#endif.     { "
303f0 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
30400 6f 6e 5f 6e 75 6d 62 65 72 22 2c 20 74 65 73 74  on_number", test
30410 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62  _libversion_numb
30420 65 72 2c 20 30 20 20 7d 2c 0a 23 69 66 64 65 66  er, 0  },.#ifdef
30430 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
30440 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
30450 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74      { "sqlite3_t
30460 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61  able_column_meta
30470 64 61 74 61 22 2c 20 74 65 73 74 5f 74 61 62 6c  data", test_tabl
30480 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
30490 61 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a  a, 0  },.#endif.
304a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
304b0 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
304c0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 6c 6f    { "sqlite3_blo
304d0 62 5f 72 65 6f 70 65 6e 22 2c 20 74 65 73 74 5f  b_reopen", test_
304e0 62 6c 6f 62 5f 72 65 6f 70 65 6e 2c 20 30 20 20  blob_reopen, 0  
304f0 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b  },.#endif.     {
30500 20 22 70 63 61 63 68 65 5f 73 74 61 74 73 22 2c   "pcache_stats",
30510 20 20 20 20 20 20 20 74 65 73 74 5f 70 63 61 63         test_pcac
30520 68 65 5f 73 74 61 74 73 2c 20 30 20 20 7d 2c 0a  he_stats, 0  },.
30530 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
30540 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49  ABLE_UNLOCK_NOTI
30550 46 59 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  FY.     { "sqlit
30560 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  e3_unlock_notify
30570 22 2c 20 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e  ", test_unlock_n
30580 6f 74 69 66 79 2c 20 30 20 20 7d 2c 0a 23 65 6e  otify, 0  },.#en
30590 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  dif.     { "sqli
305a0 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
305b0 6e 74 22 2c 20 20 20 74 65 73 74 5f 77 61 6c 5f  nt",   test_wal_
305c0 63 68 65 63 6b 70 6f 69 6e 74 2c 20 30 20 20 7d  checkpoint, 0  }
305d0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
305e0 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
305f0 5f 76 32 22 2c 74 65 73 74 5f 77 61 6c 5f 63 68  _v2",test_wal_ch
30600 65 63 6b 70 6f 69 6e 74 5f 76 32 2c 20 30 20 20  eckpoint_v2, 0  
30610 7d 2c 0a 20 20 20 20 20 7b 20 22 74 65 73 74 5f  },.     { "test_
30620 73 71 6c 69 74 65 33 5f 6c 6f 67 22 2c 20 20 20  sqlite3_log",   
30630 20 20 20 20 20 20 74 65 73 74 5f 73 71 6c 69 74        test_sqlit
30640 65 33 5f 6c 6f 67 2c 20 30 20 20 7d 2c 0a 23 69  e3_log, 0  },.#i
30650 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
30660 54 5f 45 58 50 4c 41 49 4e 0a 20 20 20 20 20 7b  T_EXPLAIN.     {
30670 20 22 70 72 69 6e 74 5f 65 78 70 6c 61 69 6e 5f   "print_explain_
30680 71 75 65 72 79 5f 70 6c 61 6e 22 2c 20 74 65 73  query_plan", tes
30690 74 5f 70 72 69 6e 74 5f 65 71 70 2c 20 30 20 20  t_print_eqp, 0  
306a0 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b  },.#endif.     {
306b0 20 22 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63   "sqlite3_test_c
306c0 6f 6e 74 72 6f 6c 22 2c 20 74 65 73 74 5f 74 65  ontrol", test_te
306d0 73 74 5f 63 6f 6e 74 72 6f 6c 20 7d 2c 0a 23 69  st_control },.#i
306e0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58  f SQLITE_OS_UNIX
306f0 0a 20 20 20 20 20 7b 20 22 67 65 74 72 75 73 61  .     { "getrusa
30700 67 65 22 2c 20 74 65 73 74 5f 67 65 74 72 75 73  ge", test_getrus
30710 61 67 65 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20  age },.#endif.  
30720 20 20 20 7b 20 22 6c 6f 61 64 5f 73 74 61 74 69     { "load_stati
30730 63 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 20 74 63  c_extension", tc
30740 6c 4c 6f 61 64 53 74 61 74 69 63 45 78 74 65 6e  lLoadStaticExten
30750 73 69 6f 6e 43 6d 64 20 7d 2c 0a 20 20 20 20 20  sionCmd },.     
30760 7b 20 22 73 6f 72 74 65 72 5f 74 65 73 74 5f 66  { "sorter_test_f
30770 61 6b 65 68 65 61 70 22 2c 20 73 6f 72 74 65 72  akeheap", sorter
30780 5f 74 65 73 74 5f 66 61 6b 65 68 65 61 70 20 7d  _test_fakeheap }
30790 2c 0a 20 20 20 20 20 7b 20 22 73 6f 72 74 65 72  ,.     { "sorter
307a0 5f 74 65 73 74 5f 73 6f 72 74 34 5f 68 65 6c 70  _test_sort4_help
307b0 65 72 22 2c 20 73 6f 72 74 65 72 5f 74 65 73 74  er", sorter_test
307c0 5f 73 6f 72 74 34 5f 68 65 6c 70 65 72 20 7d 2c  _sort4_helper },
307d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55  .#ifdef SQLITE_U
307e0 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49  SER_AUTHENTICATI
307f0 4f 4e 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  ON.     { "sqlit
30800 65 33 5f 75 73 65 72 5f 61 75 74 68 65 6e 74 69  e3_user_authenti
30810 63 61 74 65 22 2c 20 74 65 73 74 5f 75 73 65 72  cate", test_user
30820 5f 61 75 74 68 65 6e 74 69 63 61 74 65 2c 20 30  _authenticate, 0
30830 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
30840 74 65 33 5f 75 73 65 72 5f 61 64 64 22 2c 20 20  te3_user_add",  
30850 20 20 20 20 20 20 20 20 74 65 73 74 5f 75 73 65          test_use
30860 72 5f 61 64 64 2c 20 20 20 20 20 20 20 20 20 20  r_add,          
30870 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
30880 69 74 65 33 5f 75 73 65 72 5f 63 68 61 6e 67 65  ite3_user_change
30890 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f 75 73  ",       test_us
308a0 65 72 5f 63 68 61 6e 67 65 2c 20 20 20 20 20 20  er_change,      
308b0 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71   0 },.     { "sq
308c0 6c 69 74 65 33 5f 75 73 65 72 5f 64 65 6c 65 74  lite3_user_delet
308d0 65 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f 75  e",       test_u
308e0 73 65 72 5f 64 65 6c 65 74 65 2c 20 20 20 20 20  ser_delete,     
308f0 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 69    0 },.#endif.#i
30900 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
30910 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54  LE_STMT_SCANSTAT
30920 55 53 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  US.     { "sqlit
30930 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74  e3_stmt_scanstat
30940 75 73 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f  us",       test_
30950 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 2c  stmt_scanstatus,
30960 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22     0 },.     { "
30970 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
30980 6e 73 74 61 74 75 73 5f 72 65 73 65 74 22 2c 20  nstatus_reset", 
30990 74 65 73 74 5f 73 74 6d 74 5f 73 63 61 6e 73 74  test_stmt_scanst
309a0 61 74 75 73 5f 72 65 73 65 74 2c 20 20 20 30 20  atus_reset,   0 
309b0 7d 2c 0a 23 65 6e 64 69 66 0a 0a 20 20 7d 3b 0a  },.#endif..  };.
309c0 20 20 73 74 61 74 69 63 20 69 6e 74 20 62 69 74    static int bit
309d0 6d 61 73 6b 5f 73 69 7a 65 20 3d 20 73 69 7a 65  mask_size = size
309e0 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 3b 0a 20  of(Bitmask)*8;. 
309f0 20 69 6e 74 20 69 3b 0a 20 20 65 78 74 65 72 6e   int i;.  extern
30a00 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e   int sqlite3_syn
30a10 63 5f 63 6f 75 6e 74 2c 20 73 71 6c 69 74 65 33  c_count, sqlite3
30a20 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 3b  _fullsync_count;
30a30 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
30a40 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
30a50 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69  ount;.  extern i
30a60 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f  nt sqlite3_like_
30a70 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20  count;.  extern 
30a80 69 6e 74 20 73 71 6c 69 74 65 33 5f 78 66 65 72  int sqlite3_xfer
30a90 6f 70 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74  opt_count;.  ext
30aa0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
30ab0 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75  pager_readdb_cou
30ac0 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  nt;.  extern int
30ad0 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
30ae0 72 69 74 65 64 62 5f 63 6f 75 6e 74 3b 0a 20 20  ritedb_count;.  
30af0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
30b00 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
30b10 63 6f 75 6e 74 3b 0a 23 69 66 20 53 51 4c 49 54  count;.#if SQLIT
30b20 45 5f 4f 53 5f 57 49 4e 0a 20 20 65 78 74 65 72  E_OS_WIN.  exter
30b30 6e 20 4c 4f 4e 47 20 76 6f 6c 61 74 69 6c 65 20  n LONG volatile 
30b40 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 3b  sqlite3_os_type;
30b50 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
30b60 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 65 78  QLITE_DEBUG.  ex
30b70 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
30b80 57 68 65 72 65 54 72 61 63 65 3b 0a 20 20 65 78  WhereTrace;.  ex
30b90 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
30ba0 4f 53 54 72 61 63 65 3b 0a 20 20 65 78 74 65 72  OSTrace;.  exter
30bb0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 57 61 6c  n int sqlite3Wal
30bc0 54 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 23 69  Trace;.#endif.#i
30bd0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
30be0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
30bf0 4e 41 42 4c 45 5f 46 54 53 33 0a 20 20 65 78 74  NABLE_FTS3.  ext
30c00 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
30c10 66 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65  fts3_enable_pare
30c20 6e 74 68 65 73 65 73 3b 0a 23 65 6e 64 69 66 0a  ntheses;.#endif.
30c30 23 65 6e 64 69 66 0a 0a 20 20 66 6f 72 28 69 3d  #endif..  for(i=
30c40 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 43 6d 64  0; i<sizeof(aCmd
30c50 29 2f 73 69 7a 65 6f 66 28 61 43 6d 64 5b 30 5d  )/sizeof(aCmd[0]
30c60 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c  ); i++){.    Tcl
30c70 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69  _CreateCommand(i
30c80 6e 74 65 72 70 2c 20 61 43 6d 64 5b 69 5d 2e 7a  nterp, aCmd[i].z
30c90 4e 61 6d 65 2c 20 61 43 6d 64 5b 69 5d 2e 78 50  Name, aCmd[i].xP
30ca0 72 6f 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  roc, 0, 0);.  }.
30cb0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
30cc0 65 6f 66 28 61 4f 62 6a 43 6d 64 29 2f 73 69 7a  eof(aObjCmd)/siz
30cd0 65 6f 66 28 61 4f 62 6a 43 6d 64 5b 30 5d 29 3b  eof(aObjCmd[0]);
30ce0 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43   i++){.    Tcl_C
30cf0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
30d00 69 6e 74 65 72 70 2c 20 61 4f 62 6a 43 6d 64 5b  interp, aObjCmd[
30d10 69 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20  i].zName, .     
30d20 20 20 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 78 50     aObjCmd[i].xP
30d30 72 6f 63 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e  roc, aObjCmd[i].
30d40 63 6c 69 65 6e 74 44 61 74 61 2c 20 30 29 3b 0a  clientData, 0);.
30d50 20 20 7d 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61    }.  Tcl_LinkVa
30d60 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
30d70 65 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 22 2c  e_search_count",
30d80 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26   .      (char*)&
30d90 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
30da0 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
30db0 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
30dc0 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
30dd0 74 65 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74 22 2c  te_found_count",
30de0 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26   .      (char*)&
30df0 73 71 6c 69 74 65 33 5f 66 6f 75 6e 64 5f 63 6f  sqlite3_found_co
30e00 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  unt, TCL_LINK_IN
30e10 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  T);.  Tcl_LinkVa
30e20 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
30e30 65 5f 73 6f 72 74 5f 63 6f 75 6e 74 22 2c 20 0a  e_sort_count", .
30e40 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
30e50 6c 69 74 65 33 5f 73 6f 72 74 5f 63 6f 75 6e 74  lite3_sort_count
30e60 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
30e70 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
30e80 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f  nterp, "sqlite3_
30e90 6d 61 78 5f 62 6c 6f 62 73 69 7a 65 22 2c 20 0a  max_blobsize", .
30ea0 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
30eb0 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69  lite3_max_blobsi
30ec0 7a 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  ze, TCL_LINK_INT
30ed0 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
30ee0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
30ef0 5f 6c 69 6b 65 5f 63 6f 75 6e 74 22 2c 20 0a 20  _like_count", . 
30f00 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
30f10 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 2c  ite3_like_count,
30f20 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
30f30 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
30f40 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 69 6e  terp, "sqlite_in
30f50 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 22 2c 20  terrupt_count", 
30f60 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
30f70 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
30f80 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b  _count, TCL_LINK
30f90 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e  _INT);.  Tcl_Lin
30fa0 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
30fb0 6c 69 74 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63  lite_open_file_c
30fc0 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63  ount", .      (c
30fd0 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 70  har*)&sqlite3_op
30fe0 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 2c 20 54  en_file_count, T
30ff0 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
31000 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
31010 72 70 2c 20 22 73 71 6c 69 74 65 5f 63 75 72 72  rp, "sqlite_curr
31020 65 6e 74 5f 74 69 6d 65 22 2c 20 0a 20 20 20 20  ent_time", .    
31030 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
31040 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 2c 20  3_current_time, 
31050 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23  TCL_LINK_INT);.#
31060 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49  if SQLITE_OS_UNI
31070 58 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  X && defined(__A
31080 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
31090 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
310a0 5f 53 54 59 4c 45 0a 20 20 54 63 6c 5f 4c 69 6e  _STYLE.  Tcl_Lin
310b0 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
310c0 6c 69 74 65 5f 68 6f 73 74 69 64 5f 6e 75 6d 22  lite_hostid_num"
310d0 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  , .      (char*)
310e0 26 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f  &sqlite3_hostid_
310f0 6e 75 6d 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  num, TCL_LINK_IN
31100 54 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 63 6c  T);.#endif.  Tcl
31110 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
31120 20 22 73 71 6c 69 74 65 33 5f 78 66 65 72 6f 70   "sqlite3_xferop
31130 74 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20  t_count",.      
31140 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
31150 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 2c 20 54  xferopt_count, T
31160 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
31170 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
31180 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 70 61 67  rp, "sqlite3_pag
31190 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 22  er_readdb_count"
311a0 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
311b0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
311c0 61 64 64 62 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  addb_count, TCL_
311d0 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
311e0 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
311f0 20 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f   "sqlite3_pager_
31200 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 22 2c 0a  writedb_count",.
31210 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
31220 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
31230 65 64 62 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c  edb_count, TCL_L
31240 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f  INK_INT);.  Tcl_
31250 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
31260 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77  "sqlite3_pager_w
31270 72 69 74 65 6a 5f 63 6f 75 6e 74 22 2c 0a 20 20  ritej_count",.  
31280 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
31290 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a  te3_pager_writej
312a0 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b  _count, TCL_LINK
312b0 5f 49 4e 54 29 3b 0a 23 69 66 6e 64 65 66 20 53  _INT);.#ifndef S
312c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
312d0 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
312e0 6e 74 65 72 70 2c 20 22 75 6e 61 6c 69 67 6e 65  nterp, "unaligne
312f0 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72  d_string_counter
31300 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
31310 26 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e  &unaligned_strin
31320 67 5f 63 6f 75 6e 74 65 72 2c 20 54 43 4c 5f 4c  g_counter, TCL_L
31330 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66  INK_INT);.#endif
31340 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
31350 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 54 63 6c  OMIT_UTF16.  Tcl
31360 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
31370 20 22 73 71 6c 69 74 65 5f 6c 61 73 74 5f 6e 65   "sqlite_last_ne
31380 65 64 65 64 5f 63 6f 6c 6c 61 74 69 6f 6e 22 2c  eded_collation",
31390 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 70  .      (char*)&p
313a0 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e  zNeededCollation
313b0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e  , TCL_LINK_STRIN
313c0 47 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f  G|TCL_LINK_READ_
313d0 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69  ONLY);.#endif.#i
313e0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a  f SQLITE_OS_WIN.
313f0 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
31400 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 73  terp, "sqlite_os
31410 5f 74 79 70 65 22 2c 0a 20 20 20 20 20 20 28 63  _type",.      (c
31420 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 73  har*)&sqlite3_os
31430 5f 74 79 70 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  _type, TCL_LINK_
31440 4c 4f 4e 47 29 3b 0a 23 65 6e 64 69 66 0a 23 69  LONG);.#endif.#i
31450 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
31460 0a 20 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20  .  {.    static 
31470 63 6f 6e 73 74 20 63 68 61 72 20 2a 71 75 65 72  const char *quer
31480 79 5f 70 6c 61 6e 20 3d 20 22 2a 2a 2a 20 4f 42  y_plan = "*** OB
31490 53 4f 4c 45 54 45 20 56 41 52 49 41 42 4c 45 20  SOLETE VARIABLE 
314a0 2a 2a 2a 22 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  ***";.    Tcl_Li
314b0 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
314c0 71 6c 69 74 65 5f 71 75 65 72 79 5f 70 6c 61 6e  qlite_query_plan
314d0 22 2c 0a 20 20 20 20 20 20 20 28 63 68 61 72 2a  ",.       (char*
314e0 29 26 71 75 65 72 79 5f 70 6c 61 6e 2c 20 54 43  )&query_plan, TC
314f0 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 7c 54 43  L_LINK_STRING|TC
31500 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59  L_LINK_READ_ONLY
31510 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  );.  }.#endif.#i
31520 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
31530 47 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  G.  Tcl_LinkVar(
31540 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
31550 77 68 65 72 65 5f 74 72 61 63 65 22 2c 0a 20 20  where_trace",.  
31560 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
31570 74 65 33 57 68 65 72 65 54 72 61 63 65 2c 20 54  te3WhereTrace, T
31580 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
31590 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
315a0 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 73 5f 74  rp, "sqlite_os_t
315b0 72 61 63 65 22 2c 0a 20 20 20 20 20 20 28 63 68  race",.      (ch
315c0 61 72 2a 29 26 73 71 6c 69 74 65 33 4f 53 54 72  ar*)&sqlite3OSTr
315d0 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  ace, TCL_LINK_IN
315e0 54 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  T);.#ifndef SQLI
315f0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 54 63  TE_OMIT_WAL.  Tc
31600 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
31610 2c 20 22 73 71 6c 69 74 65 5f 77 61 6c 5f 74 72  , "sqlite_wal_tr
31620 61 63 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61  ace",.      (cha
31630 72 2a 29 26 73 71 6c 69 74 65 33 57 61 6c 54 72  r*)&sqlite3WalTr
31640 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  ace, TCL_LINK_IN
31650 54 29 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69  T);.#endif.#endi
31660 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
31670 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 54  _OMIT_DISKIO.  T
31680 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
31690 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 65 6e 74  p, "sqlite_opent
316a0 65 6d 70 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20  emp_count",.    
316b0 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
316c0 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
316d0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
316e0 0a 23 65 6e 64 69 66 0a 20 20 54 63 6c 5f 4c 69  .#endif.  Tcl_Li
316f0 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
31700 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e  qlite_static_bin
31710 64 5f 76 61 6c 75 65 22 2c 0a 20 20 20 20 20 20  d_value",.      
31720 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 5f 73  (char*)&sqlite_s
31730 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65  tatic_bind_value
31740 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e  , TCL_LINK_STRIN
31750 47 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  G);.  Tcl_LinkVa
31760 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
31770 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62  e_static_bind_nb
31780 79 74 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61  yte",.      (cha
31790 72 2a 29 26 73 71 6c 69 74 65 5f 73 74 61 74 69  r*)&sqlite_stati
317a0 63 5f 62 69 6e 64 5f 6e 62 79 74 65 2c 20 54 43  c_bind_nbyte, TC
317b0 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54  L_LINK_INT);.  T
317c0 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
317d0 70 2c 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f  p, "sqlite_temp_
317e0 64 69 72 65 63 74 6f 72 79 22 2c 0a 20 20 20 20  directory",.    
317f0 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
31800 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
31810 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e  , TCL_LINK_STRIN
31820 47 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  G);.  Tcl_LinkVa
31830 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
31840 65 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  e_data_directory
31850 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
31860 26 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69  &sqlite3_data_di
31870 72 65 63 74 6f 72 79 2c 20 54 43 4c 5f 4c 49 4e  rectory, TCL_LIN
31880 4b 5f 53 54 52 49 4e 47 29 3b 0a 20 20 54 63 6c  K_STRING);.  Tcl
31890 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
318a0 20 22 62 69 74 6d 61 73 6b 5f 73 69 7a 65 22 2c   "bitmask_size",
318b0 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 62  .      (char*)&b
318c0 69 74 6d 61 73 6b 5f 73 69 7a 65 2c 20 54 43 4c  itmask_size, TCL
318d0 5f 4c 49 4e 4b 5f 49 4e 54 7c 54 43 4c 5f 4c 49  _LINK_INT|TCL_LI
318e0 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a 20  NK_READ_ONLY);. 
318f0 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
31900 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 79 6e  erp, "sqlite_syn
31910 63 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20  c_count",.      
31920 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
31930 73 79 6e 63 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  sync_count, TCL_
31940 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
31950 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
31960 20 22 73 71 6c 69 74 65 5f 66 75 6c 6c 73 79 6e   "sqlite_fullsyn
31970 63 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20  c_count",.      
31980 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
31990 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2c 20  fullsync_count, 
319a0 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23  TCL_LINK_INT);.#
319b0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
319c0 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 29 20 26  E_ENABLE_FTS3) &
319d0 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
319e0 5f 54 45 53 54 29 0a 20 20 54 63 6c 5f 4c 69 6e  _TEST).  Tcl_Lin
319f0 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
31a00 6c 69 74 65 5f 66 74 73 33 5f 65 6e 61 62 6c 65  lite_fts3_enable
31a10 5f 70 61 72 65 6e 74 68 65 73 65 73 22 2c 0a 20  _parentheses",. 
31a20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
31a30 69 74 65 33 5f 66 74 73 33 5f 65 6e 61 62 6c 65  ite3_fts3_enable
31a40 5f 70 61 72 65 6e 74 68 65 73 65 73 2c 20 54 43  _parentheses, TC
31a50 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e  L_LINK_INT);.#en
31a60 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  dif.  return TCL
31a70 5f 4f 4b 3b 0a 7d 0a                             _OK;.}.