/ Hex Artifact Content
Login

Artifact 03bcc5724fecac86ea8837e701807a653d82f77d:


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 6e 63 6c 75 64 65 20 22  nt.h".#include "
0240: 76 64 62 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c  vdbeInt.h".#incl
0250: 75 64 65 20 22 74 63 6c 2e 68 22 0a 23 69 6e 63  ude "tcl.h".#inc
0260: 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a  lude <stdlib.h>.
0270: 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67  #include <string
0280: 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .h>../*.** This 
0290: 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
02a0: 20 66 69 72 73 74 20 70 61 72 74 20 6f 66 20 74   first part of t
02b0: 68 65 20 53 71 6c 69 74 65 44 62 20 73 74 72 75  he SqliteDb stru
02c0: 63 74 75 72 65 20 69 6e 20 0a 2a 2a 20 74 63 6c  cture in .** tcl
02d0: 73 71 6c 69 74 65 2e 63 2e 20 20 57 65 20 6e 65  sqlite.c.  We ne
02e0: 65 64 20 69 74 20 68 65 72 65 20 73 6f 20 74 68  ed it here so th
02f0: 61 74 20 74 68 65 20 67 65 74 5f 73 71 6c 69 74  at the get_sqlit
0300: 65 5f 70 6f 69 6e 74 65 72 20 72 6f 75 74 69 6e  e_pointer routin
0310: 65 0a 2a 2a 20 63 61 6e 20 65 78 74 72 61 63 74  e.** can extract
0320: 20 74 68 65 20 73 71 6c 69 74 65 33 2a 20 70 6f   the sqlite3* po
0330: 69 6e 74 65 72 20 66 72 6f 6d 20 61 6e 20 65 78  inter from an ex
0340: 69 73 74 69 6e 67 20 54 63 6c 20 53 51 4c 69 74  isting Tcl SQLit
0350: 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  e.** connection.
0360: 0a 2a 2f 0a 73 74 72 75 63 74 20 53 71 6c 69 74  .*/.struct Sqlit
0370: 65 44 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  eDb {.  sqlite3 
0380: 2a 64 62 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  *db;.};../*.** C
0390: 6f 6e 76 65 72 74 20 74 65 78 74 20 67 65 6e 65  onvert text gene
03a0: 72 61 74 65 64 20 62 79 20 74 68 65 20 22 25 70  rated by the "%p
03b0: 22 20 63 6f 6e 76 65 72 73 69 6f 6e 20 66 6f 72  " conversion for
03c0: 6d 61 74 20 62 61 63 6b 20 69 6e 74 6f 0a 2a 2a  mat back into.**
03d0: 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73   a pointer..*/.s
03e0: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 48 65  tatic int testHe
03f0: 78 54 6f 49 6e 74 28 69 6e 74 20 68 29 7b 0a 20  xToInt(int h){. 
0400: 20 69 66 28 20 68 3e 3d 27 30 27 20 26 26 20 68   if( h>='0' && h
0410: 3c 3d 27 39 27 20 29 7b 0a 20 20 20 20 72 65 74  <='9' ){.    ret
0420: 75 72 6e 20 68 20 2d 20 27 30 27 3b 0a 20 20 7d  urn h - '0';.  }
0430: 65 6c 73 65 20 69 66 28 20 68 3e 3d 27 61 27 20  else if( h>='a' 
0440: 26 26 20 68 3c 3d 27 66 27 20 29 7b 0a 20 20 20  && h<='f' ){.   
0450: 20 72 65 74 75 72 6e 20 68 20 2d 20 27 61 27 20   return h - 'a' 
0460: 2b 20 31 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  + 10;.  }else{. 
0470: 20 20 20 61 73 73 65 72 74 28 20 68 3e 3d 27 41     assert( h>='A
0480: 27 20 26 26 20 68 3c 3d 27 46 27 20 29 3b 0a 20  ' && h<='F' );. 
0490: 20 20 20 72 65 74 75 72 6e 20 68 20 2d 20 27 41     return h - 'A
04a0: 27 20 2b 20 31 30 3b 0a 20 20 7d 0a 7d 0a 76 6f  ' + 10;.  }.}.vo
04b0: 69 64 20 2a 73 71 6c 69 74 65 33 54 65 73 74 54  id *sqlite3TestT
04c0: 65 78 74 54 6f 50 74 72 28 63 6f 6e 73 74 20 63  extToPtr(const c
04d0: 68 61 72 20 2a 7a 29 7b 0a 20 20 76 6f 69 64 20  har *z){.  void 
04e0: 2a 70 3b 0a 20 20 75 36 34 20 76 3b 0a 20 20 75  *p;.  u64 v;.  u
04f0: 33 32 20 76 32 3b 0a 20 20 69 66 28 20 7a 5b 30  32 v2;.  if( z[0
0500: 5d 3d 3d 27 30 27 20 26 26 20 7a 5b 31 5d 3d 3d  ]=='0' && z[1]==
0510: 27 78 27 20 29 7b 0a 20 20 20 20 7a 20 2b 3d 20  'x' ){.    z += 
0520: 32 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 30 3b 0a  2;.  }.  v = 0;.
0530: 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20    while( *z ){. 
0540: 20 20 20 76 20 3d 20 28 76 3c 3c 34 29 20 2b 20     v = (v<<4) + 
0550: 74 65 73 74 48 65 78 54 6f 49 6e 74 28 2a 7a 29  testHexToInt(*z)
0560: 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 7d 0a 20  ;.    z++;.  }. 
0570: 20 69 66 28 20 73 69 7a 65 6f 66 28 70 29 3d 3d   if( sizeof(p)==
0580: 73 69 7a 65 6f 66 28 76 29 20 29 7b 0a 20 20 20  sizeof(v) ){.   
0590: 20 6d 65 6d 63 70 79 28 26 70 2c 20 26 76 2c 20   memcpy(&p, &v, 
05a0: 73 69 7a 65 6f 66 28 70 29 29 3b 0a 20 20 7d 65  sizeof(p));.  }e
05b0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
05c0: 20 73 69 7a 65 6f 66 28 70 29 3d 3d 73 69 7a 65   sizeof(p)==size
05d0: 6f 66 28 76 32 29 20 29 3b 0a 20 20 20 20 76 32  of(v2) );.    v2
05e0: 20 3d 20 28 75 33 32 29 76 3b 0a 20 20 20 20 6d   = (u32)v;.    m
05f0: 65 6d 63 70 79 28 26 70 2c 20 26 76 32 2c 20 73  emcpy(&p, &v2, s
0600: 69 7a 65 6f 66 28 70 29 29 3b 0a 20 20 7d 0a 20  izeof(p));.  }. 
0610: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f   return p;.}.../
0620: 2a 0a 2a 2a 20 41 20 54 43 4c 20 63 6f 6d 6d 61  *.** A TCL comma
0630: 6e 64 20 74 68 61 74 20 72 65 74 75 72 6e 73 20  nd that returns 
0640: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
0650: 68 65 20 73 71 6c 69 74 65 2a 20 70 6f 69 6e 74  he sqlite* point
0660: 65 72 0a 2a 2a 20 66 6f 72 20 61 6e 20 73 71 6c  er.** for an sql
0670: 69 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  ite connection i
0680: 6e 73 74 61 6e 63 65 2e 20 20 42 61 64 20 74 68  nstance.  Bad th
0690: 69 6e 67 73 20 68 61 70 70 65 6e 20 69 66 20 74  ings happen if t
06a0: 68 65 0a 2a 2a 20 69 6e 70 75 74 20 69 73 20 6e  he.** input is n
06b0: 6f 74 20 61 6e 20 73 71 6c 69 74 65 20 63 6f 6e  ot an sqlite con
06c0: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  nection..*/.stat
06d0: 69 63 20 69 6e 74 20 67 65 74 5f 73 71 6c 69 74  ic int get_sqlit
06e0: 65 5f 70 6f 69 6e 74 65 72 28 0a 20 20 76 6f 69  e_pointer(.  voi
06f0: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
0700: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
0710: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
0720: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
0730: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
0740: 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 2a  truct SqliteDb *
0750: 70 3b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f  p;.  Tcl_CmdInfo
0760: 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 63 68 61 72   cmdInfo;.  char
0770: 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 69 66   zBuf[100];.  if
0780: 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
0790: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
07a0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
07b0: 76 2c 20 22 53 51 4c 49 54 45 2d 43 4f 4e 4e 45  v, "SQLITE-CONNE
07c0: 43 54 49 4f 4e 22 29 3b 0a 20 20 20 20 72 65 74  CTION");.    ret
07d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
07e0: 20 7d 0a 20 20 69 66 28 20 21 54 63 6c 5f 47 65   }.  if( !Tcl_Ge
07f0: 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74  tCommandInfo(int
0800: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
0810: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 63 6d  ng(objv[1]), &cm
0820: 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54 63  dInfo) ){.    Tc
0830: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
0840: 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20  nterp, "command 
0850: 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 0a 20 20  not found: ",.  
0860: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74           Tcl_Get
0870: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
0880: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
0890: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
08a0: 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 28 73 74 72  ;.  }.  p = (str
08b0: 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29 63 6d  uct SqliteDb*)cm
08c0: 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44  dInfo.objClientD
08d0: 61 74 61 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a  ata;.  sprintf(z
08e0: 42 75 66 2c 20 22 25 70 22 2c 20 70 2d 3e 64 62  Buf, "%p", p->db
08f0: 29 3b 0a 20 20 69 66 28 20 73 74 72 6e 63 6d 70  );.  if( strncmp
0900: 28 7a 42 75 66 2c 22 30 78 22 2c 32 29 20 29 7b  (zBuf,"0x",2) ){
0910: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
0920: 66 2c 20 22 30 78 25 70 22 2c 20 70 2d 3e 64 62  f, "0x%p", p->db
0930: 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70  );.  }.  Tcl_App
0940: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
0950: 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65  , zBuf, 0);.  re
0960: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
0970: 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 70  /*.** Decode a p
0980: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
0990: 69 74 65 33 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  ite3 object..*/.
09a0: 69 6e 74 20 67 65 74 44 62 50 6f 69 6e 74 65 72  int getDbPointer
09b0: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
09c0: 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  erp, const char 
09d0: 2a 7a 41 2c 20 73 71 6c 69 74 65 33 20 2a 2a 70  *zA, sqlite3 **p
09e0: 70 44 62 29 7b 0a 20 20 73 74 72 75 63 74 20 53  pDb){.  struct S
09f0: 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20 54 63  qliteDb *p;.  Tc
0a00: 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66  l_CmdInfo cmdInf
0a10: 6f 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  o;.  if( Tcl_Get
0a20: 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65  CommandInfo(inte
0a30: 72 70 2c 20 7a 41 2c 20 26 63 6d 64 49 6e 66 6f  rp, zA, &cmdInfo
0a40: 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 73 74  ) ){.    p = (st
0a50: 72 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29 63  ruct SqliteDb*)c
0a60: 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74  mdInfo.objClient
0a70: 44 61 74 61 3b 0a 20 20 20 20 2a 70 70 44 62 20  Data;.    *ppDb 
0a80: 3d 20 70 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65  = p->db;.  }else
0a90: 7b 0a 20 20 20 20 2a 70 70 44 62 20 3d 20 28 73  {.    *ppDb = (s
0aa0: 71 6c 69 74 65 33 2a 29 73 71 6c 69 74 65 33 54  qlite3*)sqlite3T
0ab0: 65 73 74 54 65 78 74 54 6f 50 74 72 28 7a 41 29  estTextToPtr(zA)
0ac0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
0ad0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 63 6f 6e 73 74  CL_OK;.}...const
0ae0: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 54 65   char *sqlite3Te
0af0: 73 74 45 72 72 6f 72 4e 61 6d 65 28 69 6e 74 20  stErrorName(int 
0b00: 72 63 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  rc){.  const cha
0b10: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  r *zName = 0;.  
0b20: 73 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20  switch( rc ){.  
0b30: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4f 4b    case SQLITE_OK
0b40: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
0b50: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0b60: 54 45 5f 4f 4b 22 3b 20 20 20 20 20 20 20 20 20  TE_OK";         
0b70: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0b80: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45 52    case SQLITE_ER
0b90: 52 4f 52 3a 20 20 20 20 20 20 20 20 20 20 20 20  ROR:            
0ba0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0bb0: 54 45 5f 45 52 52 4f 52 22 3b 20 20 20 20 20 20  TE_ERROR";      
0bc0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0bd0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
0be0: 54 45 52 4e 41 4c 3a 20 20 20 20 20 20 20 20 20  TERNAL:         
0bf0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0c00: 54 45 5f 49 4e 54 45 52 4e 41 4c 22 3b 20 20 20  TE_INTERNAL";   
0c10: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0c20: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 45    case SQLITE_PE
0c30: 52 4d 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  RM:             
0c40: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0c50: 54 45 5f 50 45 52 4d 22 3b 20 20 20 20 20 20 20  TE_PERM";       
0c60: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0c70: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42    case SQLITE_AB
0c80: 4f 52 54 3a 20 20 20 20 20 20 20 20 20 20 20 20  ORT:            
0c90: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0ca0: 54 45 5f 41 42 4f 52 54 22 3b 20 20 20 20 20 20  TE_ABORT";      
0cb0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0cc0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55    case SQLITE_BU
0cd0: 53 59 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  SY:             
0ce0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0cf0: 54 45 5f 42 55 53 59 22 3b 20 20 20 20 20 20 20  TE_BUSY";       
0d00: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0d10: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f    case SQLITE_LO
0d20: 43 4b 45 44 3a 20 20 20 20 20 20 20 20 20 20 20  CKED:           
0d30: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0d40: 54 45 5f 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20  TE_LOCKED";     
0d50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0d60: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f    case SQLITE_LO
0d70: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
0d80: 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  :  zName = "SQLI
0d90: 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
0da0: 43 41 43 48 45 22 3b 62 72 65 61 6b 3b 0a 20 20  CACHE";break;.  
0db0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
0dc0: 4d 45 4d 3a 20 20 20 20 20 20 20 20 20 20 20 20  MEM:            
0dd0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0de0: 54 45 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20  TE_NOMEM";      
0df0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0e00: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45    case SQLITE_RE
0e10: 41 44 4f 4e 4c 59 3a 20 20 20 20 20 20 20 20 20  ADONLY:         
0e20: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0e30: 54 45 5f 52 45 41 44 4f 4e 4c 59 22 3b 20 20 20  TE_READONLY";   
0e40: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0e50: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
0e60: 54 45 52 52 55 50 54 3a 20 20 20 20 20 20 20 20  TERRUPT:        
0e70: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0e80: 54 45 5f 49 4e 54 45 52 52 55 50 54 22 3b 20 20  TE_INTERRUPT";  
0e90: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0ea0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
0eb0: 45 52 52 3a 20 20 20 20 20 20 20 20 20 20 20 20  ERR:            
0ec0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0ed0: 54 45 5f 49 4f 45 52 52 22 3b 20 20 20 20 20 20  TE_IOERR";      
0ee0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0ef0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
0f00: 52 52 55 50 54 3a 20 20 20 20 20 20 20 20 20 20  RRUPT:          
0f10: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0f20: 54 45 5f 43 4f 52 52 55 50 54 22 3b 20 20 20 20  TE_CORRUPT";    
0f30: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0f40: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
0f50: 54 46 4f 55 4e 44 3a 20 20 20 20 20 20 20 20 20  TFOUND:         
0f60: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0f70: 54 45 5f 4e 4f 54 46 4f 55 4e 44 22 3b 20 20 20  TE_NOTFOUND";   
0f80: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0f90: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 55    case SQLITE_FU
0fa0: 4c 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  LL:             
0fb0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0fc0: 54 45 5f 46 55 4c 4c 22 3b 20 20 20 20 20 20 20  TE_FULL";       
0fd0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0fe0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41    case SQLITE_CA
0ff0: 4e 54 4f 50 45 4e 3a 20 20 20 20 20 20 20 20 20  NTOPEN:         
1000: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1010: 54 45 5f 43 41 4e 54 4f 50 45 4e 22 3b 20 20 20  TE_CANTOPEN";   
1020: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1030: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 52    case SQLITE_PR
1040: 4f 54 4f 43 4f 4c 3a 20 20 20 20 20 20 20 20 20  OTOCOL:         
1050: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1060: 54 45 5f 50 52 4f 54 4f 43 4f 4c 22 3b 20 20 20  TE_PROTOCOL";   
1070: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1080: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45 4d    case SQLITE_EM
1090: 50 54 59 3a 20 20 20 20 20 20 20 20 20 20 20 20  PTY:            
10a0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
10b0: 54 45 5f 45 4d 50 54 59 22 3b 20 20 20 20 20 20  TE_EMPTY";      
10c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
10d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 43    case SQLITE_SC
10e0: 48 45 4d 41 3a 20 20 20 20 20 20 20 20 20 20 20  HEMA:           
10f0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1100: 54 45 5f 53 43 48 45 4d 41 22 3b 20 20 20 20 20  TE_SCHEMA";     
1110: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1120: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 4f    case SQLITE_TO
1130: 4f 42 49 47 3a 20 20 20 20 20 20 20 20 20 20 20  OBIG:           
1140: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1150: 54 45 5f 54 4f 4f 42 49 47 22 3b 20 20 20 20 20  TE_TOOBIG";     
1160: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1170: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
1180: 4e 53 54 52 41 49 4e 54 3a 20 20 20 20 20 20 20  NSTRAINT:       
1190: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
11a0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 22 3b 20  TE_CONSTRAINT"; 
11b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
11c0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49    case SQLITE_MI
11d0: 53 4d 41 54 43 48 3a 20 20 20 20 20 20 20 20 20  SMATCH:         
11e0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
11f0: 54 45 5f 4d 49 53 4d 41 54 43 48 22 3b 20 20 20  TE_MISMATCH";   
1200: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1210: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49    case SQLITE_MI
1220: 53 55 53 45 3a 20 20 20 20 20 20 20 20 20 20 20  SUSE:           
1230: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1240: 54 45 5f 4d 49 53 55 53 45 22 3b 20 20 20 20 20  TE_MISUSE";     
1250: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1260: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
1270: 4c 46 53 3a 20 20 20 20 20 20 20 20 20 20 20 20  LFS:            
1280: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1290: 54 45 5f 4e 4f 4c 46 53 22 3b 20 20 20 20 20 20  TE_NOLFS";      
12a0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
12b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 55    case SQLITE_AU
12c0: 54 48 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  TH:             
12d0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
12e0: 54 45 5f 41 55 54 48 22 3b 20 20 20 20 20 20 20  TE_AUTH";       
12f0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1300: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4f    case SQLITE_FO
1310: 52 4d 41 54 3a 20 20 20 20 20 20 20 20 20 20 20  RMAT:           
1320: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1330: 54 45 5f 46 4f 52 4d 41 54 22 3b 20 20 20 20 20  TE_FORMAT";     
1340: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1350: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 41    case SQLITE_RA
1360: 4e 47 45 3a 20 20 20 20 20 20 20 20 20 20 20 20  NGE:            
1370: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1380: 54 45 5f 52 41 4e 47 45 22 3b 20 20 20 20 20 20  TE_RANGE";      
1390: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
13a0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
13b0: 54 41 44 42 3a 20 20 20 20 20 20 20 20 20 20 20  TADB:           
13c0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
13d0: 54 45 5f 4e 4f 54 41 44 42 22 3b 20 20 20 20 20  TE_NOTADB";     
13e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
13f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 4f    case SQLITE_RO
1400: 57 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  W:              
1410: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1420: 54 45 5f 52 4f 57 22 3b 20 20 20 20 20 20 20 20  TE_ROW";        
1430: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1440: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 4f    case SQLITE_DO
1450: 4e 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  NE:             
1460: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1470: 54 45 5f 44 4f 4e 45 22 3b 20 20 20 20 20 20 20  TE_DONE";       
1480: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1490: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
14a0: 45 52 52 5f 52 45 41 44 3a 20 20 20 20 20 20 20  ERR_READ:       
14b0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
14c0: 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 22 3b 20  TE_IOERR_READ"; 
14d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
14e0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
14f0: 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3a 20  ERR_SHORT_READ: 
1500: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1510: 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
1520: 45 41 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  EAD";  break;.  
1530: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
1540: 45 52 52 5f 57 52 49 54 45 3a 20 20 20 20 20 20  ERR_WRITE:      
1550: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1560: 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 22 3b  TE_IOERR_WRITE";
1570: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1580: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
1590: 45 52 52 5f 46 53 59 4e 43 3a 20 20 20 20 20 20  ERR_FSYNC:      
15a0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
15b0: 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 22 3b  TE_IOERR_FSYNC";
15c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
15d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
15e0: 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 3a 20 20  ERR_DIR_FSYNC:  
15f0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1600: 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59  TE_IOERR_DIR_FSY
1610: 4e 43 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  NC";   break;.  
1620: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
1630: 45 52 52 5f 54 52 55 4e 43 41 54 45 3a 20 20 20  ERR_TRUNCATE:   
1640: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1650: 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
1660: 45 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  E";    break;.  
1670: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
1680: 45 52 52 5f 46 53 54 41 54 3a 20 20 20 20 20 20  ERR_FSTAT:      
1690: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
16a0: 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 22 3b  TE_IOERR_FSTAT";
16b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
16c0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
16d0: 45 52 52 5f 55 4e 4c 4f 43 4b 3a 20 20 20 20 20  ERR_UNLOCK:     
16e0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
16f0: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 22  TE_IOERR_UNLOCK"
1700: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
1710: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
1720: 45 52 52 5f 52 44 4c 4f 43 4b 3a 20 20 20 20 20  ERR_RDLOCK:     
1730: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1740: 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 22  TE_IOERR_RDLOCK"
1750: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
1760: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
1770: 45 52 52 5f 44 45 4c 45 54 45 3a 20 20 20 20 20  ERR_DELETE:     
1780: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1790: 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 22  TE_IOERR_DELETE"
17a0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
17b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
17c0: 45 52 52 5f 42 4c 4f 43 4b 45 44 3a 20 20 20 20  ERR_BLOCKED:    
17d0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
17e0: 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44  TE_IOERR_BLOCKED
17f0: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
1800: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
1810: 45 52 52 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20  ERR_NOMEM:      
1820: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1830: 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22 3b  TE_IOERR_NOMEM";
1840: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1850: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
1860: 45 52 52 5f 41 43 43 45 53 53 3a 20 20 20 20 20  ERR_ACCESS:     
1870: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1880: 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 22  TE_IOERR_ACCESS"
1890: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
18a0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
18b0: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
18c0: 44 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20 20  DLOCK:.         
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
18f0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
1900: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 22 3b 20  KRESERVEDLOCK"; 
1910: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1920: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
1930: 4b 3a 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  K:          zNam
1940: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
1950: 52 5f 4c 4f 43 4b 22 3b 20 20 20 20 20 20 20 20  R_LOCK";        
1960: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1970: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56  SQLITE_CORRUPT_V
1980: 54 41 42 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d  TAB:        zNam
1990: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 52 52  e = "SQLITE_CORR
19a0: 55 50 54 5f 56 54 41 42 22 3b 20 20 20 20 20 20  UPT_VTAB";      
19b0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
19c0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
19d0: 52 45 43 4f 56 45 52 59 3a 20 20 20 7a 4e 61 6d  RECOVERY:   zNam
19e0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44  e = "SQLITE_READ
19f0: 4f 4e 4c 59 5f 52 45 43 4f 56 45 52 59 22 3b 20  ONLY_RECOVERY"; 
1a00: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1a10: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
1a20: 43 41 4e 54 4c 4f 43 4b 3a 20 20 20 7a 4e 61 6d  CANTLOCK:   zNam
1a30: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44  e = "SQLITE_READ
1a40: 4f 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b 22 3b 20  ONLY_CANTLOCK"; 
1a50: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
1a60: 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  lt:             
1a70: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
1a80: 65 20 3d 20 22 53 51 4c 49 54 45 5f 55 6e 6b 6e  e = "SQLITE_Unkn
1a90: 6f 77 6e 22 3b 20 20 20 20 20 20 20 20 20 20 20  own";           
1aa0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
1ab0: 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 64 65  urn zName;.}.#de
1ac0: 66 69 6e 65 20 74 31 45 72 72 6f 72 4e 61 6d 65  fine t1ErrorName
1ad0: 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 6f   sqlite3TestErro
1ae0: 72 4e 61 6d 65 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  rName../*.** Con
1af0: 76 65 72 74 20 61 6e 20 73 71 6c 69 74 65 33 5f  vert an sqlite3_
1b00: 73 74 6d 74 2a 20 69 6e 74 6f 20 61 6e 20 73 71  stmt* into an sq
1b10: 6c 69 74 65 33 2a 2e 20 20 54 68 69 73 20 64 65  lite3*.  This de
1b20: 70 65 6e 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  pends on the.** 
1b30: 66 61 63 74 20 74 68 61 74 20 74 68 65 20 73 71  fact that the sq
1b40: 6c 69 74 65 33 2a 20 69 73 20 74 68 65 20 66 69  lite3* is the fi
1b50: 72 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65  rst field in the
1b60: 20 56 64 62 65 20 73 74 72 75 63 74 75 72 65 2e   Vdbe structure.
1b70: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 74 6d 74  .*/.#define Stmt
1b80: 54 6f 44 62 28 58 29 20 20 20 73 71 6c 69 74 65  ToDb(X)   sqlite
1b90: 33 5f 64 62 5f 68 61 6e 64 6c 65 28 58 29 0a 0a  3_db_handle(X)..
1ba0: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 61 20 72 65  /*.** Check a re
1bb0: 74 75 72 6e 20 76 61 6c 75 65 20 74 6f 20 6d 61  turn value to ma
1bc0: 6b 65 20 73 75 72 65 20 69 74 20 61 67 72 65 65  ke sure it agree
1bd0: 73 20 77 69 74 68 20 74 68 65 20 72 65 73 75 6c  s with the resul
1be0: 74 73 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74  ts.** from sqlit
1bf0: 65 33 5f 65 72 72 63 6f 64 65 2e 0a 2a 2f 0a 69  e3_errcode..*/.i
1c00: 6e 74 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  nt sqlite3TestEr
1c10: 72 43 6f 64 65 28 54 63 6c 5f 49 6e 74 65 72 70  rCode(Tcl_Interp
1c20: 20 2a 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65   *interp, sqlite
1c30: 33 20 2a 64 62 2c 20 69 6e 74 20 72 63 29 7b 0a  3 *db, int rc){.
1c40: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 68    if( sqlite3_th
1c50: 72 65 61 64 73 61 66 65 28 29 3d 3d 30 20 26 26  readsafe()==0 &&
1c60: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4d 49 53 55   rc!=SQLITE_MISU
1c70: 53 45 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  SE && rc!=SQLITE
1c80: 5f 4f 4b 0a 20 20 20 26 26 20 73 71 6c 69 74 65  _OK.   && sqlite
1c90: 33 5f 65 72 72 63 6f 64 65 28 64 62 29 21 3d 72  3_errcode(db)!=r
1ca0: 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42  c ){.    char zB
1cb0: 75 66 5b 32 30 30 5d 3b 0a 20 20 20 20 69 6e 74  uf[200];.    int
1cc0: 20 72 32 20 3d 20 73 71 6c 69 74 65 33 5f 65 72   r2 = sqlite3_er
1cd0: 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 20 20 73  rcode(db);.    s
1ce0: 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 65 72  printf(zBuf, "er
1cf0: 72 6f 72 20 63 6f 64 65 20 25 73 20 28 25 64 29  ror code %s (%d)
1d00: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
1d10: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 20  sqlite3_errcode 
1d20: 25 73 20 28 25 64 29 22 2c 0a 20 20 20 20 20 20  %s (%d)",.      
1d30: 20 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29   t1ErrorName(rc)
1d40: 2c 20 72 63 2c 20 74 31 45 72 72 6f 72 4e 61 6d  , rc, t1ErrorNam
1d50: 65 28 72 32 29 2c 20 72 32 29 3b 0a 20 20 20 20  e(r2), r2);.    
1d60: 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
1d70: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c  interp);.    Tcl
1d80: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1d90: 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
1da0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1db0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1dc0: 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20  ./*.** Decode a 
1dd0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
1de0: 6c 69 74 65 33 5f 73 74 6d 74 20 6f 62 6a 65 63  lite3_stmt objec
1df0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
1e00: 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
1e10: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1e20: 6e 74 65 72 70 2c 20 0a 20 20 63 6f 6e 73 74 20  nterp, .  const 
1e30: 63 68 61 72 20 2a 7a 41 72 67 2c 20 20 0a 20 20  char *zArg,  .  
1e40: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70  sqlite3_stmt **p
1e50: 70 53 74 6d 74 0a 29 7b 0a 20 20 2a 70 70 53 74  pStmt.){.  *ppSt
1e60: 6d 74 20 3d 20 28 73 71 6c 69 74 65 33 5f 73 74  mt = (sqlite3_st
1e70: 6d 74 2a 29 73 71 6c 69 74 65 33 54 65 73 74 54  mt*)sqlite3TestT
1e80: 65 78 74 54 6f 50 74 72 28 7a 41 72 67 29 3b 0a  extToPtr(zArg);.
1e90: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1ea0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1eb0: 74 65 20 61 20 74 65 78 74 20 72 65 70 72 65 73  te a text repres
1ec0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 20 70 6f  entation of a po
1ed0: 69 6e 74 65 72 20 74 68 61 74 20 63 61 6e 20 62  inter that can b
1ee0: 65 20 75 6e 64 65 72 73 74 6f 6f 64 0a 2a 2a 20  e understood.** 
1ef0: 62 79 20 74 68 65 20 67 65 74 44 62 50 6f 69 6e  by the getDbPoin
1f00: 74 65 72 20 61 6e 64 20 67 65 74 56 6d 50 6f 69  ter and getVmPoi
1f10: 6e 74 65 72 20 72 6f 75 74 69 6e 65 73 20 61 62  nter routines ab
1f20: 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ove..**.** The p
1f30: 72 6f 62 6c 65 6d 20 69 73 2c 20 6f 6e 20 73 6f  roblem is, on so
1f40: 6d 65 20 6d 61 63 68 69 6e 65 73 20 28 53 6f 6c  me machines (Sol
1f50: 61 72 69 73 29 20 69 66 20 79 6f 75 20 64 6f 20  aris) if you do 
1f60: 61 20 70 72 69 6e 74 66 20 77 69 74 68 0a 2a 2a  a printf with.**
1f70: 20 22 25 70 22 20 79 6f 75 20 63 61 6e 6e 6f 74   "%p" you cannot
1f80: 20 74 75 72 6e 20 61 72 6f 75 6e 64 20 61 6e 64   turn around and
1f90: 20 64 6f 20 61 20 73 63 61 6e 66 20 77 69 74 68   do a scanf with
1fa0: 20 74 68 65 20 73 61 6d 65 20 22 25 70 22 20 61   the same "%p" a
1fb0: 6e 64 0a 2a 2a 20 67 65 74 20 79 6f 75 72 20 70  nd.** get your p
1fc0: 6f 69 6e 74 65 72 20 62 61 63 6b 2e 20 20 59 6f  ointer back.  Yo
1fd0: 75 20 68 61 76 65 20 74 6f 20 70 72 65 70 65 6e  u have to prepen
1fe0: 64 20 61 20 22 30 78 22 20 62 65 66 6f 72 65 20  d a "0x" before 
1ff0: 69 74 20 77 69 6c 6c 0a 2a 2a 20 77 6f 72 6b 2e  it will.** work.
2000: 20 20 4f 72 20 61 74 20 6c 65 61 73 74 20 74 68    Or at least th
2010: 61 74 20 69 73 20 77 68 61 74 20 69 73 20 72 65  at is what is re
2020: 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 28 64 72  ported to me (dr
2030: 68 29 2e 20 20 42 75 74 20 74 68 69 73 0a 2a 2a  h).  But this.**
2040: 20 62 65 68 61 76 69 6f 72 20 76 61 72 69 65 73   behavior varies
2050: 20 66 72 6f 6d 20 6d 61 63 68 69 6e 65 20 74 6f   from machine to
2060: 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 65 20 73   machine.  The s
2070: 6f 6c 75 74 69 6f 6e 20 75 73 65 64 20 68 65 72  olution used her
2080: 20 69 73 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74   is.** to test t
2090: 68 65 20 73 74 72 69 6e 67 20 72 69 67 68 74 20  he string right 
20a0: 61 66 74 65 72 20 69 74 20 69 73 20 67 65 6e 65  after it is gene
20b0: 72 61 74 65 64 20 74 6f 20 73 65 65 20 69 66 20  rated to see if 
20c0: 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 75 6e 64  it can be.** und
20d0: 65 72 73 74 6f 6f 64 20 62 79 20 73 63 61 6e 66  erstood by scanf
20e0: 2c 20 61 6e 64 20 69 66 20 6e 6f 74 2c 20 74 72  , and if not, tr
20f0: 79 20 70 72 65 70 65 6e 64 69 6e 67 20 61 6e 20  y prepending an 
2100: 22 30 78 22 20 74 6f 20 73 65 65 20 69 66 0a 2a  "0x" to see if.*
2110: 2a 20 74 68 61 74 20 68 65 6c 70 73 2e 20 20 49  * that helps.  I
2120: 66 20 6e 6f 74 68 69 6e 67 20 77 6f 72 6b 73 2c  f nothing works,
2130: 20 61 20 66 61 74 61 6c 20 65 72 72 6f 72 20 69   a fatal error i
2140: 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a  s generated..*/.
2150: 69 6e 74 20 73 71 6c 69 74 65 33 54 65 73 74 4d  int sqlite3TestM
2160: 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 54 63  akePointerStr(Tc
2170: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2180: 2c 20 63 68 61 72 20 2a 7a 50 74 72 2c 20 76 6f  , char *zPtr, vo
2190: 69 64 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  id *p){.  sqlite
21a0: 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c 20  3_snprintf(100, 
21b0: 7a 50 74 72 2c 20 22 25 70 22 2c 20 70 29 3b 0a  zPtr, "%p", p);.
21c0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
21d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 61  .}../*.** The ca
21e0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 66  llback routine f
21f0: 6f 72 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f  or sqlite3_exec_
2200: 70 72 69 6e 74 66 28 29 2e 0a 2a 2f 0a 73 74 61  printf()..*/.sta
2210: 74 69 63 20 69 6e 74 20 65 78 65 63 5f 70 72 69  tic int exec_pri
2220: 6e 74 66 5f 63 62 28 76 6f 69 64 20 2a 70 41 72  ntf_cb(void *pAr
2230: 67 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 68 61  g, int argc, cha
2240: 72 20 2a 2a 61 72 67 76 2c 20 63 68 61 72 20 2a  r **argv, char *
2250: 2a 6e 61 6d 65 29 7b 0a 20 20 54 63 6c 5f 44 53  *name){.  Tcl_DS
2260: 74 72 69 6e 67 20 2a 73 74 72 20 3d 20 28 54 63  tring *str = (Tc
2270: 6c 5f 44 53 74 72 69 6e 67 2a 29 70 41 72 67 3b  l_DString*)pArg;
2280: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28  .  int i;..  if(
2290: 20 54 63 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67   Tcl_DStringLeng
22a0: 74 68 28 73 74 72 29 3d 3d 30 20 29 7b 0a 20 20  th(str)==0 ){.  
22b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
22c0: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54  c; i++){.      T
22d0: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
22e0: 45 6c 65 6d 65 6e 74 28 73 74 72 2c 20 6e 61 6d  Element(str, nam
22f0: 65 5b 69 5d 20 3f 20 6e 61 6d 65 5b 69 5d 20 3a  e[i] ? name[i] :
2300: 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a   "NULL");.    }.
2310: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
2320: 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
2330: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
2340: 6e 64 45 6c 65 6d 65 6e 74 28 73 74 72 2c 20 61  ndElement(str, a
2350: 72 67 76 5b 69 5d 20 3f 20 61 72 67 76 5b 69 5d  rgv[i] ? argv[i]
2360: 20 3a 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 7d 0a   : "NULL");.  }.
2370: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2380: 2a 0a 2a 2a 20 54 68 65 20 49 2f 4f 20 74 72 61  *.** The I/O tra
2390: 63 69 6e 67 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a  cing callback..*
23a0: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
23b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
23c0: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
23d0: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
23e0: 43 45 29 0a 73 74 61 74 69 63 20 46 49 4c 45 20  CE).static FILE 
23f0: 2a 69 6f 74 72 61 63 65 5f 66 69 6c 65 20 3d 20  *iotrace_file = 
2400: 30 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  0;.static void i
2410: 6f 5f 74 72 61 63 65 5f 63 61 6c 6c 62 61 63 6b  o_trace_callback
2420: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f  (const char *zFo
2430: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
2440: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73  _list ap;.  va_s
2450: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
2460: 29 3b 0a 20 20 76 66 70 72 69 6e 74 66 28 69 6f  );.  vfprintf(io
2470: 74 72 61 63 65 5f 66 69 6c 65 2c 20 7a 46 6f 72  trace_file, zFor
2480: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
2490: 6e 64 28 61 70 29 3b 0a 20 20 66 66 6c 75 73 68  nd(ap);.  fflush
24a0: 28 69 6f 74 72 61 63 65 5f 66 69 6c 65 29 3b 0a  (iotrace_file);.
24b0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
24c0: 55 73 61 67 65 3a 20 20 69 6f 5f 74 72 61 63 65  Usage:  io_trace
24d0: 20 46 49 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20   FILENAME.**.** 
24e0: 54 75 72 6e 20 49 2f 4f 20 74 72 61 63 69 6e 67  Turn I/O tracing
24f0: 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 49 66 20   on or off.  If 
2500: 46 49 4c 45 4e 41 4d 45 20 69 73 20 6e 6f 74 20  FILENAME is not 
2510: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c  an empty string,
2520: 0a 2a 2a 20 49 2f 4f 20 74 72 61 63 69 6e 67 20  .** I/O tracing 
2530: 62 65 67 69 6e 73 20 67 6f 69 6e 67 20 69 6e 74  begins going int
2540: 6f 20 46 49 4c 45 4e 41 4d 45 2e 20 49 66 20 46  o FILENAME. If F
2550: 49 4c 45 4e 41 4d 45 20 69 73 20 61 6e 20 65 6d  ILENAME is an em
2560: 70 74 79 0a 2a 2a 20 73 74 72 69 6e 67 2c 20 49  pty.** string, I
2570: 2f 4f 20 74 72 61 63 69 6e 67 20 69 73 20 74 75  /O tracing is tu
2580: 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61  rned off..*/.sta
2590: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 69 6f 5f  tic int test_io_
25a0: 74 72 61 63 65 28 0a 20 20 76 6f 69 64 20 2a 4e  trace(.  void *N
25b0: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
25c0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
25d0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
25e0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
25f0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
2600: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
2610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2620: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
2630: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
2640: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
2650: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
2660: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
2670: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
2680: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20  ITE_OMIT_TRACE) 
2690: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
26a0: 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45  E_ENABLE_IOTRACE
26b0: 29 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ).  if( argc!=2 
26c0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
26d0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
26e0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
26f0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
2700: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20  gv[0],.         
2710: 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20   " FILENAME\"", 
2720: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
2730: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2740: 69 66 28 20 69 6f 74 72 61 63 65 5f 66 69 6c 65  if( iotrace_file
2750: 20 29 7b 0a 20 20 20 20 69 66 28 20 69 6f 74 72   ){.    if( iotr
2760: 61 63 65 5f 66 69 6c 65 21 3d 73 74 64 6f 75 74  ace_file!=stdout
2770: 20 26 26 20 69 6f 74 72 61 63 65 5f 66 69 6c 65   && iotrace_file
2780: 21 3d 73 74 64 65 72 72 20 29 7b 0a 20 20 20 20  !=stderr ){.    
2790: 20 20 66 63 6c 6f 73 65 28 69 6f 74 72 61 63 65    fclose(iotrace
27a0: 5f 66 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  _file);.    }.  
27b0: 20 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 20 3d    iotrace_file =
27c0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49   0;.    sqlite3I
27d0: 6f 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 7d 0a  oTrace = 0;.  }.
27e0: 20 20 69 66 28 20 61 72 67 76 5b 31 5d 5b 30 5d    if( argv[1][0]
27f0: 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63   ){.    if( strc
2800: 6d 70 28 61 72 67 76 5b 31 5d 2c 22 73 74 64 6f  mp(argv[1],"stdo
2810: 75 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ut")==0 ){.     
2820: 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 20 3d 20   iotrace_file = 
2830: 73 74 64 6f 75 74 3b 0a 20 20 20 20 7d 65 6c 73  stdout;.    }els
2840: 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67  e if( strcmp(arg
2850: 76 5b 31 5d 2c 22 73 74 64 65 72 72 22 29 3d 3d  v[1],"stderr")==
2860: 30 20 29 7b 0a 20 20 20 20 20 20 69 6f 74 72 61  0 ){.      iotra
2870: 63 65 5f 66 69 6c 65 20 3d 20 73 74 64 65 72 72  ce_file = stderr
2880: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2890: 20 20 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 20     iotrace_file 
28a0: 3d 20 66 6f 70 65 6e 28 61 72 67 76 5b 31 5d 2c  = fopen(argv[1],
28b0: 20 22 77 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20   "w");.    }.   
28c0: 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 20   sqlite3IoTrace 
28d0: 3d 20 69 6f 5f 74 72 61 63 65 5f 63 61 6c 6c 62  = io_trace_callb
28e0: 61 63 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ack;.  }.#endif.
28f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2900: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  .}.../*.** Usage
2910: 3a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f  :  sqlite3_exec_
2920: 70 72 69 6e 74 66 20 20 44 42 20 20 46 4f 52 4d  printf  DB  FORM
2930: 41 54 20 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a  AT  STRING.**.**
2940: 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69   Invoke the sqli
2950: 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74 66 28  te3_exec_printf(
2960: 29 20 69 6e 74 65 72 66 61 63 65 20 75 73 69 6e  ) interface usin
2970: 67 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  g the open datab
2980: 61 73 65 0a 2a 2a 20 44 42 2e 20 20 54 68 65 20  ase.** DB.  The 
2990: 53 51 4c 20 69 73 20 74 68 65 20 73 74 72 69 6e  SQL is the strin
29a0: 67 20 46 4f 52 4d 41 54 2e 20 20 54 68 65 20 66  g FORMAT.  The f
29b0: 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 73 68 6f  ormat string sho
29c0: 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6f  uld contain.** o
29d0: 6e 65 20 25 73 20 6f 72 20 25 71 2e 20 20 53 54  ne %s or %q.  ST
29e0: 52 49 4e 47 20 69 73 20 74 68 65 20 76 61 6c 75  RING is the valu
29f0: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  e inserted into 
2a00: 25 73 20 6f 72 20 25 71 2e 0a 2a 2f 0a 73 74 61  %s or %q..*/.sta
2a10: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 78 65  tic int test_exe
2a20: 63 5f 70 72 69 6e 74 66 28 0a 20 20 76 6f 69 64  c_printf(.  void
2a30: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
2a40: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2a50: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
2a60: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
2a70: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
2a80: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
2a90: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
2aa0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
2ab0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
2ac0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
2ad0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
2ae0: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
2af0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
2b00: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  ;.  Tcl_DString 
2b10: 73 74 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  str;.  int rc;. 
2b20: 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b   char *zErr = 0;
2b30: 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  .  char *zSql;. 
2b40: 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a   char zBuf[30];.
2b50: 20 20 69 66 28 20 61 72 67 63 21 3d 34 20 29 7b    if( argc!=4 ){
2b60: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
2b70: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
2b80: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
2b90: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
2ba0: 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44  [0], .       " D
2bb0: 42 20 46 4f 52 4d 41 54 20 53 54 52 49 4e 47 22  B FORMAT STRING"
2bc0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
2bd0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2be0: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
2bf0: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
2c00: 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
2c10: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
2c20: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
2c30: 73 74 72 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73  str);.  zSql = s
2c40: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
2c50: 72 67 76 5b 32 5d 2c 20 61 72 67 76 5b 33 5d 29  rgv[2], argv[3])
2c60: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
2c70: 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20  _exec(db, zSql, 
2c80: 65 78 65 63 5f 70 72 69 6e 74 66 5f 63 62 2c 20  exec_printf_cb, 
2c90: 26 73 74 72 2c 20 26 7a 45 72 72 29 3b 0a 20 20  &str, &zErr);.  
2ca0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
2cb0: 6c 29 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42  l);.  sprintf(zB
2cc0: 75 66 2c 20 22 25 64 22 2c 20 72 63 29 3b 0a 20  uf, "%d", rc);. 
2cd0: 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65   Tcl_AppendEleme
2ce0: 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29  nt(interp, zBuf)
2cf0: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c  ;.  Tcl_AppendEl
2d00: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 63  ement(interp, rc
2d10: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 63  ==SQLITE_OK ? Tc
2d20: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
2d30: 73 74 72 29 20 3a 20 7a 45 72 72 29 3b 0a 20 20  str) : zErr);.  
2d40: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
2d50: 26 73 74 72 29 3b 0a 20 20 69 66 28 20 7a 45 72  &str);.  if( zEr
2d60: 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  r ) sqlite3_free
2d70: 28 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 73 71  (zErr);.  if( sq
2d80: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
2d90: 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
2da0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2db0: 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ROR;.  return TC
2dc0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
2dd0: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65  sage:  sqlite3_e
2de0: 78 65 63 5f 68 65 78 20 20 44 42 20 20 48 45 58  xec_hex  DB  HEX
2df0: 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  .**.** Invoke th
2e00: 65 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  e sqlite3_exec()
2e10: 20 6f 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61   on a string tha
2e20: 74 20 69 73 20 6f 62 74 61 69 6e 65 64 20 62 79  t is obtained by
2e30: 20 74 72 61 6e 73 6c 61 74 69 6e 67 0a 2a 2a 20   translating.** 
2e40: 48 45 58 20 69 6e 74 6f 20 41 53 43 49 49 2e 20  HEX into ASCII. 
2e50: 20 4d 6f 73 74 20 63 68 61 72 61 63 74 65 72 73   Most characters
2e60: 20 61 72 65 20 74 72 61 6e 73 6c 61 74 65 64 20   are translated 
2e70: 61 73 20 69 73 2e 20 20 25 48 48 20 62 65 63 6f  as is.  %HH beco
2e80: 6d 65 73 0a 2a 2a 20 61 20 68 65 78 20 63 68 61  mes.** a hex cha
2e90: 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  racter..*/.stati
2ea0: 63 20 69 6e 74 20 74 65 73 74 5f 65 78 65 63 5f  c int test_exec_
2eb0: 68 65 78 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  hex(.  void *Not
2ec0: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
2ed0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
2ee0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
2ef0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
2f00: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
2f10: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2f30: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
2f40: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
2f50: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
2f60: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
2f70: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
2f80: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 54  sqlite3 *db;.  T
2f90: 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a  cl_DString str;.
2fa0: 20 20 69 6e 74 20 72 63 2c 20 69 2c 20 6a 3b 0a    int rc, i, j;.
2fb0: 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30    char *zErr = 0
2fc0: 3b 0a 20 20 63 68 61 72 20 2a 7a 48 65 78 3b 0a  ;.  char *zHex;.
2fd0: 20 20 63 68 61 72 20 7a 53 71 6c 5b 35 30 30 5d    char zSql[500]
2fe0: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30  ;.  char zBuf[30
2ff0: 5d 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33  ];.  if( argc!=3
3000: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
3010: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
3020: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
3030: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
3040: 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
3050: 22 20 44 42 20 48 45 58 22 2c 20 30 29 3b 0a 20  " DB HEX", 0);. 
3060: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
3070: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
3080: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
3090: 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
30a0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
30b0: 52 52 4f 52 3b 0a 20 20 7a 48 65 78 20 3d 20 61  RROR;.  zHex = a
30c0: 72 67 76 5b 32 5d 3b 0a 20 20 66 6f 72 28 69 3d  rgv[2];.  for(i=
30d0: 6a 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 53  j=0; i<sizeof(zS
30e0: 71 6c 29 20 26 26 20 7a 48 65 78 5b 6a 5d 3b 20  ql) && zHex[j]; 
30f0: 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  i++, j++){.    i
3100: 66 28 20 7a 48 65 78 5b 6a 5d 3d 3d 27 25 27 20  f( zHex[j]=='%' 
3110: 26 26 20 7a 48 65 78 5b 6a 2b 32 5d 20 26 26 20  && zHex[j+2] && 
3120: 7a 48 65 78 5b 6a 2b 32 5d 20 29 7b 0a 20 20 20  zHex[j+2] ){.   
3130: 20 20 20 7a 53 71 6c 5b 69 5d 20 3d 20 28 74 65     zSql[i] = (te
3140: 73 74 48 65 78 54 6f 49 6e 74 28 7a 48 65 78 5b  stHexToInt(zHex[
3150: 6a 2b 31 5d 29 3c 3c 34 29 20 2b 20 74 65 73 74  j+1])<<4) + test
3160: 48 65 78 54 6f 49 6e 74 28 7a 48 65 78 5b 6a 2b  HexToInt(zHex[j+
3170: 32 5d 29 3b 0a 20 20 20 20 20 20 6a 20 2b 3d 20  2]);.      j += 
3180: 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  2;.    }else{.  
3190: 20 20 20 20 7a 53 71 6c 5b 69 5d 20 3d 20 7a 48      zSql[i] = zH
31a0: 65 78 5b 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  ex[j];.    }.  }
31b0: 0a 20 20 7a 53 71 6c 5b 69 5d 20 3d 20 30 3b 0a  .  zSql[i] = 0;.
31c0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
31d0: 74 28 26 73 74 72 29 3b 0a 20 20 72 63 20 3d 20  t(&str);.  rc = 
31e0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
31f0: 20 7a 53 71 6c 2c 20 65 78 65 63 5f 70 72 69 6e   zSql, exec_prin
3200: 74 66 5f 63 62 2c 20 26 73 74 72 2c 20 26 7a 45  tf_cb, &str, &zE
3210: 72 72 29 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a  rr);.  sprintf(z
3220: 42 75 66 2c 20 22 25 64 22 2c 20 72 63 29 3b 0a  Buf, "%d", rc);.
3230: 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d    Tcl_AppendElem
3240: 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ent(interp, zBuf
3250: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45  );.  Tcl_AppendE
3260: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72  lement(interp, r
3270: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54  c==SQLITE_OK ? T
3280: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
3290: 26 73 74 72 29 20 3a 20 7a 45 72 72 29 3b 0a 20  &str) : zErr);. 
32a0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
32b0: 28 26 73 74 72 29 3b 0a 20 20 69 66 28 20 7a 45  (&str);.  if( zE
32c0: 72 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  rr ) sqlite3_fre
32d0: 65 28 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 73  e(zErr);.  if( s
32e0: 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
32f0: 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63  e(interp, db, rc
3300: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
3310: 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54  RROR;.  return T
3320: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
3330: 55 73 61 67 65 3a 20 20 64 62 5f 65 6e 74 65 72  Usage:  db_enter
3340: 20 44 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 64   DB.**         d
3350: 62 5f 6c 65 61 76 65 20 44 42 0a 2a 2a 0a 2a 2a  b_leave DB.**.**
3360: 20 45 6e 74 65 72 20 6f 72 20 6c 65 61 76 65 20   Enter or leave 
3370: 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 61 20 64  the mutex on a d
3380: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
3390: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
33a0: 74 20 64 62 5f 65 6e 74 65 72 28 0a 20 20 76 6f  t db_enter(.  vo
33b0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
33c0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
33d0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
33e0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
33f0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
3400: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
3410: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
3420: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3430: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
3440: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
3450: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
3460: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
3470: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
3480: 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  db;.  if( argc!=
3490: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
34a0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
34b0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
34c0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
34d0: 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
34e0: 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
34f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
3500: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
3510: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
3520: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
3530: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
3540: 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  R;.  sqlite3_mut
3550: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
3560: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ex);.  return TC
3570: 4c 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69  L_OK;.}.static i
3580: 6e 74 20 64 62 5f 6c 65 61 76 65 28 0a 20 20 76  nt db_leave(.  v
3590: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
35a0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
35b0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
35c0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
35d0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
35e0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
35f0: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
3600: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3610: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
3620: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
3630: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
3640: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
3650: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
3660: 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21  *db;.  if( argc!
3670: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
3680: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
3690: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
36a0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
36b0: 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
36c0: 20 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20    " DB", 0);.   
36d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
36e0: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
36f0: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
3700: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
3710: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
3720: 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  OR;.  sqlite3_mu
3730: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
3740: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  tex);.  return T
3750: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
3760: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
3770: 65 78 65 63 20 20 44 42 20 20 53 51 4c 0a 2a 2a  exec  DB  SQL.**
3780: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73  .** Invoke the s
3790: 71 6c 69 74 65 33 5f 65 78 65 63 20 69 6e 74 65  qlite3_exec inte
37a0: 72 66 61 63 65 20 75 73 69 6e 67 20 74 68 65 20  rface using the 
37b0: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 44 42  open database DB
37c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
37d0: 65 73 74 5f 65 78 65 63 28 0a 20 20 76 6f 69 64  est_exec(.  void
37e0: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
37f0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
3800: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
3810: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
3820: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
3830: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
3840: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
3850: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
3860: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
3870: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
3880: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
3890: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
38a0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
38b0: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  ;.  Tcl_DString 
38c0: 73 74 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  str;.  int rc;. 
38d0: 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b   char *zErr = 0;
38e0: 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  .  char *zSql;. 
38f0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61   int i, j;.  cha
3900: 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 69 66  r zBuf[30];.  if
3910: 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20  ( argc!=3 ){.   
3920: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
3930: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
3940: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
3950: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
3960: 20 0a 20 20 20 20 20 20 20 22 20 44 42 20 53 51   .       " DB SQ
3970: 4c 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  L", 0);.    retu
3980: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
3990: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
39a0: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
39b0: 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
39c0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
39d0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
39e0: 28 26 73 74 72 29 3b 0a 20 20 7a 53 71 6c 20 3d  (&str);.  zSql =
39f0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
3a00: 28 22 25 73 22 2c 20 61 72 67 76 5b 32 5d 29 3b  ("%s", argv[2]);
3a10: 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 53  .  for(i=j=0; zS
3a20: 71 6c 5b 69 5d 3b 29 7b 0a 20 20 20 20 69 66 28  ql[i];){.    if(
3a30: 20 7a 53 71 6c 5b 69 5d 3d 3d 27 25 27 20 29 7b   zSql[i]=='%' ){
3a40: 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d  .      zSql[j++]
3a50: 20 3d 20 28 74 65 73 74 48 65 78 54 6f 49 6e 74   = (testHexToInt
3a60: 28 7a 53 71 6c 5b 69 2b 31 5d 29 3c 3c 34 29 20  (zSql[i+1])<<4) 
3a70: 2b 20 74 65 73 74 48 65 78 54 6f 49 6e 74 28 7a  + testHexToInt(z
3a80: 53 71 6c 5b 69 2b 32 5d 29 3b 0a 20 20 20 20 20  Sql[i+2]);.     
3a90: 20 69 20 2b 3d 20 33 3b 0a 20 20 20 20 7d 65 6c   i += 3;.    }el
3aa0: 73 65 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a  se{.      zSql[j
3ab0: 2b 2b 5d 20 3d 20 7a 53 71 6c 5b 69 2b 2b 5d 3b  ++] = zSql[i++];
3ac0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 53 71  .    }.  }.  zSq
3ad0: 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 63 20 3d  l[j] = 0;.  rc =
3ae0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62   sqlite3_exec(db
3af0: 2c 20 7a 53 71 6c 2c 20 65 78 65 63 5f 70 72 69  , zSql, exec_pri
3b00: 6e 74 66 5f 63 62 2c 20 26 73 74 72 2c 20 26 7a  ntf_cb, &str, &z
3b10: 45 72 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Err);.  sqlite3_
3b20: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 73 70  free(zSql);.  sp
3b30: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22  rintf(zBuf, "%d"
3b40: 2c 20 72 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70  , rc);.  Tcl_App
3b50: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
3b60: 70 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f  p, zBuf);.  Tcl_
3b70: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
3b80: 74 65 72 70 2c 20 72 63 3d 3d 53 51 4c 49 54 45  terp, rc==SQLITE
3b90: 5f 4f 4b 20 3f 20 54 63 6c 5f 44 53 74 72 69 6e  _OK ? Tcl_DStrin
3ba0: 67 56 61 6c 75 65 28 26 73 74 72 29 20 3a 20 7a  gValue(&str) : z
3bb0: 45 72 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  Err);.  Tcl_DStr
3bc0: 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20  ingFree(&str);. 
3bd0: 20 69 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69   if( zErr ) sqli
3be0: 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a  te3_free(zErr);.
3bf0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
3c00: 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
3c10: 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72   db, rc) ) retur
3c20: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
3c30: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
3c40: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
3c50: 71 6c 69 74 65 33 5f 65 78 65 63 5f 6e 72 20 20  qlite3_exec_nr  
3c60: 44 42 20 20 53 51 4c 0a 2a 2a 0a 2a 2a 20 49 6e  DB  SQL.**.** In
3c70: 76 6f 6b 65 20 74 68 65 20 73 71 6c 69 74 65 33  voke the sqlite3
3c80: 5f 65 78 65 63 20 69 6e 74 65 72 66 61 63 65 20  _exec interface 
3c90: 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20 64  using the open d
3ca0: 61 74 61 62 61 73 65 20 44 42 2e 20 20 44 69 73  atabase DB.  Dis
3cb0: 63 61 72 64 0a 2a 2a 20 61 6c 6c 20 72 65 73 75  card.** all resu
3cc0: 6c 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  lts.*/.static in
3cd0: 74 20 74 65 73 74 5f 65 78 65 63 5f 6e 72 28 0a  t test_exec_nr(.
3ce0: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
3cf0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
3d00: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
3d10: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
3d20: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
3d30: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
3d40: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
3d50: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3d60: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
3d70: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
3d80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
3d90: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
3da0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
3db0: 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
3dc0: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  ;.  char *zErr =
3dd0: 20 30 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d   0;.  if( argc!=
3de0: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
3df0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
3e00: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
3e10: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
3e20: 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
3e30: 20 22 20 44 42 20 53 51 4c 22 2c 20 30 29 3b 0a   " DB SQL", 0);.
3e40: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
3e50: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
3e60: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
3e70: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
3e80: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
3e90: 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
3ea0: 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 61  lite3_exec(db, a
3eb0: 72 67 76 5b 32 5d 2c 20 30 2c 20 30 2c 20 26 7a  rgv[2], 0, 0, &z
3ec0: 45 72 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  Err);.  if( sqli
3ed0: 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
3ee0: 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
3ef0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
3f00: 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  R;.  return TCL_
3f10: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
3f20: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge:  sqlite3_mpr
3f30: 69 6e 74 66 5f 7a 5f 74 65 73 74 20 20 53 45 50  intf_z_test  SEP
3f40: 41 52 41 54 4f 52 20 20 41 52 47 30 20 20 41 52  ARATOR  ARG0  AR
3f50: 47 31 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 65 73  G1 ....**.** Tes
3f60: 74 20 74 68 65 20 25 7a 20 66 6f 72 6d 61 74 20  t the %z format 
3f70: 6f 66 20 73 71 6c 69 74 65 5f 6d 70 72 69 6e 74  of sqlite_mprint
3f80: 66 28 29 2e 20 20 55 73 65 20 6d 75 6c 74 69 70  f().  Use multip
3f90: 6c 65 20 6d 70 72 69 6e 74 66 28 29 20 63 61 6c  le mprintf() cal
3fa0: 6c 73 20 74 6f 20 0a 2a 2a 20 63 6f 6e 63 61 74  ls to .** concat
3fb0: 65 6e 61 74 65 20 61 72 67 30 20 74 68 72 6f 75  enate arg0 throu
3fc0: 67 68 20 61 72 67 6e 20 75 73 69 6e 67 20 73 65  gh argn using se
3fd0: 70 61 72 61 74 6f 72 20 61 73 20 74 68 65 20 73  parator as the s
3fe0: 65 70 61 72 61 74 6f 72 2e 0a 2a 2a 20 52 65 74  eparator..** Ret
3ff0: 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a  urn the result..
4000: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
4010: 73 74 5f 6d 70 72 69 6e 74 66 5f 7a 28 0a 20 20  st_mprintf_z(.  
4020: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
4030: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
4040: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
4050: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
4060: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
4070: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
4080: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
4090: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
40a0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
40b0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
40c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
40d0: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
40e0: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
40f0: 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 69 6e  Result = 0;.  in
4100: 74 20 69 3b 0a 0a 20 20 66 6f 72 28 69 3d 32 3b  t i;..  for(i=2;
4110: 20 69 3c 61 72 67 63 20 26 26 20 28 69 3d 3d 32   i<argc && (i==2
4120: 20 7c 7c 20 7a 52 65 73 75 6c 74 29 3b 20 69 2b   || zResult); i+
4130: 2b 29 7b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20  +){.    zResult 
4140: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
4150: 66 28 22 25 7a 25 73 25 73 22 2c 20 7a 52 65 73  f("%z%s%s", zRes
4160: 75 6c 74 2c 20 61 72 67 76 5b 31 5d 2c 20 61 72  ult, argv[1], ar
4170: 67 76 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 54 63  gv[i]);.  }.  Tc
4180: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
4190: 6e 74 65 72 70 2c 20 7a 52 65 73 75 6c 74 2c 20  nterp, zResult, 
41a0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
41b0: 65 65 28 7a 52 65 73 75 6c 74 29 3b 0a 20 20 72  ee(zResult);.  r
41c0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
41d0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
41e0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6e  qlite3_mprintf_n
41f0: 5f 74 65 73 74 20 20 53 54 52 49 4e 47 0a 2a 2a  _test  STRING.**
4200: 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 25 6e 20  .** Test the %n 
4210: 66 6f 72 6d 61 74 20 6f 66 20 73 71 6c 69 74 65  format of sqlite
4220: 5f 6d 70 72 69 6e 74 66 28 29 2e 20 20 52 65 74  _mprintf().  Ret
4230: 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  urn the length o
4240: 66 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 73  f the.** input s
4250: 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  tring..*/.static
4260: 20 69 6e 74 20 74 65 73 74 5f 6d 70 72 69 6e 74   int test_mprint
4270: 66 5f 6e 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  f_n(.  void *Not
4280: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
4290: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
42a0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
42b0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
42c0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
42d0: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
42e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
42f0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
4300: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
4310: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
4320: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
4330: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
4340: 63 68 61 72 20 2a 7a 53 74 72 3b 0a 20 20 69 6e  char *zStr;.  in
4350: 74 20 6e 20 3d 20 30 3b 0a 20 20 7a 53 74 72 20  t n = 0;.  zStr 
4360: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
4370: 66 28 22 25 73 25 6e 22 2c 20 61 72 67 76 5b 31  f("%s%n", argv[1
4380: 5d 2c 20 26 6e 29 3b 0a 20 20 73 71 6c 69 74 65  ], &n);.  sqlite
4390: 33 5f 66 72 65 65 28 7a 53 74 72 29 3b 0a 20 20  3_free(zStr);.  
43a0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
43b0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
43c0: 49 6e 74 4f 62 6a 28 6e 29 29 3b 0a 20 20 72 65  IntObj(n));.  re
43d0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
43e0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
43f0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 69  lite3_snprintf_i
4400: 6e 74 20 20 53 49 5a 45 20 46 4f 52 4d 41 54 20  nt  SIZE FORMAT 
4410: 20 49 4e 54 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20   INT.**.** Test 
4420: 74 68 65 20 6f 66 20 73 71 6c 69 74 65 33 5f 73  the of sqlite3_s
4430: 6e 70 72 69 6e 74 66 28 29 20 72 6f 75 74 69 6e  nprintf() routin
4440: 65 2e 20 20 53 49 5a 45 20 69 73 20 74 68 65 20  e.  SIZE is the 
4450: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6f  size of the.** o
4460: 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20  utput buffer in 
4470: 62 79 74 65 73 2e 20 20 54 68 65 20 6d 61 78 69  bytes.  The maxi
4480: 6d 75 6d 20 73 69 7a 65 20 69 73 20 31 30 30 2e  mum size is 100.
4490: 20 20 46 4f 52 4d 41 54 20 69 73 20 74 68 65 0a    FORMAT is the.
44a0: 2a 2a 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67  ** format string
44b0: 2e 20 20 49 4e 54 20 69 73 20 61 20 73 69 6e 67  .  INT is a sing
44c0: 6c 65 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d  le integer argum
44d0: 65 6e 74 2e 20 20 54 68 65 20 46 4f 52 4d 41 54  ent.  The FORMAT
44e0: 0a 2a 2a 20 73 74 72 69 6e 67 20 6d 75 73 74 20  .** string must 
44f0: 72 65 71 75 69 72 65 20 6e 6f 20 6d 6f 72 65 20  require no more 
4500: 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 20 69 6e  than this one in
4510: 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 2e 20  teger argument. 
4520: 20 49 66 0a 2a 2a 20 59 6f 75 20 70 61 73 73 20   If.** You pass 
4530: 69 6e 20 61 20 66 6f 72 6d 61 74 20 73 74 72 69  in a format stri
4540: 6e 67 20 74 68 61 74 20 72 65 71 75 69 72 65 73  ng that requires
4550: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 61   more than one a
4560: 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 62 61 64 20  rgument,.** bad 
4570: 74 68 69 6e 67 73 20 77 69 6c 6c 20 68 61 70 70  things will happ
4580: 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  en..*/.static in
4590: 74 20 74 65 73 74 5f 73 6e 70 72 69 6e 74 66 5f  t test_snprintf_
45a0: 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  int(.  void *Not
45b0: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
45c0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
45d0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
45e0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
45f0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
4600: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
4610: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4620: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
4630: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
4640: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
4650: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
4660: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
4670: 63 68 61 72 20 7a 53 74 72 5b 31 30 30 5d 3b 0a  char zStr[100];.
4680: 20 20 69 6e 74 20 6e 20 3d 20 61 74 6f 69 28 61    int n = atoi(a
4690: 72 67 76 5b 31 5d 29 3b 0a 20 20 63 6f 6e 73 74  rgv[1]);.  const
46a0: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 20 3d   char *zFormat =
46b0: 20 61 72 67 76 5b 32 5d 3b 0a 20 20 69 6e 74 20   argv[2];.  int 
46c0: 61 31 20 3d 20 61 74 6f 69 28 61 72 67 76 5b 33  a1 = atoi(argv[3
46d0: 5d 29 3b 0a 20 20 69 66 28 20 6e 3e 73 69 7a 65  ]);.  if( n>size
46e0: 6f 66 28 7a 53 74 72 29 20 29 20 6e 20 3d 20 73  of(zStr) ) n = s
46f0: 69 7a 65 6f 66 28 7a 53 74 72 29 3b 0a 20 20 73  izeof(zStr);.  s
4700: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
4710: 73 69 7a 65 6f 66 28 7a 53 74 72 29 2c 20 7a 53  sizeof(zStr), zS
4720: 74 72 2c 20 22 61 62 63 64 65 66 67 68 69 6a 6b  tr, "abcdefghijk
4730: 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22  lmnopqrstuvwxyz"
4740: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  );.  sqlite3_snp
4750: 72 69 6e 74 66 28 6e 2c 20 7a 53 74 72 2c 20 7a  rintf(n, zStr, z
4760: 46 6f 72 6d 61 74 2c 20 61 31 29 3b 0a 20 20 54  Format, a1);.  T
4770: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
4780: 69 6e 74 65 72 70 2c 20 7a 53 74 72 2c 20 30 29  interp, zStr, 0)
4790: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
47a0: 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;.}..#ifndef SQ
47b0: 4c 49 54 45 5f 4f 4d 49 54 5f 47 45 54 5f 54 41  LITE_OMIT_GET_TA
47c0: 42 4c 45 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  BLE../*.** Usage
47d0: 3a 20 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74  :  sqlite3_get_t
47e0: 61 62 6c 65 5f 70 72 69 6e 74 66 20 20 44 42 20  able_printf  DB 
47f0: 20 46 4f 52 4d 41 54 20 20 53 54 52 49 4e 47 20   FORMAT  STRING 
4800: 20 3f 2d 2d 6e 6f 2d 63 6f 75 6e 74 73 3f 0a 2a   ?--no-counts?.*
4810: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
4820: 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c  sqlite3_get_tabl
4830: 65 5f 70 72 69 6e 74 66 28 29 20 69 6e 74 65 72  e_printf() inter
4840: 66 61 63 65 20 75 73 69 6e 67 20 74 68 65 20 6f  face using the o
4850: 70 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  pen database.** 
4860: 44 42 2e 20 20 54 68 65 20 53 51 4c 20 69 73 20  DB.  The SQL is 
4870: 74 68 65 20 73 74 72 69 6e 67 20 46 4f 52 4d 41  the string FORMA
4880: 54 2e 20 20 54 68 65 20 66 6f 72 6d 61 74 20 73  T.  The format s
4890: 74 72 69 6e 67 20 73 68 6f 75 6c 64 20 63 6f 6e  tring should con
48a0: 74 61 69 6e 0a 2a 2a 20 6f 6e 65 20 25 73 20 6f  tain.** one %s o
48b0: 72 20 25 71 2e 20 20 53 54 52 49 4e 47 20 69 73  r %q.  STRING is
48c0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 73 65 72   the value inser
48d0: 74 65 64 20 69 6e 74 6f 20 25 73 20 6f 72 20 25  ted into %s or %
48e0: 71 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  q..*/.static int
48f0: 20 74 65 73 74 5f 67 65 74 5f 74 61 62 6c 65 5f   test_get_table_
4900: 70 72 69 6e 74 66 28 0a 20 20 76 6f 69 64 20 2a  printf(.  void *
4910: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
4920: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
4930: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
4940: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
4950: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
4960: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
4970: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
4980: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
4990: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
49a0: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
49b0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
49c0: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
49d0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
49e0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74    Tcl_DString st
49f0: 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  r;.  int rc;.  c
4a00: 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20  har *zErr = 0;. 
4a10: 20 69 6e 74 20 6e 52 6f 77 2c 20 6e 43 6f 6c 3b   int nRow, nCol;
4a20: 0a 20 20 63 68 61 72 20 2a 2a 61 52 65 73 75 6c  .  char **aResul
4a30: 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  t;.  int i;.  ch
4a40: 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 63  ar zBuf[30];.  c
4a50: 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74  har *zSql;.  int
4a60: 20 72 65 73 43 6f 75 6e 74 20 3d 20 2d 31 3b 0a   resCount = -1;.
4a70: 20 20 69 66 28 20 61 72 67 63 3d 3d 35 20 29 7b    if( argc==5 ){
4a80: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
4a90: 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76  Int(interp, argv
4aa0: 5b 34 5d 2c 20 26 72 65 73 43 6f 75 6e 74 29 20  [4], &resCount) 
4ab0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
4ac0: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 72  OR;.  }.  if( ar
4ad0: 67 63 21 3d 34 20 26 26 20 61 72 67 63 21 3d 35  gc!=4 && argc!=5
4ae0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
4af0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
4b00: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
4b10: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
4b20: 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
4b30: 22 20 44 42 20 46 4f 52 4d 41 54 20 53 54 52 49  " DB FORMAT STRI
4b40: 4e 47 20 3f 43 4f 55 4e 54 3f 22 2c 20 30 29 3b  NG ?COUNT?", 0);
4b50: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
4b60: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
4b70: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
4b80: 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
4b90: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
4ba0: 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 44 53  _ERROR;.  Tcl_DS
4bb0: 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b  tringInit(&str);
4bc0: 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
4bd0: 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 32  3_mprintf(argv[2
4be0: 5d 2c 61 72 67 76 5b 33 5d 29 3b 0a 20 20 69 66  ],argv[3]);.  if
4bf0: 28 20 61 72 67 63 3d 3d 35 20 29 7b 0a 20 20 20  ( argc==5 ){.   
4c00: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 67 65   rc = sqlite3_ge
4c10: 74 5f 74 61 62 6c 65 28 64 62 2c 20 7a 53 71 6c  t_table(db, zSql
4c20: 2c 20 26 61 52 65 73 75 6c 74 2c 20 30 2c 20 30  , &aResult, 0, 0
4c30: 2c 20 26 7a 45 72 72 29 3b 0a 20 20 7d 65 6c 73  , &zErr);.  }els
4c40: 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
4c50: 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 28 64 62  te3_get_table(db
4c60: 2c 20 7a 53 71 6c 2c 20 26 61 52 65 73 75 6c 74  , zSql, &aResult
4c70: 2c 20 26 6e 52 6f 77 2c 20 26 6e 43 6f 6c 2c 20  , &nRow, &nCol, 
4c80: 26 7a 45 72 72 29 3b 0a 20 20 20 20 72 65 73 43  &zErr);.    resC
4c90: 6f 75 6e 74 20 3d 20 28 6e 52 6f 77 2b 31 29 2a  ount = (nRow+1)*
4ca0: 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  nCol;.  }.  sqli
4cb0: 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
4cc0: 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20    sprintf(zBuf, 
4cd0: 22 25 64 22 2c 20 72 63 29 3b 0a 20 20 54 63 6c  "%d", rc);.  Tcl
4ce0: 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  _AppendElement(i
4cf0: 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20  nterp, zBuf);.  
4d00: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4d10: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 61 72 67  K ){.    if( arg
4d20: 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 73 70  c==4 ){.      sp
4d30: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22  rintf(zBuf, "%d"
4d40: 2c 20 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 54  , nRow);.      T
4d50: 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  cl_AppendElement
4d60: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a  (interp, zBuf);.
4d70: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42        sprintf(zB
4d80: 75 66 2c 20 22 25 64 22 2c 20 6e 43 6f 6c 29 3b  uf, "%d", nCol);
4d90: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
4da0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
4db0: 20 7a 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20   zBuf);.    }.  
4dc0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 65 73    for(i=0; i<res
4dd0: 43 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  Count; i++){.   
4de0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65     Tcl_AppendEle
4df0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 61 52 65  ment(interp, aRe
4e00: 73 75 6c 74 5b 69 5d 20 3f 20 61 52 65 73 75 6c  sult[i] ? aResul
4e10: 74 5b 69 5d 20 3a 20 22 4e 55 4c 4c 22 29 3b 0a  t[i] : "NULL");.
4e20: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
4e30: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65     Tcl_AppendEle
4e40: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 45 72  ment(interp, zEr
4e50: 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  r);.  }.  sqlite
4e60: 33 5f 66 72 65 65 5f 74 61 62 6c 65 28 61 52 65  3_free_table(aRe
4e70: 73 75 6c 74 29 3b 0a 20 20 69 66 28 20 7a 45 72  sult);.  if( zEr
4e80: 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  r ) sqlite3_free
4e90: 28 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 73 71  (zErr);.  if( sq
4ea0: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
4eb0: 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
4ec0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
4ed0: 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ROR;.  return TC
4ee0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  L_OK;.}..#endif 
4ef0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 47  /* SQLITE_OMIT_G
4f00: 45 54 5f 54 41 42 4c 45 20 2a 2f 0a 0a 0a 2f 2a  ET_TABLE */.../*
4f10: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
4f20: 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f  te3_last_insert_
4f30: 72 6f 77 69 64 20 44 42 0a 2a 2a 0a 2a 2a 20 52  rowid DB.**.** R
4f40: 65 74 75 72 6e 73 20 74 68 65 20 69 6e 74 65 67  eturns the integ
4f50: 65 72 20 52 4f 57 49 44 20 6f 66 20 74 68 65 20  er ROWID of the 
4f60: 6d 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73 65  most recent inse
4f70: 72 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rt..*/.static in
4f80: 74 20 74 65 73 74 5f 6c 61 73 74 5f 72 6f 77 69  t test_last_rowi
4f90: 64 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  d(.  void *NotUs
4fa0: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
4fb0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
4fc0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
4fd0: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
4fe0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
4ff0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
5000: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
5010: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
5020: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
5030: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
5040: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
5050: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71  ument */.){.  sq
5060: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61  lite3 *db;.  cha
5070: 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 0a 20 20 69  r zBuf[30];..  i
5080: 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
5090: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
50a0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
50b0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
50c0: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
50d0: 2c 20 22 20 44 42 5c 22 22 2c 20 30 29 3b 0a 20  , " DB\"", 0);. 
50e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
50f0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
5100: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
5110: 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
5120: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
5130: 52 52 4f 52 3b 0a 20 20 73 70 72 69 6e 74 66 28  RROR;.  sprintf(
5140: 7a 42 75 66 2c 20 22 25 6c 6c 64 22 2c 20 73 71  zBuf, "%lld", sq
5150: 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72  lite3_last_inser
5160: 74 5f 72 6f 77 69 64 28 64 62 29 29 3b 0a 20 20  t_rowid(db));.  
5170: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
5180: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
5190: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
51a0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
51b0: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
51c0: 6b 65 79 20 44 42 20 4b 45 59 0a 2a 2a 0a 2a 2a  key DB KEY.**.**
51d0: 20 53 65 74 20 74 68 65 20 63 6f 64 65 63 20 6b   Set the codec k
51e0: 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ey..*/.static in
51f0: 74 20 74 65 73 74 5f 6b 65 79 28 0a 20 20 76 6f  t test_key(.  vo
5200: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
5210: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
5220: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
5230: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
5240: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
5250: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
5260: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
5270: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
5280: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
5290: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
52a0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
52b0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
52c0: 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  /.){.#ifdef SQLI
52d0: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 73  TE_HAS_CODEC.  s
52e0: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
52f0: 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 3b 0a  nst char *zKey;.
5300: 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69 66    int nKey;.  if
5310: 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20  ( argc!=3 ){.   
5320: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
5330: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
5340: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
5350: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
5360: 0a 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41  .       " FILENA
5370: 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  ME\"", 0);.    r
5380: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
5390: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
53a0: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
53b0: 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
53c0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
53d0: 3b 0a 20 20 7a 4b 65 79 20 3d 20 61 72 67 76 5b  ;.  zKey = argv[
53e0: 32 5d 3b 0a 20 20 6e 4b 65 79 20 3d 20 73 74 72  2];.  nKey = str
53f0: 6c 65 6e 28 7a 4b 65 79 29 3b 0a 20 20 73 71 6c  len(zKey);.  sql
5400: 69 74 65 33 5f 6b 65 79 28 64 62 2c 20 7a 4b 65  ite3_key(db, zKe
5410: 79 2c 20 6e 4b 65 79 29 3b 0a 23 65 6e 64 69 66  y, nKey);.#endif
5420: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
5430: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
5440: 3a 20 20 73 71 6c 69 74 65 33 5f 72 65 6b 65 79  :  sqlite3_rekey
5450: 20 44 42 20 4b 45 59 0a 2a 2a 0a 2a 2a 20 43 68   DB KEY.**.** Ch
5460: 61 6e 67 65 20 74 68 65 20 63 6f 64 65 63 20 6b  ange the codec k
5470: 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ey..*/.static in
5480: 74 20 74 65 73 74 5f 72 65 6b 65 79 28 0a 20 20  t test_rekey(.  
5490: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
54a0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
54b0: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
54c0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
54d0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
54e0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
54f0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
5500: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5510: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
5520: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
5530: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
5540: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
5550: 20 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53 51   */.){.#ifdef SQ
5560: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
5570: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
5580: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79  const char *zKey
5590: 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20  ;.  int nKey;.  
55a0: 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
55b0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
55c0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
55d0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
55e0: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
55f0: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c 45  ],.       " FILE
5600: 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20  NAME\"", 0);.   
5610: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
5620: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
5630: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
5640: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
5650: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
5660: 4f 52 3b 0a 20 20 7a 4b 65 79 20 3d 20 61 72 67  OR;.  zKey = arg
5670: 76 5b 32 5d 3b 0a 20 20 6e 4b 65 79 20 3d 20 73  v[2];.  nKey = s
5680: 74 72 6c 65 6e 28 7a 4b 65 79 29 3b 0a 20 20 73  trlen(zKey);.  s
5690: 71 6c 69 74 65 33 5f 72 65 6b 65 79 28 64 62 2c  qlite3_rekey(db,
56a0: 20 7a 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 23 65   zKey, nKey);.#e
56b0: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43  ndif.  return TC
56c0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
56d0: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 63  sage:  sqlite3_c
56e0: 6c 6f 73 65 20 44 42 0a 2a 2a 0a 2a 2a 20 43 6c  lose DB.**.** Cl
56f0: 6f 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73  oses the databas
5700: 65 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69  e opened by sqli
5710: 74 65 33 5f 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61  te3_open..*/.sta
5720: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f 74  tic int sqlite_t
5730: 65 73 74 5f 63 6c 6f 73 65 28 0a 20 20 76 6f 69  est_close(.  voi
5740: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
5750: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
5760: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
5770: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
5780: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
5790: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
57a0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
57b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
57c0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
57d0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
57e0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
57f0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
5800: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
5810: 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  b;.  int rc;.  i
5820: 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
5830: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
5840: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
5850: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
5860: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
5870: 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e  ,.       " FILEN
5880: 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  AME\"", 0);.    
5890: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
58a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
58b0: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
58c0: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
58d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
58e0: 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
58f0: 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 54  3_close(db);.  T
5900: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
5910: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
5920: 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
5930: 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74  L_STATIC);.  ret
5940: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
5950: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
5960: 69 6f 6e 20 6f 66 20 74 68 65 20 78 5f 63 6f 61  ion of the x_coa
5970: 6c 65 73 63 65 28 29 20 66 75 6e 63 74 69 6f 6e  lesce() function
5980: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
5990: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6e  first argument n
59a0: 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74  on-NULL argument
59b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
59c0: 20 74 31 5f 69 66 6e 75 6c 6c 46 75 6e 63 28 0a   t1_ifnullFunc(.
59d0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
59e0: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
59f0: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
5a00: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
5a10: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
5a20: 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b  (i=0; i<argc; i+
5a30: 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  +){.    if( SQLI
5a40: 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33  TE_NULL!=sqlite3
5a50: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
5a60: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  [i]) ){.      in
5a70: 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  t n = sqlite3_va
5a80: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 69  lue_bytes(argv[i
5a90: 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ]);.      sqlite
5aa0: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
5ab0: 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29 73 71  ntext, (char*)sq
5ac0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
5ad0: 28 61 72 67 76 5b 69 5d 29 2c 0a 20 20 20 20 20  (argv[i]),.     
5ae0: 20 20 20 20 20 6e 2c 20 53 51 4c 49 54 45 5f 54       n, SQLITE_T
5af0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
5b00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
5b10: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65  }.}../*.** These
5b20: 20 61 72 65 20 74 65 73 74 20 66 75 6e 63 74 69   are test functi
5b30: 6f 6e 73 2e 20 20 20 20 68 65 78 38 28 29 20 69  ons.    hex8() i
5b40: 6e 74 65 72 70 72 65 74 73 20 69 74 73 20 61 72  nterprets its ar
5b50: 67 75 6d 65 6e 74 20 61 73 0a 2a 2a 20 55 54 46  gument as.** UTF
5b60: 38 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20  8 and returns a 
5b70: 68 65 78 20 65 6e 63 6f 64 69 6e 67 2e 20 20 68  hex encoding.  h
5b80: 65 78 31 36 6c 65 28 29 20 69 6e 74 65 72 70 72  ex16le() interpr
5b90: 65 74 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74  ets its argument
5ba0: 0a 2a 2a 20 61 73 20 55 54 46 31 36 6c 65 20 61  .** as UTF16le a
5bb0: 6e 64 20 72 65 74 75 72 6e 73 20 61 20 68 65 78  nd returns a hex
5bc0: 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73 74   encoding..*/.st
5bd0: 61 74 69 63 20 76 6f 69 64 20 68 65 78 38 46 75  atic void hex8Fu
5be0: 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  nc(sqlite3_conte
5bf0: 78 74 20 2a 70 2c 20 69 6e 74 20 61 72 67 63 2c  xt *p, int argc,
5c00: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
5c10: 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74 20  *argv){.  const 
5c20: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
5c30: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
5c40: 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20 7a  r zBuf[200];.  z
5c50: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
5c60: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
5c70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
5c80: 65 6f 66 28 7a 42 75 66 29 2f 32 20 2d 20 32 20  eof(zBuf)/2 - 2 
5c90: 26 26 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  && z[i]; i++){. 
5ca0: 20 20 20 73 70 72 69 6e 74 66 28 26 7a 42 75 66     sprintf(&zBuf
5cb0: 5b 69 2a 32 5d 2c 20 22 25 30 32 78 22 2c 20 7a  [i*2], "%02x", z
5cc0: 5b 69 5d 26 30 78 66 66 29 3b 0a 20 20 7d 0a 20  [i]&0xff);.  }. 
5cd0: 20 7a 42 75 66 5b 69 2a 32 5d 20 3d 20 30 3b 0a   zBuf[i*2] = 0;.
5ce0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
5cf0: 5f 74 65 78 74 28 70 2c 20 28 63 68 61 72 2a 29  _text(p, (char*)
5d00: 7a 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45  zBuf, -1, SQLITE
5d10: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 23  _TRANSIENT);.}.#
5d20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5d30: 49 54 5f 55 54 46 31 36 0a 73 74 61 74 69 63 20  IT_UTF16.static 
5d40: 76 6f 69 64 20 68 65 78 31 36 46 75 6e 63 28 73  void hex16Func(s
5d50: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
5d60: 70 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  p, int argc, sql
5d70: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
5d80: 76 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  v){.  const unsi
5d90: 67 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 20 2a  gned short int *
5da0: 7a 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  z;.  int i;.  ch
5db0: 61 72 20 7a 42 75 66 5b 34 30 30 5d 3b 0a 20 20  ar zBuf[400];.  
5dc0: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
5dd0: 65 5f 74 65 78 74 31 36 28 61 72 67 76 5b 30 5d  e_text16(argv[0]
5de0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
5df0: 73 69 7a 65 6f 66 28 7a 42 75 66 29 2f 34 20 2d  sizeof(zBuf)/4 -
5e00: 20 34 20 26 26 20 7a 5b 69 5d 3b 20 69 2b 2b 29   4 && z[i]; i++)
5e10: 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 26 7a  {.    sprintf(&z
5e20: 42 75 66 5b 69 2a 34 5d 2c 20 22 25 30 34 78 22  Buf[i*4], "%04x"
5e30: 2c 20 7a 5b 69 5d 26 30 78 66 66 29 3b 0a 20 20  , z[i]&0xff);.  
5e40: 7d 0a 20 20 7a 42 75 66 5b 69 2a 34 5d 20 3d 20  }.  zBuf[i*4] = 
5e50: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  0;.  sqlite3_res
5e60: 75 6c 74 5f 74 65 78 74 28 70 2c 20 28 63 68 61  ult_text(p, (cha
5e70: 72 2a 29 7a 42 75 66 2c 20 2d 31 2c 20 53 51 4c  r*)zBuf, -1, SQL
5e80: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
5e90: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
5ea0: 41 20 73 74 72 75 63 74 75 72 65 20 69 6e 74 6f  A structure into
5eb0: 20 77 68 69 63 68 20 74 6f 20 61 63 63 75 6d 75   which to accumu
5ec0: 6c 61 74 65 20 74 65 78 74 2e 0a 2a 2f 0a 73 74  late text..*/.st
5ed0: 72 75 63 74 20 64 73 74 72 20 7b 0a 20 20 69 6e  ruct dstr {.  in
5ee0: 74 20 6e 41 6c 6c 6f 63 3b 20 20 2f 2a 20 53 70  t nAlloc;  /* Sp
5ef0: 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f  ace allocated */
5f00: 0a 20 20 69 6e 74 20 6e 55 73 65 64 3b 20 20 20  .  int nUsed;   
5f10: 2f 2a 20 53 70 61 63 65 20 75 73 65 64 20 2a 2f  /* Space used */
5f20: 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20  .  char *z;     
5f30: 2f 2a 20 54 68 65 20 73 70 61 63 65 20 2a 2f 0a  /* The space */.
5f40: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  };../*.** Append
5f50: 20 74 65 78 74 20 74 6f 20 61 20 64 73 74 72 0a   text to a dstr.
5f60: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
5f70: 73 74 72 41 70 70 65 6e 64 28 73 74 72 75 63 74  strAppend(struct
5f80: 20 64 73 74 72 20 2a 70 2c 20 63 6f 6e 73 74 20   dstr *p, const 
5f90: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 64 69 76  char *z, int div
5fa0: 69 64 65 72 29 7b 0a 20 20 69 6e 74 20 6e 20 3d  ider){.  int n =
5fb0: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 29 3b   (int)strlen(z);
5fc0: 0a 20 20 69 66 28 20 70 2d 3e 6e 55 73 65 64 20  .  if( p->nUsed 
5fd0: 2b 20 6e 20 2b 20 32 20 3e 20 70 2d 3e 6e 41 6c  + n + 2 > p->nAl
5fe0: 6c 6f 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20  loc ){.    char 
5ff0: 2a 7a 4e 65 77 3b 0a 20 20 20 20 70 2d 3e 6e 41  *zNew;.    p->nA
6000: 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 6c 6c 6f 63  lloc = p->nAlloc
6010: 2a 32 20 2b 20 6e 20 2b 20 32 30 30 3b 0a 20 20  *2 + n + 200;.  
6020: 20 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    zNew = sqlite3
6030: 5f 72 65 61 6c 6c 6f 63 28 70 2d 3e 7a 2c 20 70  _realloc(p->z, p
6040: 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69  ->nAlloc);.    i
6050: 66 28 20 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( zNew==0 ){.  
6060: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
6070: 28 70 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 6d 65  (p->z);.      me
6080: 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
6090: 66 28 2a 70 29 29 3b 0a 20 20 20 20 20 20 72 65  f(*p));.      re
60a0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
60b0: 70 2d 3e 7a 20 3d 20 7a 4e 65 77 3b 0a 20 20 7d  p->z = zNew;.  }
60c0: 0a 20 20 69 66 28 20 64 69 76 69 64 65 72 20 26  .  if( divider &
60d0: 26 20 70 2d 3e 6e 55 73 65 64 3e 30 20 29 7b 0a  & p->nUsed>0 ){.
60e0: 20 20 20 20 70 2d 3e 7a 5b 70 2d 3e 6e 55 73 65      p->z[p->nUse
60f0: 64 2b 2b 5d 20 3d 20 64 69 76 69 64 65 72 3b 0a  d++] = divider;.
6100: 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 26 70 2d    }.  memcpy(&p-
6110: 3e 7a 5b 70 2d 3e 6e 55 73 65 64 5d 2c 20 7a 2c  >z[p->nUsed], z,
6120: 20 6e 2b 31 29 3b 0a 20 20 70 2d 3e 6e 55 73 65   n+1);.  p->nUse
6130: 64 20 2b 3d 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  d += n;.}../*.**
6140: 20 49 6e 76 6f 6b 65 64 20 66 6f 72 20 65 61 63   Invoked for eac
6150: 68 20 63 61 6c 6c 62 61 63 6b 20 66 72 6f 6d 20  h callback from 
6160: 73 71 6c 69 74 65 33 45 78 65 63 46 75 6e 63 0a  sqlite3ExecFunc.
6170: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
6180: 65 63 46 75 6e 63 43 61 6c 6c 62 61 63 6b 28 76  ecFuncCallback(v
6190: 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20  oid *pData, int 
61a0: 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67  argc, char **arg
61b0: 76 2c 20 63 68 61 72 20 2a 2a 4e 6f 74 55 73 65  v, char **NotUse
61c0: 64 29 7b 0a 20 20 73 74 72 75 63 74 20 64 73 74  d){.  struct dst
61d0: 72 20 2a 70 20 3d 20 28 73 74 72 75 63 74 20 64  r *p = (struct d
61e0: 73 74 72 2a 29 70 44 61 74 61 3b 0a 20 20 69 6e  str*)pData;.  in
61f0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
6200: 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<argc; i++){.  
6210: 20 20 69 66 28 20 61 72 67 76 5b 69 5d 3d 3d 30    if( argv[i]==0
6220: 20 29 7b 0a 20 20 20 20 20 20 64 73 74 72 41 70   ){.      dstrAp
6230: 70 65 6e 64 28 70 2c 20 22 4e 55 4c 4c 22 2c 20  pend(p, "NULL", 
6240: 27 20 27 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ' ');.    }else{
6250: 0a 20 20 20 20 20 20 64 73 74 72 41 70 70 65 6e  .      dstrAppen
6260: 64 28 70 2c 20 61 72 67 76 5b 69 5d 2c 20 27 20  d(p, argv[i], ' 
6270: 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ');.    }.  }.  
6280: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
6290: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
62a0: 6e 20 6f 66 20 74 68 65 20 78 5f 73 71 6c 69 74  n of the x_sqlit
62b0: 65 5f 65 78 65 63 28 29 20 66 75 6e 63 74 69 6f  e_exec() functio
62c0: 6e 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f  n.  This functio
62d0: 6e 20 74 61 6b 65 73 0a 2a 2a 20 61 20 73 69 6e  n takes.** a sin
62e0: 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 61 6e 64  gle argument and
62f0: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 65 78 65   attempts to exe
6300: 63 75 74 65 20 74 68 61 74 20 61 72 67 75 6d 65  cute that argume
6310: 6e 74 20 61 73 20 53 51 4c 20 63 6f 64 65 2e 0a  nt as SQL code..
6320: 2a 2a 20 54 68 69 73 20 69 73 20 69 6c 6c 65 67  ** This is illeg
6330: 61 6c 20 61 6e 64 20 73 68 6f 75 6c 64 20 73 65  al and should se
6340: 74 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 49 53  t the SQLITE_MIS
6350: 55 53 45 20 66 6c 61 67 20 6f 6e 20 74 68 65 20  USE flag on the 
6360: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
6370: 32 30 30 34 2d 4a 61 6e 2d 30 37 3a 20 20 57 65  2004-Jan-07:  We
6380: 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 74 68   have changed th
6390: 69 73 20 74 6f 20 6d 61 6b 65 20 69 74 20 6c 65  is to make it le
63a0: 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69  gal to call sqli
63b0: 74 65 33 5f 65 78 65 63 28 29 0a 2a 2a 20 66 72  te3_exec().** fr
63c0: 6f 6d 20 77 69 74 68 69 6e 20 61 20 66 75 6e 63  om within a func
63d0: 74 69 6f 6e 20 63 61 6c 6c 2e 20 20 0a 2a 2a 20  tion call.  .** 
63e0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
63f0: 20 73 69 6d 75 6c 61 74 65 73 20 74 68 65 20 65   simulates the e
6400: 66 66 65 63 74 20 6f 66 20 68 61 76 69 6e 67 20  ffect of having 
6410: 74 77 6f 20 74 68 72 65 61 64 73 20 61 74 74 65  two threads atte
6420: 6d 70 74 20 74 6f 0a 2a 2a 20 75 73 65 20 74 68  mpt to.** use th
6430: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
6440: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
6450: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6460: 20 73 71 6c 69 74 65 33 45 78 65 63 46 75 6e 63   sqlite3ExecFunc
6470: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
6480: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20  ext *context, . 
6490: 20 69 6e 74 20 61 72 67 63 2c 20 20 0a 20 20 73   int argc,  .  s
64a0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
64b0: 72 67 76 0a 29 7b 0a 20 20 73 74 72 75 63 74 20  rgv.){.  struct 
64c0: 64 73 74 72 20 78 3b 0a 20 20 6d 65 6d 73 65 74  dstr x;.  memset
64d0: 28 26 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 78  (&x, 0, sizeof(x
64e0: 29 29 3b 0a 20 20 28 76 6f 69 64 29 73 71 6c 69  ));.  (void)sqli
64f0: 74 65 33 5f 65 78 65 63 28 28 73 71 6c 69 74 65  te3_exec((sqlite
6500: 33 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f  3*)sqlite3_user_
6510: 64 61 74 61 28 63 6f 6e 74 65 78 74 29 2c 0a 20  data(context),. 
6520: 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69       (char*)sqli
6530: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
6540: 72 67 76 5b 30 5d 29 2c 0a 20 20 20 20 20 20 65  rgv[0]),.      e
6550: 78 65 63 46 75 6e 63 43 61 6c 6c 62 61 63 6b 2c  xecFuncCallback,
6560: 20 26 78 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74   &x, 0);.  sqlit
6570: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
6580: 6f 6e 74 65 78 74 2c 20 78 2e 7a 2c 20 78 2e 6e  ontext, x.z, x.n
6590: 55 73 65 64 2c 20 53 51 4c 49 54 45 5f 54 52 41  Used, SQLITE_TRA
65a0: 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74  NSIENT);.  sqlit
65b0: 65 33 5f 66 72 65 65 28 78 2e 7a 29 3b 0a 7d 0a  e3_free(x.z);.}.
65c0: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
65d0: 61 74 69 6f 6e 20 6f 66 20 74 6b 74 32 32 31 33  ation of tkt2213
65e0: 66 75 6e 63 28 29 2c 20 61 20 73 63 61 6c 61 72  func(), a scalar
65f0: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 74   function that t
6600: 61 6b 65 73 20 65 78 61 63 74 6c 79 0a 2a 2a 20  akes exactly.** 
6610: 6f 6e 65 20 61 72 67 75 6d 65 6e 74 2e 20 49 74  one argument. It
6620: 20 68 61 73 20 74 77 6f 20 69 6e 74 65 72 65 73   has two interes
6630: 74 69 6e 67 20 66 65 61 74 75 72 65 73 3a 0a 2a  ting features:.*
6640: 2a 0a 2a 2a 20 2a 20 49 74 20 63 61 6c 6c 73 20  *.** * It calls 
6650: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
6660: 78 74 28 29 20 33 20 74 69 6d 65 73 20 6f 6e 20  xt() 3 times on 
6670: 74 68 65 20 61 72 67 75 6d 65 6e 74 20 73 71 6c  the argument sql
6680: 69 74 65 33 5f 76 61 6c 75 65 2a 2e 0a 2a 2a 20  ite3_value*..** 
6690: 20 20 49 66 20 74 68 65 20 74 68 72 65 65 20 70    If the three p
66a0: 6f 69 6e 74 65 72 73 20 72 65 74 75 72 6e 65 64  ointers returned
66b0: 20 61 72 65 20 6e 6f 74 20 74 68 65 20 73 61 6d   are not the sam
66c0: 65 20 61 6e 20 53 51 4c 20 65 72 72 6f 72 20 69  e an SQL error i
66d0: 73 20 72 61 69 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  s raised..**.** 
66e0: 2a 20 4f 74 68 65 72 77 69 73 65 20 69 74 20 72  * Otherwise it r
66f0: 65 74 75 72 6e 73 20 61 20 63 6f 70 79 20 6f 66  eturns a copy of
6700: 20 74 68 65 20 74 65 78 74 20 72 65 70 72 65 73   the text repres
6710: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 69 74 73 20  entation of its 
6720: 0a 2a 2a 20 20 20 61 72 67 75 6d 65 6e 74 20 69  .**   argument i
6730: 6e 20 73 75 63 68 20 61 20 77 61 79 20 61 73 20  n such a way as 
6740: 74 68 65 20 56 44 42 45 20 72 65 70 72 65 73 65  the VDBE represe
6750: 6e 74 61 74 69 6f 6e 20 69 73 20 61 20 4d 65 6d  ntation is a Mem
6760: 2a 20 63 65 6c 6c 20 0a 2a 2a 20 20 20 77 69 74  * cell .**   wit
6770: 68 20 74 68 65 20 4d 45 4d 5f 54 65 72 6d 20 66  h the MEM_Term f
6780: 6c 61 67 20 63 6c 65 61 72 2e 20 0a 2a 2a 0a 2a  lag clear. .**.*
6790: 2a 20 54 69 63 6b 65 74 20 23 32 32 31 33 20 63  * Ticket #2213 c
67a0: 61 6e 20 74 68 65 72 65 66 6f 72 65 20 62 65 20  an therefore be 
67b0: 74 65 73 74 65 64 20 62 79 20 65 76 61 6c 75 61  tested by evalua
67c0: 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ting the followi
67d0: 6e 67 0a 2a 2a 20 53 51 4c 20 65 78 70 72 65 73  ng.** SQL expres
67e0: 73 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 74 6b  sion:.**.**   tk
67f0: 74 32 32 31 33 66 75 6e 63 28 74 6b 74 32 32 31  t2213func(tkt221
6800: 33 66 75 6e 63 28 27 61 20 73 74 72 69 6e 67 27  3func('a string'
6810: 29 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ));.*/.static vo
6820: 69 64 20 74 6b 74 32 32 31 33 46 75 6e 63 74 69  id tkt2213Functi
6830: 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  on(.  sqlite3_co
6840: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
6850: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 0a 20  .  int argc,  . 
6860: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
6870: 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 6e  *argv.){.  int n
6880: 54 65 78 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64  Text;.  unsigned
6890: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65   char const *zTe
68a0: 78 74 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  xt1;.  unsigned 
68b0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78  char const *zTex
68c0: 74 32 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  t2;.  unsigned c
68d0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74  har const *zText
68e0: 33 3b 0a 0a 20 20 6e 54 65 78 74 20 3d 20 73 71  3;..  nText = sq
68f0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
6900: 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a 54  s(argv[0]);.  zT
6910: 65 78 74 31 20 3d 20 73 71 6c 69 74 65 33 5f 76  ext1 = sqlite3_v
6920: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
6930: 5d 29 3b 0a 20 20 7a 54 65 78 74 32 20 3d 20 73  ]);.  zText2 = s
6940: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
6950: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a 54  t(argv[0]);.  zT
6960: 65 78 74 33 20 3d 20 73 71 6c 69 74 65 33 5f 76  ext3 = sqlite3_v
6970: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
6980: 5d 29 3b 0a 0a 20 20 69 66 28 20 7a 54 65 78 74  ]);..  if( zText
6990: 31 21 3d 7a 54 65 78 74 32 20 7c 7c 20 7a 54 65  1!=zText2 || zTe
69a0: 78 74 32 21 3d 7a 54 65 78 74 33 20 29 7b 0a 20  xt2!=zText3 ){. 
69b0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
69c0: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
69d0: 20 22 74 6b 74 32 32 31 33 20 69 73 20 6e 6f 74   "tkt2213 is not
69e0: 20 66 69 78 65 64 22 2c 20 2d 31 29 3b 0a 20 20   fixed", -1);.  
69f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
6a00: 2a 7a 43 6f 70 79 20 3d 20 28 63 68 61 72 20 2a  *zCopy = (char *
6a10: 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
6a20: 6e 54 65 78 74 29 3b 0a 20 20 20 20 6d 65 6d 63  nText);.    memc
6a30: 70 79 28 7a 43 6f 70 79 2c 20 7a 54 65 78 74 31  py(zCopy, zText1
6a40: 2c 20 6e 54 65 78 74 29 3b 0a 20 20 20 20 73 71  , nText);.    sq
6a50: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
6a60: 74 28 63 6f 6e 74 65 78 74 2c 20 7a 43 6f 70 79  t(context, zCopy
6a70: 2c 20 6e 54 65 78 74 2c 20 73 71 6c 69 74 65 33  , nText, sqlite3
6a80: 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  _free);.  }.}../
6a90: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
6aa0: 6e 67 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  ng SQL function 
6ab0: 74 61 6b 65 73 20 34 20 61 72 67 75 6d 65 6e 74  takes 4 argument
6ac0: 73 2e 20 20 54 68 65 20 32 6e 64 20 61 6e 64 0a  s.  The 2nd and.
6ad0: 2a 2a 20 34 74 68 20 61 72 67 75 6d 65 6e 74 20  ** 4th argument 
6ae0: 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 74  must be one of t
6af0: 68 65 73 65 20 73 74 72 69 6e 67 73 3a 20 20 27  hese strings:  '
6b00: 74 65 78 74 27 2c 20 27 74 65 78 74 31 36 27 2c  text', 'text16',
6b10: 0a 2a 2a 20 6f 72 20 27 62 6c 6f 62 27 20 63 6f  .** or 'blob' co
6b20: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 41  rresponding to A
6b30: 50 49 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 0a  PI functions.**.
6b40: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  **      sqlite3_
6b50: 76 61 6c 75 65 5f 74 65 78 74 28 29 0a 2a 2a 20  value_text().** 
6b60: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
6b70: 75 65 5f 74 65 78 74 31 36 28 29 0a 2a 2a 20 20  ue_text16().**  
6b80: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
6b90: 65 5f 62 6c 6f 62 28 29 0a 2a 2a 0a 2a 2a 20 54  e_blob().**.** T
6ba0: 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
6bb0: 74 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20 65  t is a string, e
6bc0: 69 74 68 65 72 20 27 62 79 74 65 73 27 20 6f 72  ither 'bytes' or
6bd0: 20 27 62 79 74 65 73 31 36 27 20 6f 72 20 27 6e   'bytes16' or 'n
6be0: 6f 6f 70 27 2c 0a 2a 2a 20 63 6f 72 72 65 73 70  oop',.** corresp
6bf0: 6f 6e 64 69 6e 67 20 74 6f 20 41 50 49 73 3a 0a  onding to APIs:.
6c00: 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  **.**      sqlit
6c10: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 29  e3_value_bytes()
6c20: 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
6c30: 5f 76 61 6c 75 65 5f 62 79 74 65 73 31 36 28 29  _value_bytes16()
6c40: 0a 2a 2a 20 20 20 20 20 20 6e 6f 6f 70 0a 2a 2a  .**      noop.**
6c50: 0a 2a 2a 20 54 68 65 20 41 50 49 73 20 64 65 73  .** The APIs des
6c60: 69 67 6e 61 74 65 64 20 62 79 20 74 68 65 20 32  ignated by the 2
6c70: 6e 64 20 74 68 72 6f 75 67 68 20 34 74 68 20 61  nd through 4th a
6c80: 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61 70 70  rguments are app
6c90: 6c 69 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66  lied.** to the f
6ca0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 6e  irst argument in
6cb0: 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68 65 20   order.  If the 
6cc0: 70 6f 69 6e 74 65 72 73 20 72 65 74 75 72 6e 65  pointers returne
6cd0: 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 65 63 6f  d by the.** seco
6ce0: 6e 64 20 61 6e 64 20 66 6f 75 72 74 68 20 61 72  nd and fourth ar
6cf0: 65 20 64 69 66 66 65 72 65 6e 74 2c 20 74 68 69  e different, thi
6d00: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
6d10: 73 20 31 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  s 1.  Otherwise,
6d20: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
6d30: 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 0a 2a   returns 0..**.*
6d40: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
6d50: 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20  is used to test 
6d60: 74 6f 20 73 65 65 20 77 68 65 6e 20 72 65 74 75  to see when retu
6d70: 72 6e 65 64 20 70 6f 69 6e 74 65 72 73 20 66 72  rned pointers fr
6d80: 6f 6d 0a 2a 2a 20 74 68 65 20 5f 74 65 78 74 28  om.** the _text(
6d90: 29 2c 20 5f 74 65 78 74 31 36 28 29 20 61 6e 64  ), _text16() and
6da0: 20 5f 62 6c 6f 62 28 29 20 41 50 49 73 20 62 65   _blob() APIs be
6db0: 63 6f 6d 65 20 69 6e 76 61 6c 69 64 61 74 65 64  come invalidated
6dc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6dd0: 20 70 74 72 43 68 6e 67 46 75 6e 63 74 69 6f 6e   ptrChngFunction
6de0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
6df0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20  ext *context, . 
6e00: 20 69 6e 74 20 61 72 67 63 2c 20 20 0a 20 20 73   int argc,  .  s
6e10: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
6e20: 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 76  rgv.){.  const v
6e30: 6f 69 64 20 2a 70 31 2c 20 2a 70 32 3b 0a 20 20  oid *p1, *p2;.  
6e40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6d 64  const char *zCmd
6e50: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34 20  ;.  if( argc!=4 
6e60: 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 43 6d 64  ) return;.  zCmd
6e70: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
6e80: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
6e90: 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69  xt(argv[1]);.  i
6ea0: 66 28 20 7a 43 6d 64 3d 3d 30 20 29 20 72 65 74  f( zCmd==0 ) ret
6eb0: 75 72 6e 3b 0a 20 20 69 66 28 20 73 74 72 63 6d  urn;.  if( strcm
6ec0: 70 28 7a 43 6d 64 2c 22 74 65 78 74 22 29 3d 3d  p(zCmd,"text")==
6ed0: 30 20 29 7b 0a 20 20 20 20 70 31 20 3d 20 28 63  0 ){.    p1 = (c
6ee0: 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c 69 74  onst void*)sqlit
6ef0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
6f00: 67 76 5b 30 5d 29 3b 0a 23 69 66 6e 64 65 66 20  gv[0]);.#ifndef 
6f10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
6f20: 36 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  6.  }else if( st
6f30: 72 63 6d 70 28 7a 43 6d 64 2c 20 22 74 65 78 74  rcmp(zCmd, "text
6f40: 31 36 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  16")==0 ){.    p
6f50: 31 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a  1 = (const void*
6f60: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
6f70: 65 78 74 31 36 28 61 72 67 76 5b 30 5d 29 3b 0a  ext16(argv[0]);.
6f80: 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 20 69  #endif.  }else i
6f90: 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20  f( strcmp(zCmd, 
6fa0: 22 62 6c 6f 62 22 29 3d 3d 30 20 29 7b 0a 20 20  "blob")==0 ){.  
6fb0: 20 20 70 31 20 3d 20 28 63 6f 6e 73 74 20 76 6f    p1 = (const vo
6fc0: 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  id*)sqlite3_valu
6fd0: 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b  e_blob(argv[0]);
6fe0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
6ff0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64  turn;.  }.  zCmd
7000: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
7010: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
7020: 78 74 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 69  xt(argv[2]);.  i
7030: 66 28 20 7a 43 6d 64 3d 3d 30 20 29 20 72 65 74  f( zCmd==0 ) ret
7040: 75 72 6e 3b 0a 20 20 69 66 28 20 73 74 72 63 6d  urn;.  if( strcm
7050: 70 28 7a 43 6d 64 2c 22 62 79 74 65 73 22 29 3d  p(zCmd,"bytes")=
7060: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
7070: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
7080: 67 76 5b 30 5d 29 3b 0a 23 69 66 6e 64 65 66 20  gv[0]);.#ifndef 
7090: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
70a0: 36 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  6.  }else if( st
70b0: 72 63 6d 70 28 7a 43 6d 64 2c 20 22 62 79 74 65  rcmp(zCmd, "byte
70c0: 73 31 36 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  s16")==0 ){.    
70d0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
70e0: 74 65 73 31 36 28 61 72 67 76 5b 30 5d 29 3b 0a  tes16(argv[0]);.
70f0: 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 20 69  #endif.  }else i
7100: 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20  f( strcmp(zCmd, 
7110: 22 6e 6f 6f 70 22 29 3d 3d 30 20 29 7b 0a 20 20  "noop")==0 ){.  
7120: 20 20 2f 2a 20 64 6f 20 6e 6f 74 68 69 6e 67 20    /* do nothing 
7130: 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
7140: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 43  return;.  }.  zC
7150: 6d 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  md = (const char
7160: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
7170: 74 65 78 74 28 61 72 67 76 5b 33 5d 29 3b 0a 20  text(argv[3]);. 
7180: 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29 20 72   if( zCmd==0 ) r
7190: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 74 72  eturn;.  if( str
71a0: 63 6d 70 28 7a 43 6d 64 2c 22 74 65 78 74 22 29  cmp(zCmd,"text")
71b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 32 20 3d 20  ==0 ){.    p2 = 
71c0: 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c  (const void*)sql
71d0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
71e0: 61 72 67 76 5b 30 5d 29 3b 0a 23 69 66 6e 64 65  argv[0]);.#ifnde
71f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
7200: 46 31 36 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  F16.  }else if( 
7210: 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 74 65  strcmp(zCmd, "te
7220: 78 74 31 36 22 29 3d 3d 30 20 29 7b 0a 20 20 20  xt16")==0 ){.   
7230: 20 70 32 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69   p2 = (const voi
7240: 64 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  d*)sqlite3_value
7250: 5f 74 65 78 74 31 36 28 61 72 67 76 5b 30 5d 29  _text16(argv[0])
7260: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
7270: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64   if( strcmp(zCmd
7280: 2c 20 22 62 6c 6f 62 22 29 3d 3d 30 20 29 7b 0a  , "blob")==0 ){.
7290: 20 20 20 20 70 32 20 3d 20 28 63 6f 6e 73 74 20      p2 = (const 
72a0: 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61  void*)sqlite3_va
72b0: 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d  lue_blob(argv[0]
72c0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
72d0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71  return;.  }.  sq
72e0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
72f0: 28 63 6f 6e 74 65 78 74 2c 20 70 31 21 3d 70 32  (context, p1!=p2
7300: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  );.}.../*.** Usa
7310: 67 65 3a 20 20 73 71 6c 69 74 65 5f 74 65 73 74  ge:  sqlite_test
7320: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
7330: 20 44 42 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74   DB.**.** Call t
7340: 68 65 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  he sqlite3_creat
7350: 65 5f 66 75 6e 63 74 69 6f 6e 20 41 50 49 20 6f  e_function API o
7360: 6e 20 74 68 65 20 67 69 76 65 6e 20 64 61 74 61  n the given data
7370: 62 61 73 65 20 69 6e 20 6f 72 64 65 72 0a 2a 2a  base in order.**
7380: 20 74 6f 20 63 72 65 61 74 65 20 61 20 66 75 6e   to create a fun
7390: 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 78 5f 63  ction named "x_c
73a0: 6f 61 6c 65 73 63 65 22 2e 20 20 54 68 69 73 20  oalesce".  This 
73b0: 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68  function does th
73c0: 65 20 73 61 6d 65 20 74 68 69 6e 67 0a 2a 2a 20  e same thing.** 
73d0: 61 73 20 74 68 65 20 22 63 6f 61 6c 65 73 63 65  as the "coalesce
73e0: 22 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69  " function.  Thi
73f0: 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20  s function also 
7400: 72 65 67 69 73 74 65 72 73 20 61 6e 20 53 51 4c  registers an SQL
7410: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6e 61 6d   function.** nam
7420: 65 64 20 22 78 5f 73 71 6c 69 74 65 5f 65 78 65  ed "x_sqlite_exe
7430: 63 22 20 74 68 61 74 20 69 6e 76 6f 6b 65 73 20  c" that invokes 
7440: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 20  sqlite3_exec(). 
7450: 20 49 6e 76 6f 6b 69 6e 67 20 73 71 6c 69 74 65   Invoking sqlite
7460: 33 5f 65 78 65 63 28 29 0a 2a 2a 20 69 6e 20 74  3_exec().** in t
7470: 68 69 73 20 77 61 79 20 69 73 20 69 6c 6c 65 67  his way is illeg
7480: 61 6c 20 72 65 63 75 72 73 69 6f 6e 20 61 6e 64  al recursion and
7490: 20 73 68 6f 75 6c 64 20 72 61 69 73 65 20 61 6e   should raise an
74a0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 65   SQLITE_MISUSE e
74b0: 72 72 6f 72 2e 0a 2a 2a 20 54 68 65 20 65 66 66  rror..** The eff
74c0: 65 63 74 20 69 73 20 73 69 6d 69 6c 61 72 20 74  ect is similar t
74d0: 6f 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20  o trying to use 
74e0: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
74f0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 72 6f  e connection fro
7500: 6d 0a 2a 2a 20 74 77 6f 20 74 68 72 65 61 64 73  m.** two threads
7510: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
7520: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69  e..**.** The ori
7530: 67 69 6e 61 6c 20 6d 6f 74 69 76 61 74 69 6f 6e  ginal motivation
7540: 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e   for this routin
7550: 65 20 77 61 73 20 74 6f 20 62 65 20 61 62 6c 65  e was to be able
7560: 20 74 6f 20 63 61 6c 6c 20 74 68 65 0a 2a 2a 20   to call the.** 
7570: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
7580: 75 6e 63 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  unction function
7590: 20 77 68 69 6c 65 20 61 20 71 75 65 72 79 20 69   while a query i
75a0: 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 69 6e  s in progress in
75b0: 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 74 65 73   order.** to tes
75c0: 74 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 49 53  t the SQLITE_MIS
75d0: 55 53 45 20 64 65 74 65 63 74 69 6f 6e 20 6c 6f  USE detection lo
75e0: 67 69 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  gic..*/.static i
75f0: 6e 74 20 74 65 73 74 5f 63 72 65 61 74 65 5f 66  nt test_create_f
7600: 75 6e 63 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20  unction(.  void 
7610: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
7620: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
7630: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
7640: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
7650: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
7660: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
7670: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
7680: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
7690: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
76a0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
76b0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
76c0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
76d0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
76e0: 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66  lite3 *db;..  if
76f0: 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20  ( argc!=2 ){.   
7700: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
7710: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
7720: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
7730: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
7740: 0a 20 20 20 20 20 20 20 22 20 44 42 5c 22 22 2c  .       " DB\"",
7750: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
7760: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
7770: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
7780: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
7790: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
77a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
77b0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
77c0: 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
77d0: 78 5f 63 6f 61 6c 65 73 63 65 22 2c 20 2d 31 2c  x_coalesce", -1,
77e0: 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20   SQLITE_ANY, 0, 
77f0: 0a 20 20 20 20 20 20 20 20 74 31 5f 69 66 6e 75  .        t1_ifnu
7800: 6c 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  llFunc, 0, 0);. 
7810: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7820: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
7830: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
7840: 6e 63 74 69 6f 6e 28 64 62 2c 20 22 68 65 78 38  nction(db, "hex8
7850: 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 41 4e 59  ", 1, SQLITE_ANY
7860: 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
7870: 68 65 78 38 46 75 6e 63 2c 20 30 2c 20 30 29 3b  hex8Func, 0, 0);
7880: 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
7890: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
78a0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
78b0: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
78c0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
78d0: 6e 63 74 69 6f 6e 28 64 62 2c 20 22 68 65 78 31  nction(db, "hex1
78e0: 36 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 41 4e  6", 1, SQLITE_AN
78f0: 59 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  Y, 0, .         
7900: 20 68 65 78 31 36 46 75 6e 63 2c 20 30 2c 20 30   hex16Func, 0, 0
7910: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
7920: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
7930: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
7940: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
7950: 63 74 69 6f 6e 28 64 62 2c 20 22 74 6b 74 32 32  ction(db, "tkt22
7960: 31 33 66 75 6e 63 22 2c 20 31 2c 20 53 51 4c 49  13func", 1, SQLI
7970: 54 45 5f 41 4e 59 2c 20 30 2c 20 0a 20 20 20 20  TE_ANY, 0, .    
7980: 20 20 20 20 20 20 74 6b 74 32 32 31 33 46 75 6e        tkt2213Fun
7990: 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  ction, 0, 0);.  
79a0: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
79b0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
79c0: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
79d0: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 70  _function(db, "p
79e0: 6f 69 6e 74 65 72 5f 63 68 61 6e 67 65 22 2c 20  ointer_change", 
79f0: 34 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30  4, SQLITE_ANY, 0
7a00: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 74 72  , .          ptr
7a10: 43 68 6e 67 46 75 6e 63 74 69 6f 6e 2c 20 30 2c  ChngFunction, 0,
7a20: 20 30 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65   0);.  }..#ifnde
7a30: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
7a40: 46 31 36 0a 20 20 2f 2a 20 55 73 65 20 74 68 65  F16.  /* Use the
7a50: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
7a60: 66 75 6e 63 74 69 6f 6e 31 36 28 29 20 41 50 49  function16() API
7a70: 20 68 65 72 65 2e 20 4d 61 69 6e 6c 79 20 66 6f   here. Mainly fo
7a80: 72 20 66 75 6e 2c 20 62 75 74 20 61 6c 73 6f 20  r fun, but also 
7a90: 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74  .  ** because it
7aa0: 20 69 73 20 6e 6f 74 20 74 65 73 74 65 64 20 61   is not tested a
7ab0: 6e 79 77 68 65 72 65 20 65 6c 73 65 2e 20 2a 2f  nywhere else. */
7ac0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
7ad0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73  E_OK ){.    cons
7ae0: 74 20 76 6f 69 64 20 2a 7a 55 74 66 31 36 3b 0a  t void *zUtf16;.
7af0: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
7b00: 65 20 2a 70 56 61 6c 3b 0a 20 20 20 20 73 71 6c  e *pVal;.    sql
7b10: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
7b20: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
7b30: 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56   pVal = sqlite3V
7b40: 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20  alueNew(db);.   
7b50: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
7b60: 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 22 78  Str(pVal, -1, "x
7b70: 5f 73 71 6c 69 74 65 5f 65 78 65 63 22 2c 20 53  _sqlite_exec", S
7b80: 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
7b90: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
7ba0: 7a 55 74 66 31 36 20 3d 20 73 71 6c 69 74 65 33  zUtf16 = sqlite3
7bb0: 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20  ValueText(pVal, 
7bc0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
7bd0: 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  VE);.    if( db-
7be0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
7bf0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
7c00: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
7c10: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
7c20: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
7c30: 75 6e 63 74 69 6f 6e 31 36 28 64 62 2c 20 7a 55  unction16(db, zU
7c40: 74 66 31 36 2c 20 0a 20 20 20 20 20 20 20 20 20  tf16, .         
7c50: 20 20 20 20 20 20 20 31 2c 20 53 51 4c 49 54 45         1, SQLITE
7c60: 5f 55 54 46 31 36 2c 20 64 62 2c 20 73 71 6c 69  _UTF16, db, sqli
7c70: 74 65 33 45 78 65 63 46 75 6e 63 2c 20 30 2c 20  te3ExecFunc, 0, 
7c80: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  0);.    }.    sq
7c90: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
7ca0: 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Val);.    sqlite
7cb0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
7cc0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 23 65  ->mutex);.  }.#e
7cd0: 6e 64 69 66 0a 0a 20 20 69 66 28 20 73 71 6c 69  ndif..  if( sqli
7ce0: 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
7cf0: 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
7d00: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
7d10: 52 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  R;.  Tcl_SetResu
7d20: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
7d30: 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
7d40: 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  c), 0);.  return
7d50: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
7d60: 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 69 6d  * Routines to im
7d70: 70 6c 65 6d 65 6e 74 20 74 68 65 20 78 5f 63 6f  plement the x_co
7d80: 75 6e 74 28 29 20 61 67 67 72 65 67 61 74 65 20  unt() aggregate 
7d90: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
7da0: 78 5f 63 6f 75 6e 74 28 29 20 63 6f 75 6e 74 73  x_count() counts
7db0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e   the number of n
7dc0: 6f 6e 2d 6e 75 6c 6c 20 61 72 67 75 6d 65 6e 74  on-null argument
7dd0: 73 2e 20 20 42 75 74 20 74 68 65 72 65 20 61 72  s.  But there ar
7de0: 65 0a 2a 2a 20 73 6f 6d 65 20 74 77 69 73 74 73  e.** some twists
7df0: 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72   for testing pur
7e00: 70 6f 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  poses..**.** If 
7e10: 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
7e20: 78 5f 63 6f 75 6e 74 28 29 20 69 73 20 34 30 20  x_count() is 40 
7e30: 74 68 65 6e 20 61 20 55 54 46 2d 38 20 65 72 72  then a UTF-8 err
7e40: 6f 72 20 69 73 20 72 65 70 6f 72 74 65 64 0a 2a  or is reported.*
7e50: 2a 20 6f 6e 20 74 68 65 20 73 74 65 70 20 66 75  * on the step fu
7e60: 6e 63 74 69 6f 6e 2e 20 20 49 66 20 78 5f 63 6f  nction.  If x_co
7e70: 75 6e 74 28 34 31 29 20 69 73 20 73 65 65 6e 2c  unt(41) is seen,
7e80: 20 74 68 65 6e 20 61 20 55 54 46 2d 31 36 20 65   then a UTF-16 e
7e90: 72 72 6f 72 0a 2a 2a 20 69 73 20 72 65 70 6f 72  rror.** is repor
7ea0: 74 65 64 20 6f 6e 20 74 68 65 20 73 74 65 70 20  ted on the step 
7eb0: 66 75 6e 63 74 69 6f 6e 2e 20 20 49 66 20 74 68  function.  If th
7ec0: 65 20 74 6f 74 61 6c 20 63 6f 75 6e 74 20 69 73  e total count is
7ed0: 20 34 32 2c 20 74 68 65 6e 0a 2a 2a 20 61 20 55   42, then.** a U
7ee0: 54 46 2d 38 20 65 72 72 6f 72 20 69 73 20 72 65  TF-8 error is re
7ef0: 70 6f 72 74 65 64 20 6f 6e 20 74 68 65 20 66 69  ported on the fi
7f00: 6e 61 6c 69 7a 65 20 66 75 6e 63 74 69 6f 6e 2e  nalize function.
7f10: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
7f20: 63 74 20 74 31 43 6f 75 6e 74 43 74 78 20 74 31  ct t1CountCtx t1
7f30: 43 6f 75 6e 74 43 74 78 3b 0a 73 74 72 75 63 74  CountCtx;.struct
7f40: 20 74 31 43 6f 75 6e 74 43 74 78 20 7b 0a 20 20   t1CountCtx {.  
7f50: 69 6e 74 20 6e 3b 0a 7d 3b 0a 73 74 61 74 69 63  int n;.};.static
7f60: 20 76 6f 69 64 20 74 31 43 6f 75 6e 74 53 74 65   void t1CountSte
7f70: 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  p(.  sqlite3_con
7f80: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
7f90: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
7fa0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
7fb0: 76 0a 29 7b 0a 20 20 74 31 43 6f 75 6e 74 43 74  v.){.  t1CountCt
7fc0: 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69  x *p;.  p = sqli
7fd0: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
7fe0: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  ntext(context, s
7ff0: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
8000: 28 20 28 61 72 67 63 3d 3d 30 20 7c 7c 20 53 51  ( (argc==0 || SQ
8010: 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74  LITE_NULL!=sqlit
8020: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
8030: 67 76 5b 30 5d 29 20 29 20 26 26 20 70 20 29 7b  gv[0]) ) && p ){
8040: 0a 20 20 20 20 70 2d 3e 6e 2b 2b 3b 0a 20 20 7d  .    p->n++;.  }
8050: 0a 20 20 69 66 28 20 61 72 67 63 3e 30 20 29 7b  .  if( argc>0 ){
8060: 0a 20 20 20 20 69 6e 74 20 76 20 3d 20 73 71 6c  .    int v = sql
8070: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
8080: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28  rgv[0]);.    if(
8090: 20 76 3d 3d 34 30 20 29 7b 0a 20 20 20 20 20 20   v==40 ){.      
80a0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
80b0: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 76  rror(context, "v
80c0: 61 6c 75 65 20 6f 66 20 34 30 20 68 61 6e 64 65  alue of 40 hande
80d0: 64 20 74 6f 20 78 5f 63 6f 75 6e 74 22 2c 20 2d  d to x_count", -
80e0: 31 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  1);.#ifndef SQLI
80f0: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
8100: 20 20 7d 65 6c 73 65 20 69 66 28 20 76 3d 3d 34    }else if( v==4
8110: 31 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  1 ){.      const
8120: 20 63 68 61 72 20 7a 55 74 66 31 36 45 72 72 4d   char zUtf16ErrM
8130: 73 67 5b 5d 20 3d 20 7b 20 30 2c 20 30 78 36 31  sg[] = { 0, 0x61
8140: 2c 20 30 2c 20 30 78 36 32 2c 20 30 2c 20 30 78  , 0, 0x62, 0, 0x
8150: 36 33 2c 20 30 2c 20 30 2c 20 30 7d 3b 0a 20 20  63, 0, 0, 0};.  
8160: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
8170: 6c 74 5f 65 72 72 6f 72 31 36 28 63 6f 6e 74 65  lt_error16(conte
8180: 78 74 2c 20 26 7a 55 74 66 31 36 45 72 72 4d 73  xt, &zUtf16ErrMs
8190: 67 5b 31 2d 53 51 4c 49 54 45 5f 42 49 47 45 4e  g[1-SQLITE_BIGEN
81a0: 44 49 41 4e 5d 2c 20 2d 31 29 3b 0a 23 65 6e 64  DIAN], -1);.#end
81b0: 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 20 20  if.    }.  }.}  
81c0: 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 31   .static void t1
81d0: 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 28 73 71  CountFinalize(sq
81e0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
81f0: 6f 6e 74 65 78 74 29 7b 0a 20 20 74 31 43 6f 75  ontext){.  t1Cou
8200: 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20  ntCtx *p;.  p = 
8210: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
8220: 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
8230: 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  t, sizeof(*p));.
8240: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
8250: 66 28 20 70 2d 3e 6e 3d 3d 34 32 20 29 7b 0a 20  f( p->n==42 ){. 
8260: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
8270: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
8280: 74 2c 20 22 78 5f 63 6f 75 6e 74 20 74 6f 74 61  t, "x_count tota
8290: 6c 73 20 74 6f 20 34 32 22 2c 20 2d 31 29 3b 0a  ls to 42", -1);.
82a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
82b0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
82c0: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 70 20 3f  int(context, p ?
82d0: 20 70 2d 3e 6e 20 3a 20 30 29 3b 0a 20 20 20 20   p->n : 0);.    
82e0: 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  }.  }.}..#ifndef
82f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
8300: 52 45 43 41 54 45 44 0a 73 74 61 74 69 63 20 76  RECATED.static v
8310: 6f 69 64 20 6c 65 67 61 63 79 43 6f 75 6e 74 53  oid legacyCountS
8320: 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  tep(.  sqlite3_c
8330: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
8340: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
8350: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
8360: 72 67 76 0a 29 7b 0a 20 20 2f 2a 20 6e 6f 2d 6f  rgv.){.  /* no-o
8370: 70 20 2a 2f 0a 7d 0a 0a 73 74 61 74 69 63 20 76  p */.}..static v
8380: 6f 69 64 20 6c 65 67 61 63 79 43 6f 75 6e 74 46  oid legacyCountF
8390: 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f  inalize(sqlite3_
83a0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
83b0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  ){.  sqlite3_res
83c0: 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c  ult_int(context,
83d0: 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61   sqlite3_aggrega
83e0: 74 65 5f 63 6f 75 6e 74 28 63 6f 6e 74 65 78 74  te_count(context
83f0: 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ));.}.#endif../*
8400: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
8410: 74 65 33 5f 63 72 65 61 74 65 5f 61 67 67 72 65  te3_create_aggre
8420: 67 61 74 65 20 44 42 0a 2a 2a 0a 2a 2a 20 43 61  gate DB.**.** Ca
8430: 6c 6c 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63  ll the sqlite3_c
8440: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 41  reate_function A
8450: 50 49 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  PI on the given 
8460: 64 61 74 61 62 61 73 65 20 69 6e 20 6f 72 64 65  database in orde
8470: 72 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 61  r.** to create a
8480: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20   function named 
8490: 22 78 5f 63 6f 75 6e 74 22 2e 20 20 54 68 69 73  "x_count".  This
84a0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d   function is sim
84b0: 69 6c 61 72 0a 2a 2a 20 74 6f 20 74 68 65 20 62  ilar.** to the b
84c0: 75 69 6c 74 2d 69 6e 20 63 6f 75 6e 74 28 29 20  uilt-in count() 
84d0: 66 75 6e 63 74 69 6f 6e 2c 20 77 69 74 68 20 61  function, with a
84e0: 20 66 65 77 20 73 70 65 63 69 61 6c 20 71 75 69   few special qui
84f0: 72 6b 73 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69  rks.** for testi
8500: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 72  ng the sqlite3_r
8510: 65 73 75 6c 74 5f 65 72 72 6f 72 28 29 20 41 50  esult_error() AP
8520: 49 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72  Is..**.** The or
8530: 69 67 69 6e 61 6c 20 6d 6f 74 69 76 61 74 69 6f  iginal motivatio
8540: 6e 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69  n for this routi
8550: 6e 65 20 77 61 73 20 74 6f 20 62 65 20 61 62 6c  ne was to be abl
8560: 65 20 74 6f 20 63 61 6c 6c 20 74 68 65 0a 2a 2a  e to call the.**
8570: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
8580: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
8590: 6f 6e 20 77 68 69 6c 65 20 61 20 71 75 65 72 79  on while a query
85a0: 20 69 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20   is in progress 
85b0: 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 74  in order.** to t
85c0: 65 73 74 20 74 68 65 20 53 51 4c 49 54 45 5f 4d  est the SQLITE_M
85d0: 49 53 55 53 45 20 64 65 74 65 63 74 69 6f 6e 20  ISUSE detection 
85e0: 6c 6f 67 69 63 2e 20 20 53 65 65 20 6d 69 73 75  logic.  See misu
85f0: 73 65 2e 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  se.test..**.** T
8600: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
8610: 6c 61 74 65 72 20 65 78 74 65 6e 64 65 64 20 74  later extended t
8620: 6f 20 74 65 73 74 20 74 68 65 20 75 73 65 20 6f  o test the use o
8630: 66 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  f sqlite3_result
8640: 5f 65 72 72 6f 72 28 29 0a 2a 2a 20 77 69 74 68  _error().** with
8650: 69 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  in aggregate fun
8660: 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61  ctions..**.** La
8670: 74 65 72 3a 20 49 74 20 69 73 20 6e 6f 77 20 61  ter: It is now a
8680: 6c 73 6f 20 65 78 74 65 6e 64 65 64 20 74 6f 20  lso extended to 
8690: 72 65 67 69 73 74 65 72 20 74 68 65 20 61 67 67  register the agg
86a0: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a  regate function.
86b0: 2a 2a 20 22 6c 65 67 61 63 79 5f 63 6f 75 6e 74  ** "legacy_count
86c0: 28 29 22 20 77 69 74 68 20 74 68 65 20 73 75 70  ()" with the sup
86d0: 70 6c 69 65 64 20 64 61 74 61 62 61 73 65 20 68  plied database h
86e0: 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73 20 75  andle. This is u
86f0: 73 65 64 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74  sed.** to test t
8700: 68 65 20 64 65 70 72 65 63 61 74 65 64 20 73 71  he deprecated sq
8710: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
8720: 63 6f 75 6e 74 28 29 20 41 50 49 2e 0a 2a 2f 0a  count() API..*/.
8730: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
8740: 63 72 65 61 74 65 5f 61 67 67 72 65 67 61 74 65  create_aggregate
8750: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
8760: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
8770: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
8780: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
8790: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
87a0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
87b0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
87c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
87d0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
87e0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
87f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8800: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
8810: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
8820: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
8830: 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  rc;.  if( argc!=
8840: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
8850: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8860: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
8870: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
8880: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
8890: 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30  " FILENAME\"", 0
88a0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
88b0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
88c0: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
88d0: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
88e0: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
88f0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
8900: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
8910: 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 78 5f  function(db, "x_
8920: 63 6f 75 6e 74 22 2c 20 30 2c 20 53 51 4c 49 54  count", 0, SQLIT
8930: 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 0a 20 20  E_UTF8, 0, 0,.  
8940: 20 20 20 20 74 31 43 6f 75 6e 74 53 74 65 70 2c      t1CountStep,
8950: 74 31 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 29  t1CountFinalize)
8960: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
8970: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
8980: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
8990: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 78  _function(db, "x
89a0: 5f 63 6f 75 6e 74 22 2c 20 31 2c 20 53 51 4c 49  _count", 1, SQLI
89b0: 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 0a 20  TE_UTF8, 0, 0,. 
89c0: 20 20 20 20 20 20 20 74 31 43 6f 75 6e 74 53 74         t1CountSt
89d0: 65 70 2c 74 31 43 6f 75 6e 74 46 69 6e 61 6c 69  ep,t1CountFinali
89e0: 7a 65 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  ze);.  }.#ifndef
89f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
8a00: 52 45 43 41 54 45 44 0a 20 20 69 66 28 20 72 63  RECATED.  if( rc
8a10: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
8a20: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
8a30: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
8a40: 64 62 2c 20 22 6c 65 67 61 63 79 5f 63 6f 75 6e  db, "legacy_coun
8a50: 74 22 2c 20 30 2c 20 53 51 4c 49 54 45 5f 41 4e  t", 0, SQLITE_AN
8a60: 59 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  Y, 0, 0,.       
8a70: 20 6c 65 67 61 63 79 43 6f 75 6e 74 53 74 65 70   legacyCountStep
8a80: 2c 20 6c 65 67 61 63 79 43 6f 75 6e 74 46 69 6e  , legacyCountFin
8a90: 61 6c 69 7a 65 0a 20 20 20 20 29 3b 0a 20 20 7d  alize.    );.  }
8aa0: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71  .#endif.  if( sq
8ab0: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
8ac0: 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
8ad0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
8ae0: 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65  ROR;.  Tcl_SetRe
8af0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
8b00: 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
8b10: 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75  (rc), 0);.  retu
8b20: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
8b30: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 70 72 69  *.** Usage:  pri
8b40: 6e 74 66 20 54 45 58 54 0a 2a 2a 0a 2a 2a 20 53  ntf TEXT.**.** S
8b50: 65 6e 64 20 6f 75 74 70 75 74 20 74 6f 20 70 72  end output to pr
8b60: 69 6e 74 66 2e 20 20 55 73 65 20 74 68 69 73 20  intf.  Use this 
8b70: 72 61 74 68 65 72 20 74 68 61 6e 20 70 75 74 73  rather than puts
8b80: 20 74 6f 20 6d 65 72 67 65 20 74 68 65 20 6f 75   to merge the ou
8b90: 74 70 75 74 0a 2a 2a 20 69 6e 20 74 68 65 20 63  tput.** in the c
8ba0: 6f 72 72 65 63 74 20 73 65 71 75 65 6e 63 65 20  orrect sequence 
8bb0: 77 69 74 68 20 64 65 62 75 67 67 69 6e 67 20 70  with debugging p
8bc0: 72 69 6e 74 66 73 20 69 6e 73 65 72 74 65 64 20  rintfs inserted 
8bd0: 69 6e 74 6f 20 43 20 63 6f 64 65 2e 0a 2a 2a 20  into C code..** 
8be0: 50 75 74 73 20 75 73 65 73 20 61 20 73 65 70 61  Puts uses a sepa
8bf0: 72 61 74 65 20 62 75 66 66 65 72 20 61 6e 64 20  rate buffer and 
8c00: 64 65 62 75 67 67 69 6e 67 20 73 74 61 74 65 6d  debugging statem
8c10: 65 6e 74 73 20 77 69 6c 6c 20 62 65 20 6f 75 74  ents will be out
8c20: 20 6f 66 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20   of.** sequence 
8c30: 69 66 20 69 74 20 69 73 20 75 73 65 64 2e 0a 2a  if it is used..*
8c40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
8c50: 74 5f 70 72 69 6e 74 66 28 0a 20 20 76 6f 69 64  t_printf(.  void
8c60: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
8c70: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
8c80: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
8c90: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
8ca0: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
8cb0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
8cc0: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
8cd0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
8ce0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
8cf0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
8d00: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
8d10: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
8d20: 29 7b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  ){.  if( argc!=2
8d30: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
8d40: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
8d50: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
8d60: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
8d70: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
8d80: 20 54 45 58 54 5c 22 22 2c 20 30 29 3b 0a 20 20   TEXT\"", 0);.  
8d90: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
8da0: 4f 52 3b 0a 20 20 7d 0a 20 20 70 72 69 6e 74 66  OR;.  }.  printf
8db0: 28 22 25 73 5c 6e 22 2c 20 61 72 67 76 5b 31 5d  ("%s\n", argv[1]
8dc0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
8dd0: 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 55  OK;.}..../*.** U
8de0: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
8df0: 70 72 69 6e 74 66 5f 69 6e 74 20 46 4f 52 4d 41  printf_int FORMA
8e00: 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  T INTEGER INTEGE
8e10: 52 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20  R INTEGER.**.** 
8e20: 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74  Call mprintf wit
8e30: 68 20 74 68 72 65 65 20 69 6e 74 65 67 65 72 20  h three integer 
8e40: 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61  arguments.*/.sta
8e50: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  tic int sqlite3_
8e60: 6d 70 72 69 6e 74 66 5f 69 6e 74 28 0a 20 20 76  mprintf_int(.  v
8e70: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
8e80: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
8e90: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
8ea0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
8eb0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
8ec0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
8ed0: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
8ee0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8ef0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
8f00: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
8f10: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
8f20: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
8f30: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d  */.){.  int a[3]
8f40: 2c 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  , i;.  char *z;.
8f50: 20 20 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b    if( argc!=5 ){
8f60: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
8f70: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
8f80: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
8f90: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
8fa0: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f  [0],.       " FO
8fb0: 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 49 4e 54  RMAT INT INT INT
8fc0: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
8fd0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8fe0: 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c   }.  for(i=2; i<
8ff0: 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  5; i++){.    if(
9000: 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65   Tcl_GetInt(inte
9010: 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b  rp, argv[i], &a[
9020: 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54  i-2]) ) return T
9030: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
9040: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
9050: 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30  ntf(argv[1], a[0
9060: 5d 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a  ], a[1], a[2]);.
9070: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
9080: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29  lt(interp, z, 0)
9090: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
90a0: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  (z);.  return TC
90b0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
90c0: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
90d0: 70 72 69 6e 74 66 5f 69 6e 74 36 34 20 46 4f 52  printf_int64 FOR
90e0: 4d 41 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45  MAT INTEGER INTE
90f0: 47 45 52 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a  GER INTEGER.**.*
9100: 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77  * Call mprintf w
9110: 69 74 68 20 74 68 72 65 65 20 36 34 2d 62 69 74  ith three 64-bit
9120: 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e   integer argumen
9130: 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ts.*/.static int
9140: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
9150: 5f 69 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a  _int64(.  void *
9160: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
9170: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
9180: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
9190: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
91a0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
91b0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
91c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
91d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
91e0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
91f0: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
9200: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
9210: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
9220: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69  .  int i;.  sqli
9230: 74 65 5f 69 6e 74 36 34 20 61 5b 33 5d 3b 0a 20  te_int64 a[3];. 
9240: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
9250: 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54  argc!=5 ){.    T
9260: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
9270: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
9280: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
9290: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
92a0: 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 49        " FORMAT I
92b0: 4e 54 20 49 4e 54 20 49 4e 54 5c 22 22 2c 20 30  NT INT INT\"", 0
92c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
92d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66  L_ERROR;.  }.  f
92e0: 6f 72 28 69 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b  or(i=2; i<5; i++
92f0: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
9300: 65 33 41 74 6f 69 36 34 28 61 72 67 76 5b 69 5d  e3Atoi64(argv[i]
9310: 2c 20 26 61 5b 69 2d 32 5d 2c 20 31 30 30 30 30  , &a[i-2], 10000
9320: 30 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  00, SQLITE_UTF8)
9330: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
9340: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
9350: 70 2c 20 22 61 72 67 75 6d 65 6e 74 20 69 73 20  p, "argument is 
9360: 6e 6f 74 20 61 20 76 61 6c 69 64 20 36 34 2d 62  not a valid 64-b
9370: 69 74 20 69 6e 74 65 67 65 72 22 2c 20 30 29 3b  it integer", 0);
9380: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
9390: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
93a0: 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33   }.  z = sqlite3
93b0: 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d  _mprintf(argv[1]
93c0: 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 5b  , a[0], a[1], a[
93d0: 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  2]);.  Tcl_Appen
93e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
93f0: 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  z, 0);.  sqlite3
9400: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75  _free(z);.  retu
9410: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
9420: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
9430: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67  te3_mprintf_long
9440: 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52 20   FORMAT INTEGER 
9450: 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 0a  INTEGER INTEGER.
9460: 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e  **.** Call mprin
9470: 74 66 20 77 69 74 68 20 74 68 72 65 65 20 6c 6f  tf with three lo
9480: 6e 67 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d  ng integer argum
9490: 65 6e 74 73 2e 20 20 20 54 68 69 73 20 6d 69 67  ents.   This mig
94a0: 68 74 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d  ht be the.** sam
94b0: 65 20 61 73 20 73 71 6c 69 74 65 33 5f 6d 70 72  e as sqlite3_mpr
94c0: 69 6e 74 66 5f 69 6e 74 20 6f 72 20 73 71 6c 69  intf_int or sqli
94d0: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36  te3_mprintf_int6
94e0: 34 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 0a  4, depending on.
94f0: 2a 2a 20 70 6c 61 74 66 6f 72 6d 2e 0a 2a 2f 0a  ** platform..*/.
9500: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
9510: 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67 28  e3_mprintf_long(
9520: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
9530: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
9540: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
9550: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
9560: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
9570: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
9580: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
9590: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
95a0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
95b0: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
95c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
95d0: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
95e0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ent */.){.  int 
95f0: 69 3b 0a 20 20 6c 6f 6e 67 20 69 6e 74 20 61 5b  i;.  long int a[
9600: 33 5d 3b 0a 20 20 69 6e 74 20 62 5b 33 5d 3b 0a  3];.  int b[3];.
9610: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28    char *z;.  if(
9620: 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20   argc!=5 ){.    
9630: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
9640: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
9650: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
9660: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
9670: 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20         " FORMAT 
9680: 49 4e 54 20 49 4e 54 20 49 4e 54 5c 22 22 2c 20  INT INT INT\"", 
9690: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
96a0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
96b0: 66 6f 72 28 69 3d 32 3b 20 69 3c 35 3b 20 69 2b  for(i=2; i<5; i+
96c0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f  +){.    if( Tcl_
96d0: 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
96e0: 72 67 76 5b 69 5d 2c 20 26 62 5b 69 2d 32 5d 29  rgv[i], &b[i-2])
96f0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
9700: 52 4f 52 3b 0a 20 20 20 20 61 5b 69 2d 32 5d 20  ROR;.    a[i-2] 
9710: 3d 20 28 6c 6f 6e 67 20 69 6e 74 29 62 5b 69 2d  = (long int)b[i-
9720: 32 5d 3b 0a 20 20 20 20 61 5b 69 2d 32 5d 20 26  2];.    a[i-2] &
9730: 3d 20 28 28 28 75 36 34 29 31 29 3c 3c 28 73 69  = (((u64)1)<<(si
9740: 7a 65 6f 66 28 69 6e 74 29 2a 38 29 29 2d 31 3b  zeof(int)*8))-1;
9750: 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74  .  }.  z = sqlit
9760: 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b  e3_mprintf(argv[
9770: 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20  1], a[0], a[1], 
9780: 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70  a[2]);.  Tcl_App
9790: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
97a0: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
97b0: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
97c0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
97d0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
97e0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74  lite3_mprintf_st
97f0: 72 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52  r FORMAT INTEGER
9800: 20 49 4e 54 45 47 45 52 20 53 54 52 49 4e 47 0a   INTEGER STRING.
9810: 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e  **.** Call mprin
9820: 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74 65  tf with two inte
9830: 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61 6e  ger arguments an
9840: 64 20 6f 6e 65 20 73 74 72 69 6e 67 20 61 72 67  d one string arg
9850: 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20  ument.*/.static 
9860: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  int sqlite3_mpri
9870: 6e 74 66 5f 73 74 72 28 0a 20 20 76 6f 69 64 20  ntf_str(.  void 
9880: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
9890: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
98a0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
98b0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
98c0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
98d0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
98e0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
98f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
9900: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
9910: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
9920: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
9930: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
9940: 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69 3b  {.  int a[3], i;
9950: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66  .  char *z;.  if
9960: 28 20 61 72 67 63 3c 34 20 7c 7c 20 61 72 67 63  ( argc<4 || argc
9970: 3e 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  >5 ){.    Tcl_Ap
9980: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
9990: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
99a0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
99b0: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
99c0: 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e   " FORMAT INT IN
99d0: 54 20 3f 53 54 52 49 4e 47 3f 5c 22 22 2c 20 30  T ?STRING?\"", 0
99e0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
99f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66  L_ERROR;.  }.  f
9a00: 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b 2b  or(i=2; i<4; i++
9a10: 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  ){.    if( Tcl_G
9a20: 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72  etInt(interp, ar
9a30: 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 29 20  gv[i], &a[i-2]) 
9a40: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
9a50: 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71  OR;.  }.  z = sq
9a60: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72  lite3_mprintf(ar
9a70: 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31  gv[1], a[0], a[1
9a80: 5d 2c 20 61 72 67 63 3e 34 20 3f 20 61 72 67 76  ], argc>4 ? argv
9a90: 5b 34 5d 20 3a 20 4e 55 4c 4c 29 3b 0a 20 20 54  [4] : NULL);.  T
9aa0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
9ab0: 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20  interp, z, 0);. 
9ac0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
9ad0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
9ae0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
9af0: 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  e:  sqlite3_snpr
9b00: 69 6e 74 66 5f 73 74 72 20 49 4e 54 45 47 45 52  intf_str INTEGER
9b10: 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52 20   FORMAT INTEGER 
9b20: 49 4e 54 45 47 45 52 20 53 54 52 49 4e 47 0a 2a  INTEGER STRING.*
9b30: 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74  *.** Call mprint
9b40: 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74 65 67  f with two integ
9b50: 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61 6e 64  er arguments and
9b60: 20 6f 6e 65 20 73 74 72 69 6e 67 20 61 72 67 75   one string argu
9b70: 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ment.*/.static i
9b80: 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  nt sqlite3_snpri
9b90: 6e 74 66 5f 73 74 72 28 0a 20 20 76 6f 69 64 20  ntf_str(.  void 
9ba0: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
9bb0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
9bc0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
9bd0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
9be0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
9bf0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
9c00: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
9c10: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
9c20: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
9c30: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
9c40: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
9c50: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
9c60: 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69 3b  {.  int a[3], i;
9c70: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61 72  .  int n;.  char
9c80: 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 3c   *z;.  if( argc<
9c90: 35 20 7c 7c 20 61 72 67 63 3e 36 20 29 7b 0a 20  5 || argc>6 ){. 
9ca0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
9cb0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
9cc0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
9cd0: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
9ce0: 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 4e 54 20  ],.       " INT 
9cf0: 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 3f  FORMAT INT INT ?
9d00: 53 54 52 49 4e 47 3f 5c 22 22 2c 20 30 29 3b 0a  STRING?\"", 0);.
9d10: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
9d20: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
9d30: 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72  Tcl_GetInt(inter
9d40: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 6e 29 20  p, argv[1], &n) 
9d50: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
9d60: 4f 52 3b 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b  OR;.  if( n<0 ){
9d70: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
9d80: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e  esult(interp, "N
9d90: 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 6e 65 67   must be non-neg
9da0: 61 74 69 76 65 22 2c 20 30 29 3b 0a 20 20 20 20  ative", 0);.    
9db0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9dc0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 33 3b  ;.  }.  for(i=3;
9dd0: 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<5; i++){.    
9de0: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69  if( Tcl_GetInt(i
9df0: 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20  nterp, argv[i], 
9e00: 26 61 5b 69 2d 33 5d 29 20 29 20 72 65 74 75 72  &a[i-3]) ) retur
9e10: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
9e20: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  z = sqlite3_m
9e30: 61 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20  alloc( n+1 );.  
9e40: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
9e50: 28 6e 2c 20 7a 2c 20 61 72 67 76 5b 32 5d 2c 20  (n, z, argv[2], 
9e60: 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 72 67 63  a[0], a[1], argc
9e70: 3e 34 20 3f 20 61 72 67 76 5b 35 5d 20 3a 20 4e  >4 ? argv[5] : N
9e80: 55 4c 4c 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  ULL);.  Tcl_Appe
9e90: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
9ea0: 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   z, 0);.  sqlite
9eb0: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74  3_free(z);.  ret
9ec0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
9ed0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
9ee0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75  ite3_mprintf_dou
9ef0: 62 6c 65 20 46 4f 52 4d 41 54 20 49 4e 54 45 47  ble FORMAT INTEG
9f00: 45 52 20 49 4e 54 45 47 45 52 20 44 4f 55 42 4c  ER INTEGER DOUBL
9f10: 45 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  E.**.** Call mpr
9f20: 69 6e 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e  intf with two in
9f30: 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20  teger arguments 
9f40: 61 6e 64 20 6f 6e 65 20 64 6f 75 62 6c 65 20 61  and one double a
9f50: 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69  rgument.*/.stati
9f60: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70  c int sqlite3_mp
9f70: 72 69 6e 74 66 5f 64 6f 75 62 6c 65 28 0a 20 20  rintf_double(.  
9f80: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
9f90: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
9fa0: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
9fb0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
9fc0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
9fd0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
9fe0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
9ff0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
a000: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
a010: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
a020: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
a030: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
a040: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33   */.){.  int a[3
a050: 5d 2c 20 69 3b 0a 20 20 64 6f 75 62 6c 65 20 72  ], i;.  double r
a060: 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  ;.  char *z;.  i
a070: 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20  f( argc!=5 ){.  
a080: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
a090: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
a0a0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
a0b0: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
a0c0: 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41  ,.       " FORMA
a0d0: 54 20 49 4e 54 20 49 4e 54 20 44 4f 55 42 4c 45  T INT INT DOUBLE
a0e0: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
a0f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
a100: 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c   }.  for(i=2; i<
a110: 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  4; i++){.    if(
a120: 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65   Tcl_GetInt(inte
a130: 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b  rp, argv[i], &a[
a140: 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54  i-2]) ) return T
a150: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
a160: 69 66 28 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c  if( Tcl_GetDoubl
a170: 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 34  e(interp, argv[4
a180: 5d 2c 20 26 72 29 20 29 20 72 65 74 75 72 6e 20  ], &r) ) return 
a190: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 20 3d  TCL_ERROR;.  z =
a1a0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
a1b0: 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20  (argv[1], a[0], 
a1c0: 61 5b 31 5d 2c 20 72 29 3b 0a 20 20 54 63 6c 5f  a[1], r);.  Tcl_
a1d0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
a1e0: 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71  erp, z, 0);.  sq
a1f0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
a200: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
a210: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
a220: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
a230: 5f 73 63 61 6c 65 64 20 46 4f 52 4d 41 54 20 44  _scaled FORMAT D
a240: 4f 55 42 4c 45 20 44 4f 55 42 4c 45 0a 2a 2a 0a  OUBLE DOUBLE.**.
a250: 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20  ** Call mprintf 
a260: 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 64 6f  with a single do
a270: 75 62 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68  uble argument wh
a280: 69 63 68 20 69 73 20 74 68 65 20 70 72 6f 64 75  ich is the produ
a290: 63 74 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f  ct of the.** two
a2a0: 20 61 72 67 75 6d 65 6e 74 73 20 67 69 76 65 6e   arguments given
a2b0: 20 61 62 6f 76 65 2e 20 20 54 68 69 73 20 69 73   above.  This is
a2c0: 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74   used to generat
a2d0: 65 20 6f 76 65 72 66 6c 6f 77 20 61 6e 64 20 75  e overflow and u
a2e0: 6e 64 65 72 66 6c 6f 77 0a 2a 2a 20 64 6f 75 62  nderflow.** doub
a2f0: 6c 65 73 20 74 6f 20 74 65 73 74 20 74 68 61 74  les to test that
a300: 20 74 68 65 79 20 61 72 65 20 63 6f 6e 76 65 72   they are conver
a310: 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f  ted properly..*/
a320: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
a330: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c  te3_mprintf_scal
a340: 65 64 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  ed(.  void *NotU
a350: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
a360: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
a370: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
a380: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
a390: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
a3a0: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
a3b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
a3c0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
a3d0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
a3e0: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
a3f0: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
a400: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  gument */.){.  i
a410: 6e 74 20 69 3b 0a 20 20 64 6f 75 62 6c 65 20 72  nt i;.  double r
a420: 5b 32 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  [2];.  char *z;.
a430: 20 20 69 66 28 20 61 72 67 63 21 3d 34 20 29 7b    if( argc!=4 ){
a440: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
a450: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
a460: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
a470: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
a480: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f  [0],.       " FO
a490: 52 4d 41 54 20 44 4f 55 42 4c 45 20 44 4f 55 42  RMAT DOUBLE DOUB
a4a0: 4c 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  LE\"", 0);.    r
a4b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a4c0: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20  .  }.  for(i=2; 
a4d0: 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<4; i++){.    i
a4e0: 66 28 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65  f( Tcl_GetDouble
a4f0: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d  (interp, argv[i]
a500: 2c 20 26 72 5b 69 2d 32 5d 29 20 29 20 72 65 74  , &r[i-2]) ) ret
a510: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
a520: 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33   }.  z = sqlite3
a530: 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d  _mprintf(argv[1]
a540: 2c 20 72 5b 30 5d 2a 72 5b 31 5d 29 3b 0a 20 20  , r[0]*r[1]);.  
a550: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
a560: 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a  (interp, z, 0);.
a570: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
a580: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
a590: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
a5a0: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge:  sqlite3_mpr
a5b0: 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 20 46 4f 52  intf_stronly FOR
a5c0: 4d 41 54 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a  MAT STRING.**.**
a5d0: 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69   Call mprintf wi
a5e0: 74 68 20 61 20 73 69 6e 67 6c 65 20 64 6f 75 62  th a single doub
a5f0: 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63  le argument whic
a600: 68 20 69 73 20 74 68 65 20 70 72 6f 64 75 63 74  h is the product
a610: 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20 61   of the.** two a
a620: 72 67 75 6d 65 6e 74 73 20 67 69 76 65 6e 20 61  rguments given a
a630: 62 6f 76 65 2e 20 20 54 68 69 73 20 69 73 20 75  bove.  This is u
a640: 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20  sed to generate 
a650: 6f 76 65 72 66 6c 6f 77 20 61 6e 64 20 75 6e 64  overflow and und
a660: 65 72 66 6c 6f 77 0a 2a 2a 20 64 6f 75 62 6c 65  erflow.** double
a670: 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 74  s to test that t
a680: 68 65 79 20 61 72 65 20 63 6f 6e 76 65 72 74 65  hey are converte
a690: 64 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 73  d properly..*/.s
a6a0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
a6b0: 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c  3_mprintf_stronl
a6c0: 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  y(.  void *NotUs
a6d0: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
a6e0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
a6f0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
a700: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
a710: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
a720: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
a730: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
a740: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
a750: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
a760: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
a770: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
a780: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68  ument */.){.  ch
a790: 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67  ar *z;.  if( arg
a7a0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
a7b0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
a7c0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
a7d0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
a7e0: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
a7f0: 20 20 20 22 20 46 4f 52 4d 41 54 20 53 54 52 49     " FORMAT STRI
a800: 4e 47 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  NG\"", 0);.    r
a810: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a820: 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74  .  }.  z = sqlit
a830: 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b  e3_mprintf(argv[
a840: 31 5d 2c 20 61 72 67 76 5b 32 5d 29 3b 0a 20 20  1], argv[2]);.  
a850: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
a860: 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a  (interp, z, 0);.
a870: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
a880: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
a890: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
a8a0: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge:  sqlite3_mpr
a8b0: 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65 20 46  intf_hexdouble F
a8c0: 4f 52 4d 41 54 20 48 45 58 0a 2a 2a 0a 2a 2a 20  ORMAT HEX.**.** 
a8d0: 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74  Call mprintf wit
a8e0: 68 20 61 20 73 69 6e 67 6c 65 20 64 6f 75 62 6c  h a single doubl
a8f0: 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68  e argument which
a900: 20 69 73 20 64 65 72 69 76 65 64 20 66 72 6f 6d   is derived from
a910: 20 74 68 65 0a 2a 2a 20 68 65 78 61 64 65 63 69   the.** hexadeci
a920: 6d 61 6c 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  mal encoding of 
a930: 61 6e 20 49 45 45 45 20 64 6f 75 62 6c 65 2e 0a  an IEEE double..
a940: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
a950: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65  lite3_mprintf_he
a960: 78 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20  xdouble(.  void 
a970: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
a980: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
a990: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
a9a0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
a9b0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
a9c0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
a9d0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
a9e0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
a9f0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
aa00: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
aa10: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
aa20: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
aa30: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 64  {.  char *z;.  d
aa40: 6f 75 62 6c 65 20 72 3b 0a 20 20 75 6e 73 69 67  ouble r;.  unsig
aa50: 6e 65 64 20 69 6e 74 20 78 31 2c 20 78 32 3b 0a  ned int x1, x2;.
aa60: 20 20 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 20    sqlite_uint64 
aa70: 64 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33  d;.  if( argc!=3
aa80: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
aa90: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
aaa0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
aab0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
aac0: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
aad0: 20 46 4f 52 4d 41 54 20 53 54 52 49 4e 47 5c 22   FORMAT STRING\"
aae0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
aaf0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
ab00: 0a 20 20 69 66 28 20 73 73 63 61 6e 66 28 61 72  .  if( sscanf(ar
ab10: 67 76 5b 32 5d 2c 20 22 25 30 38 78 25 30 38 78  gv[2], "%08x%08x
ab20: 22 2c 20 26 78 32 2c 20 26 78 31 29 21 3d 32 20  ", &x2, &x1)!=2 
ab30: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
ab40: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
ab50: 22 32 6e 64 20 61 72 67 75 6d 65 6e 74 20 73 68  "2nd argument sh
ab60: 6f 75 6c 64 20 62 65 20 31 36 2d 63 68 61 72 61  ould be 16-chara
ab70: 63 74 65 72 73 20 6f 66 20 68 65 78 22 2c 20 30  cters of hex", 0
ab80: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
ab90: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 64  L_ERROR;.  }.  d
aba0: 20 3d 20 78 32 3b 0a 20 20 64 20 3d 20 28 64 3c   = x2;.  d = (d<
abb0: 3c 33 32 29 20 2b 20 78 31 3b 0a 20 20 6d 65 6d  <32) + x1;.  mem
abc0: 63 70 79 28 26 72 2c 20 26 64 2c 20 73 69 7a 65  cpy(&r, &d, size
abd0: 6f 66 28 72 29 29 3b 0a 20 20 7a 20 3d 20 73 71  of(r));.  z = sq
abe0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72  lite3_mprintf(ar
abf0: 67 76 5b 31 5d 2c 20 72 29 3b 0a 20 20 54 63 6c  gv[1], r);.  Tcl
ac00: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
ac10: 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73  terp, z, 0);.  s
ac20: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
ac30: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
ac40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
ac50: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
ac60: 73 68 61 72 65 64 5f 63 61 63 68 65 20 3f 42 4f  shared_cache ?BO
ac70: 4f 4c 45 41 4e 3f 0a 2a 2a 0a 2a 2f 0a 23 69 66  OLEAN?.**.*/.#if
ac80: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
ac90: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
aca0: 48 45 29 0a 73 74 61 74 69 63 20 69 6e 74 20 74  HE).static int t
acb0: 65 73 74 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65  est_enable_share
acc0: 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  d(.  ClientData 
acd0: 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
ace0: 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
acf0: 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
ad00: 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
ad10: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
ad20: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
ad30: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
ad40: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
ad50: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
ad60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
ad70: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
ad80: 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
ad90: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
ada0: 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
adb0: 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
adc0: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 65 6e 61  nt rc;.  int ena
add0: 62 6c 65 3b 0a 20 20 69 6e 74 20 72 65 74 20 3d  ble;.  int ret =
ade0: 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   0;..  if( objc!
adf0: 3d 32 20 26 26 20 6f 62 6a 63 21 3d 31 20 29 7b  =2 && objc!=1 ){
ae00: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
ae10: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
ae20: 20 6f 62 6a 76 2c 20 22 3f 42 4f 4f 4c 45 41 4e   objv, "?BOOLEAN
ae30: 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ?");.    return 
ae40: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
ae50: 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 47 6c   ret = sqlite3Gl
ae60: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65  obalConfig.share
ae70: 64 43 61 63 68 65 45 6e 61 62 6c 65 64 3b 0a 0a  dCacheEnabled;..
ae80: 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b    if( objc==2 ){
ae90: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
aea0: 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
aeb0: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
aec0: 26 65 6e 61 62 6c 65 29 20 29 7b 0a 20 20 20 20  &enable) ){.    
aed0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
aee0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  OR;.    }.    rc
aef0: 20 3d 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c   = sqlite3_enabl
af00: 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 28 65  e_shared_cache(e
af10: 6e 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  nable);.    if( 
af20: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
af30: 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65  .      Tcl_SetRe
af40: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
af50: 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72 72 53  ar *)sqlite3ErrS
af60: 74 72 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  tr(rc), TCL_STAT
af70: 49 43 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  IC);.      retur
af80: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
af90: 20 7d 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74   }.  }.  Tcl_Set
afa0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
afb0: 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e  , Tcl_NewBoolean
afc0: 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20 72 65 74  Obj(ret));.  ret
afd0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
afe0: 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73  ndif..../*.** Us
aff0: 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 78 74  age: sqlite3_ext
b000: 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64  ended_result_cod
b010: 65 73 20 20 20 44 42 20 20 20 20 42 4f 4f 4c 45  es   DB    BOOLE
b020: 41 4e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  AN.**.*/.static 
b030: 69 6e 74 20 74 65 73 74 5f 65 78 74 65 6e 64 65  int test_extende
b040: 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28 0a  d_result_codes(.
b050: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
b060: 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
b070: 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
b080: 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
b090: 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
b0a0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
b0b0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
b0c0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
b0d0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
b0e0: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
b0f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
b100: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
b110: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
b120: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
b130: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
b140: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nts */.){.  int 
b150: 65 6e 61 62 6c 65 3b 0a 20 20 73 71 6c 69 74 65  enable;.  sqlite
b160: 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 6f 62  3 *db;..  if( ob
b170: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
b180: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
b190: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
b1a0: 44 42 20 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20  DB BOOLEAN");.  
b1b0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
b1c0: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
b1d0: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
b1e0: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
b1f0: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
b200: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
b210: 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
b220: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
b230: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
b240: 20 26 65 6e 61 62 6c 65 29 20 29 20 72 65 74 75   &enable) ) retu
b250: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
b260: 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
b270: 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28 64 62  _result_codes(db
b280: 2c 20 65 6e 61 62 6c 65 29 3b 0a 20 20 72 65 74  , enable);.  ret
b290: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
b2a0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
b2b0: 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e  te3_libversion_n
b2c0: 75 6d 62 65 72 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  umber.**.*/.stat
b2d0: 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 69 62 76  ic int test_libv
b2e0: 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 0a 20  ersion_number(. 
b2f0: 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
b300: 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
b310: 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
b320: 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
b330: 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
b340: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
b350: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
b360: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
b370: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
b380: 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
b390: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
b3a0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
b3b0: 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
b3c0: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
b3d0: 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
b3e0: 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 53  ts */.){.  Tcl_S
b3f0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
b400: 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
b410: 6a 28 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  j(sqlite3_libver
b420: 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 29 29 29 3b  sion_number()));
b430: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
b440: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
b450: 3a 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f  : sqlite3_table_
b460: 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 20  column_metadata 
b470: 44 42 20 64 62 6e 61 6d 65 20 74 62 6c 6e 61 6d  DB dbname tblnam
b480: 65 20 63 6f 6c 6e 61 6d 65 0a 2a 2a 0a 2a 2f 0a  e colname.**.*/.
b490: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
b4a0: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
b4b0: 44 41 54 41 0a 73 74 61 74 69 63 20 69 6e 74 20  DATA.static int 
b4c0: 74 65 73 74 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  test_table_colum
b4d0: 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 43 6c  n_metadata(.  Cl
b4e0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
b4f0: 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
b500: 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
b510: 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
b520: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
b530: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
b540: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
b550: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
b560: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
b570: 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
b580: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
b590: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
b5a0: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
b5b0: 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
b5c0: 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
b5d0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
b5e0: 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db;.  const cha
b5f0: 72 20 2a 7a 44 62 3b 0a 20 20 63 6f 6e 73 74 20  r *zDb;.  const 
b600: 63 68 61 72 20 2a 7a 54 62 6c 3b 0a 20 20 63 6f  char *zTbl;.  co
b610: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a  nst char *zCol;.
b620: 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 63 6c 5f    int rc;.  Tcl_
b630: 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a 20 20 63 6f  Obj *pRet;..  co
b640: 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 74  nst char *zDatat
b650: 79 70 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ype;.  const cha
b660: 72 20 2a 7a 43 6f 6c 6c 73 65 71 3b 0a 20 20 69  r *zCollseq;.  i
b670: 6e 74 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 6e  nt notnull;.  in
b680: 74 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20  t primarykey;.  
b690: 69 6e 74 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e  int autoincremen
b6a0: 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  t;..  if( objc!=
b6b0: 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  5 ){.    Tcl_Wro
b6c0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
b6d0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 64  , 1, objv, "DB d
b6e0: 62 6e 61 6d 65 20 74 62 6c 6e 61 6d 65 20 63 6f  bname tblname co
b6f0: 6c 6e 61 6d 65 22 29 3b 0a 20 20 20 20 72 65 74  lname");.    ret
b700: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b710: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
b720: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
b730: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
b740: 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
b750: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b760: 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74   zDb = Tcl_GetSt
b770: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
b780: 20 7a 54 62 6c 20 3d 20 54 63 6c 5f 47 65 74 53   zTbl = Tcl_GetS
b790: 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a  tring(objv[3]);.
b7a0: 20 20 7a 43 6f 6c 20 3d 20 54 63 6c 5f 47 65 74    zCol = Tcl_Get
b7b0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b  String(objv[4]);
b7c0: 0a 0a 20 20 69 66 28 20 73 74 72 6c 65 6e 28 7a  ..  if( strlen(z
b7d0: 44 62 29 3d 3d 30 20 29 20 7a 44 62 20 3d 20 30  Db)==0 ) zDb = 0
b7e0: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
b7f0: 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
b800: 65 74 61 64 61 74 61 28 64 62 2c 20 7a 44 62 2c  etadata(db, zDb,
b810: 20 7a 54 62 6c 2c 20 7a 43 6f 6c 2c 20 0a 20 20   zTbl, zCol, .  
b820: 20 20 20 20 26 7a 44 61 74 61 74 79 70 65 2c 20      &zDatatype, 
b830: 26 7a 43 6f 6c 6c 73 65 71 2c 20 26 6e 6f 74 6e  &zCollseq, &notn
b840: 75 6c 6c 2c 20 26 70 72 69 6d 61 72 79 6b 65 79  ull, &primarykey
b850: 2c 20 26 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74  , &autoincrement
b860: 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  );..  if( rc!=SQ
b870: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
b880: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
b890: 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f  interp, sqlite3_
b8a0: 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a  errmsg(db), 0);.
b8b0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
b8c0: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 52 65  RROR;.  }..  pRe
b8d0: 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29  t = Tcl_NewObj()
b8e0: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
b8f0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
b900: 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pRet, Tcl_NewStr
b910: 69 6e 67 4f 62 6a 28 7a 44 61 74 61 74 79 70 65  ingObj(zDatatype
b920: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
b930: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
b940: 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f  nt(0, pRet, Tcl_
b950: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 43 6f  NewStringObj(zCo
b960: 6c 6c 73 65 71 2c 20 2d 31 29 29 3b 0a 20 20 54  llseq, -1));.  T
b970: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
b980: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c  Element(0, pRet,
b990: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e   Tcl_NewIntObj(n
b9a0: 6f 74 6e 75 6c 6c 29 29 3b 0a 20 20 54 63 6c 5f  otnull));.  Tcl_
b9b0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
b9c0: 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63  ment(0, pRet, Tc
b9d0: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 70 72 69 6d  l_NewIntObj(prim
b9e0: 61 72 79 6b 65 79 29 29 3b 0a 20 20 54 63 6c 5f  arykey));.  Tcl_
b9f0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
ba00: 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63  ment(0, pRet, Tc
ba10: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 75 74 6f  l_NewIntObj(auto
ba20: 69 6e 63 72 65 6d 65 6e 74 29 29 3b 0a 20 20 54  increment));.  T
ba30: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
ba40: 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 0a  interp, pRet);..
ba50: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
ba60: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
ba70: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
ba80: 4e 43 52 42 4c 4f 42 0a 0a 73 74 61 74 69 63 20  NCRBLOB..static 
ba90: 69 6e 74 20 62 6c 6f 62 48 61 6e 64 6c 65 46 72  int blobHandleFr
baa0: 6f 6d 4f 62 6a 28 0a 20 20 54 63 6c 5f 49 6e 74  omObj(.  Tcl_Int
bab0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20  erp *interp, .  
bac0: 54 63 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 2c 0a 20  Tcl_Obj *pObj,. 
bad0: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 2a   sqlite3_blob **
bae0: 70 70 42 6c 6f 62 0a 29 7b 0a 20 20 63 68 61 72  ppBlob.){.  char
baf0: 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20   *z;.  int n;.. 
bb00: 20 7a 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69   z = Tcl_GetStri
bb10: 6e 67 46 72 6f 6d 4f 62 6a 28 70 4f 62 6a 2c 20  ngFromObj(pObj, 
bb20: 26 6e 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 30 20  &n);.  if( n==0 
bb30: 29 7b 0a 20 20 20 20 2a 70 70 42 6c 6f 62 20 3d  ){.    *ppBlob =
bb40: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
bb50: 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20   int notUsed;.  
bb60: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68    Tcl_Channel ch
bb70: 61 6e 6e 65 6c 3b 0a 20 20 20 20 43 6c 69 65 6e  annel;.    Clien
bb80: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61  tData instanceDa
bb90: 74 61 3b 0a 20 20 20 20 0a 20 20 20 20 63 68 61  ta;.    .    cha
bba0: 6e 6e 65 6c 20 3d 20 54 63 6c 5f 47 65 74 43 68  nnel = Tcl_GetCh
bbb0: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 7a 2c  annel(interp, z,
bbc0: 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20   &notUsed);.    
bbd0: 69 66 28 20 21 63 68 61 6e 6e 65 6c 20 29 20 72  if( !channel ) r
bbe0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
bbf0: 0a 0a 20 20 20 20 54 63 6c 5f 46 6c 75 73 68 28  ..    Tcl_Flush(
bc00: 63 68 61 6e 6e 65 6c 29 3b 0a 20 20 20 20 54 63  channel);.    Tc
bc10: 6c 5f 53 65 65 6b 28 63 68 61 6e 6e 65 6c 2c 20  l_Seek(channel, 
bc20: 30 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 0a 20  0, SEEK_SET);.. 
bc30: 20 20 20 69 6e 73 74 61 6e 63 65 44 61 74 61 20     instanceData 
bc40: 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  = Tcl_GetChannel
bc50: 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61  InstanceData(cha
bc60: 6e 6e 65 6c 29 3b 0a 20 20 20 20 2a 70 70 42 6c  nnel);.    *ppBl
bc70: 6f 62 20 3d 20 2a 28 28 73 71 6c 69 74 65 33 5f  ob = *((sqlite3_
bc80: 62 6c 6f 62 20 2a 2a 29 69 6e 73 74 61 6e 63 65  blob **)instance
bc90: 44 61 74 61 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  Data);.  }..  re
bca0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
bcb0: 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 62 6c  /*.** sqlite3_bl
bcc0: 6f 62 5f 62 79 74 65 73 20 20 43 48 41 4e 4e 45  ob_bytes  CHANNE
bcd0: 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  L.*/.static int 
bce0: 74 65 73 74 5f 62 6c 6f 62 5f 62 79 74 65 73 28  test_blob_bytes(
bcf0: 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
bd00: 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74  ientData, /* Not
bd10: 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49   used */.  Tcl_I
bd20: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
bd30: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
bd40: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
bd50: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
bd60: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
bd70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
bd80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
bd90: 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
bda0: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
bdb0: 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
bdc0: 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73  uments */.){.  s
bdd0: 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c  qlite3_blob *pBl
bde0: 6f 62 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  ob;.  int nByte;
bdf0: 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  .  .  if( objc!=
be00: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
be10: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
be20: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 43 48 41 4e  , 1, objv, "CHAN
be30: 4e 45 4c 22 29 3b 0a 20 20 20 20 72 65 74 75 72  NEL");.    retur
be40: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
be50: 0a 0a 20 20 69 66 28 20 62 6c 6f 62 48 61 6e 64  ..  if( blobHand
be60: 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  leFromObj(interp
be70: 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 70 42 6c 6f  , objv[1], &pBlo
be80: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
be90: 45 52 52 4f 52 3b 0a 20 20 6e 42 79 74 65 20 3d  ERROR;.  nByte =
bea0: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79   sqlite3_blob_by
beb0: 74 65 73 28 70 42 6c 6f 62 29 3b 0a 20 20 54 63  tes(pBlob);.  Tc
bec0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
bed0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
bee0: 74 4f 62 6a 28 6e 42 79 74 65 29 29 3b 0a 0a 20  tObj(nByte));.. 
bef0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
bf00: 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  }../*.** sqlite3
bf10: 5f 62 6c 6f 62 5f 63 6c 6f 73 65 20 20 43 48 41  _blob_close  CHA
bf20: 4e 4e 45 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 69  NNEL.*/.static i
bf30: 6e 74 20 74 65 73 74 5f 62 6c 6f 62 5f 63 6c 6f  nt test_blob_clo
bf40: 73 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  se(.  ClientData
bf50: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
bf60: 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63  Not used */.  Tc
bf70: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
bf80: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
bf90: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
bfa0: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
bfb0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
bfc0: 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
bfd0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
bfe0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
bff0: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
c000: 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
c010: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
c020: 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a    sqlite3_blob *
c030: 70 42 6c 6f 62 3b 0a 20 20 0a 20 20 69 66 28 20  pBlob;.  .  if( 
c040: 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
c050: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
c060: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
c070: 20 22 43 48 41 4e 4e 45 4c 22 29 3b 0a 20 20 20   "CHANNEL");.   
c080: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
c090: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 6c  R;.  }..  if( bl
c0a0: 6f 62 48 61 6e 64 6c 65 46 72 6f 6d 4f 62 6a 28  obHandleFromObj(
c0b0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
c0c0: 20 26 70 42 6c 6f 62 29 20 29 20 72 65 74 75 72   &pBlob) ) retur
c0d0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73  n TCL_ERROR;.  s
c0e0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73  qlite3_blob_clos
c0f0: 65 28 70 42 6c 6f 62 29 3b 0a 0a 20 20 72 65 74  e(pBlob);..  ret
c100: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
c110: 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 62 6c 6f  *.** sqlite3_blo
c120: 62 5f 72 65 61 64 20 20 43 48 41 4e 4e 45 4c 20  b_read  CHANNEL 
c130: 4f 46 46 53 45 54 20 4e 0a 2a 2a 0a 2a 2a 20 20  OFFSET N.**.**  
c140: 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73   This command is
c150: 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 74 68   used to test th
c160: 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72  e sqlite3_blob_r
c170: 65 61 64 28 29 20 69 6e 20 77 61 79 73 20 74 68  ead() in ways th
c180: 61 74 0a 2a 2a 20 20 20 74 68 65 20 54 63 6c 20  at.**   the Tcl 
c190: 63 68 61 6e 6e 65 6c 20 69 6e 74 65 72 66 61 63  channel interfac
c1a0: 65 20 64 6f 65 73 20 6e 6f 74 2e 20 54 68 65 20  e does not. The 
c1b0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 73  first argument s
c1c0: 68 6f 75 6c 64 0a 2a 2a 20 20 20 62 65 20 74 68  hould.**   be th
c1d0: 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69  e name of a vali
c1e0: 64 20 63 68 61 6e 6e 65 6c 20 63 72 65 61 74 65  d channel create
c1f0: 64 20 62 79 20 74 68 65 20 5b 69 6e 63 72 62 6c  d by the [incrbl
c200: 6f 62 5d 20 6d 65 74 68 6f 64 0a 2a 2a 20 20 20  ob] method.**   
c210: 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 68 61  of a database ha
c220: 6e 64 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74  ndle. This funct
c230: 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74 65  ion calls sqlite
c240: 33 5f 62 6c 6f 62 5f 72 65 61 64 28 29 0a 2a 2a  3_blob_read().**
c250: 20 20 20 74 6f 20 72 65 61 64 20 4e 20 62 79 74     to read N byt
c260: 65 73 20 66 72 6f 6d 20 6f 66 66 73 65 74 20 4f  es from offset O
c270: 46 46 53 45 54 20 66 72 6f 6d 20 74 68 65 20 75  FFSET from the u
c280: 6e 64 65 72 6c 79 69 6e 67 20 53 51 4c 69 74 65  nderlying SQLite
c290: 0a 2a 2a 20 20 20 62 6c 6f 62 20 68 61 6e 64 6c  .**   blob handl
c2a0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4f 6e 20 73 75  e..**.**   On su
c2b0: 63 63 65 73 73 2c 20 61 20 62 79 74 65 2d 61 72  ccess, a byte-ar
c2c0: 72 61 79 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61  ray object conta
c2d0: 69 6e 69 6e 67 20 74 68 65 20 72 65 61 64 20 64  ining the read d
c2e0: 61 74 61 20 69 73 20 0a 2a 2a 20 20 20 72 65 74  ata is .**   ret
c2f0: 75 72 6e 65 64 2e 20 4f 6e 20 66 61 69 6c 75 72  urned. On failur
c300: 65 2c 20 74 68 65 20 69 6e 74 65 72 70 72 65 74  e, the interpret
c310: 65 72 20 72 65 73 75 6c 74 20 69 73 20 73 65 74  er result is set
c320: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 74 65 78   to the.**   tex
c330: 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  t representation
c340: 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   of the returned
c350: 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65   error code (i.e
c360: 2e 20 22 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22  . "SQLITE_NOMEM"
c370: 29 0a 2a 2a 20 20 20 61 6e 64 20 61 20 54 63 6c  ).**   and a Tcl
c380: 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 74 68   exception is th
c390: 72 6f 77 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rown..*/.static 
c3a0: 69 6e 74 20 74 65 73 74 5f 62 6c 6f 62 5f 72 65  int test_blob_re
c3b0: 61 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  ad(.  ClientData
c3c0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
c3d0: 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63  Not used */.  Tc
c3e0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
c3f0: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
c400: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
c410: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
c420: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
c430: 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
c440: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
c450: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
c460: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
c470: 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
c480: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
c490: 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a    sqlite3_blob *
c4a0: 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 6e 42 79  pBlob;.  int nBy
c4b0: 74 65 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65  te;.  int iOffse
c4c0: 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  t;.  unsigned ch
c4d0: 61 72 20 2a 7a 42 75 66 20 3d 20 30 3b 0a 20 20  ar *zBuf = 0;.  
c4e0: 69 6e 74 20 72 63 3b 0a 20 20 0a 20 20 69 66 28  int rc;.  .  if(
c4f0: 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
c500: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
c510: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
c520: 2c 20 22 43 48 41 4e 4e 45 4c 20 4f 46 46 53 45  , "CHANNEL OFFSE
c530: 54 20 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  T N");.    retur
c540: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
c550: 0a 0a 20 20 69 66 28 20 62 6c 6f 62 48 61 6e 64  ..  if( blobHand
c560: 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  leFromObj(interp
c570: 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 70 42 6c 6f  , objv[1], &pBlo
c580: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
c590: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 43 4c  ERROR;.  if( TCL
c5a0: 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46  _OK!=Tcl_GetIntF
c5b0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
c5c0: 62 6a 76 5b 32 5d 2c 20 26 69 4f 66 66 73 65 74  bjv[2], &iOffset
c5d0: 29 0a 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d  ).   || TCL_OK!=
c5e0: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
c5f0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
c600: 5d 2c 20 26 6e 42 79 74 65 29 0a 20 20 29 7b 20  ], &nByte).  ){ 
c610: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
c620: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
c630: 28 20 6e 42 79 74 65 3e 30 20 29 7b 0a 20 20 20  ( nByte>0 ){.   
c640: 20 7a 42 75 66 20 3d 20 28 75 6e 73 69 67 6e 65   zBuf = (unsigne
c650: 64 20 63 68 61 72 20 2a 29 54 63 6c 5f 41 6c 6c  d char *)Tcl_All
c660: 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20  oc(nByte);.  }. 
c670: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c   rc = sqlite3_bl
c680: 6f 62 5f 72 65 61 64 28 70 42 6c 6f 62 2c 20 7a  ob_read(pBlob, z
c690: 42 75 66 2c 20 6e 42 79 74 65 2c 20 69 4f 66 66  Buf, nByte, iOff
c6a0: 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  set);.  if( rc==
c6b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c6c0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
c6d0: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
c6e0: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 7a 42  wByteArrayObj(zB
c6f0: 75 66 2c 20 6e 42 79 74 65 29 29 3b 0a 20 20 7d  uf, nByte));.  }
c700: 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 53 65  else{.    Tcl_Se
c710: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
c720: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 54  (char *)sqlite3T
c730: 65 73 74 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  estErrorName(rc)
c740: 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
c750: 0a 20 20 7d 0a 20 20 54 63 6c 5f 46 72 65 65 28  .  }.  Tcl_Free(
c760: 28 63 68 61 72 20 2a 29 7a 42 75 66 29 3b 0a 0a  (char *)zBuf);..
c770: 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
c780: 4c 49 54 45 5f 4f 4b 20 3f 20 54 43 4c 5f 4f 4b  LITE_OK ? TCL_OK
c790: 20 3a 20 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 7d   : TCL_ERROR);.}
c7a0: 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  ../*.** sqlite3_
c7b0: 62 6c 6f 62 5f 77 72 69 74 65 20 43 48 41 4e 4e  blob_write CHANN
c7c0: 45 4c 20 4f 46 46 53 45 54 20 44 41 54 41 20 3f  EL OFFSET DATA ?
c7d0: 4e 44 41 54 41 3f 0a 2a 2a 0a 2a 2a 20 20 20 54  NDATA?.**.**   T
c7e0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75  his command is u
c7f0: 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 65 20  sed to test the 
c800: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69  sqlite3_blob_wri
c810: 74 65 28 29 20 69 6e 20 77 61 79 73 20 74 68 61  te() in ways tha
c820: 74 0a 2a 2a 20 20 20 74 68 65 20 54 63 6c 20 63  t.**   the Tcl c
c830: 68 61 6e 6e 65 6c 20 69 6e 74 65 72 66 61 63 65  hannel interface
c840: 20 64 6f 65 73 20 6e 6f 74 2e 20 54 68 65 20 66   does not. The f
c850: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 73 68  irst argument sh
c860: 6f 75 6c 64 0a 2a 2a 20 20 20 62 65 20 74 68 65  ould.**   be the
c870: 20 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64   name of a valid
c880: 20 63 68 61 6e 6e 65 6c 20 63 72 65 61 74 65 64   channel created
c890: 20 62 79 20 74 68 65 20 5b 69 6e 63 72 62 6c 6f   by the [incrblo
c8a0: 62 5d 20 6d 65 74 68 6f 64 0a 2a 2a 20 20 20 6f  b] method.**   o
c8b0: 66 20 61 20 64 61 74 61 62 61 73 65 20 68 61 6e  f a database han
c8c0: 64 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  dle. This functi
c8d0: 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33  on calls sqlite3
c8e0: 5f 62 6c 6f 62 5f 77 72 69 74 65 28 29 0a 2a 2a  _blob_write().**
c8f0: 20 20 20 74 6f 20 77 72 69 74 65 20 74 68 65 20     to write the 
c900: 44 41 54 41 20 62 79 74 65 2d 61 72 72 61 79 20  DATA byte-array 
c910: 74 6f 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  to the underlyin
c920: 67 20 53 51 4c 69 74 65 20 62 6c 6f 62 20 68 61  g SQLite blob ha
c930: 6e 64 6c 65 2e 0a 2a 2a 20 20 20 61 74 20 6f 66  ndle..**   at of
c940: 66 73 65 74 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a  fset OFFSET..**.
c950: 2a 2a 20 20 20 4f 6e 20 73 75 63 63 65 73 73 2c  **   On success,
c960: 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
c970: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 6e   is returned. On
c980: 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 69 6e   failure, the in
c990: 74 65 72 70 72 65 74 65 72 0a 2a 2a 20 20 20 72  terpreter.**   r
c9a0: 65 73 75 6c 74 20 69 73 20 73 65 74 20 74 6f 20  esult is set to 
c9b0: 74 68 65 20 74 65 78 74 20 72 65 70 72 65 73 65  the text represe
c9c0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 72  ntation of the r
c9d0: 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 63 6f  eturned error co
c9e0: 64 65 20 0a 2a 2a 20 20 20 28 69 2e 65 2e 20 22  de .**   (i.e. "
c9f0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 29 20 61  SQLITE_NOMEM") a
ca00: 6e 64 20 61 20 54 63 6c 20 65 78 63 65 70 74 69  nd a Tcl excepti
ca10: 6f 6e 20 69 73 20 74 68 72 6f 77 6e 2e 0a 2a 2f  on is thrown..*/
ca20: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
ca30: 5f 62 6c 6f 62 5f 77 72 69 74 65 28 0a 20 20 43  _blob_write(.  C
ca40: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
ca50: 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65  Data, /* Not use
ca60: 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  d */.  Tcl_Inter
ca70: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
ca80: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
ca90: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
caa0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
cab0: 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
cac0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
cad0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
cae0: 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
caf0: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
cb00: 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
cb10: 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
cb20: 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a  e3_blob *pBlob;.
cb30: 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20    int iOffset;. 
cb40: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 75 6e 73 69   int rc;..  unsi
cb50: 67 6e 65 64 20 63 68 61 72 20 2a 7a 42 75 66 3b  gned char *zBuf;
cb60: 0a 20 20 69 6e 74 20 6e 42 75 66 3b 0a 20 20 0a  .  int nBuf;.  .
cb70: 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 26 26    if( objc!=4 &&
cb80: 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20   objc!=5 ){.    
cb90: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
cba0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
cbb0: 2c 20 22 43 48 41 4e 4e 45 4c 20 4f 46 46 53 45  , "CHANNEL OFFSE
cbc0: 54 20 44 41 54 41 20 3f 4e 44 41 54 41 3f 22 29  T DATA ?NDATA?")
cbd0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
cbe0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
cbf0: 66 28 20 62 6c 6f 62 48 61 6e 64 6c 65 46 72 6f  f( blobHandleFro
cc00: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
cc10: 76 5b 31 5d 2c 20 26 70 42 6c 6f 62 29 20 29 20  v[1], &pBlob) ) 
cc20: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
cc30: 3b 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d  ;.  if( TCL_OK!=
cc40: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
cc50: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
cc60: 5d 2c 20 26 69 4f 66 66 73 65 74 29 20 29 7b 20  ], &iOffset) ){ 
cc70: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
cc80: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 42  ERROR;.  }..  zB
cc90: 75 66 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65  uf = Tcl_GetByte
cca0: 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a  ArrayFromObj(obj
ccb0: 76 5b 33 5d 2c 20 26 6e 42 75 66 29 3b 0a 20 20  v[3], &nBuf);.  
ccc0: 69 66 28 20 6f 62 6a 63 3d 3d 35 20 26 26 20 54  if( objc==5 && T
ccd0: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
cce0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d  (interp, objv[4]
ccf0: 2c 20 26 6e 42 75 66 29 20 29 7b 0a 20 20 20 20  , &nBuf) ){.    
cd00: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
cd10: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
cd20: 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28  ite3_blob_write(
cd30: 70 42 6c 6f 62 2c 20 7a 42 75 66 2c 20 6e 42 75  pBlob, zBuf, nBu
cd40: 66 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 69  f, iOffset);.  i
cd50: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
cd60: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52   ){.    Tcl_SetR
cd70: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
cd80: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 54 65 73  har *)sqlite3Tes
cd90: 74 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  tErrorName(rc), 
cda0: 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20  TCL_VOLATILE);. 
cdb0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63   }..  return (rc
cdc0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 43  ==SQLITE_OK ? TC
cdd0: 4c 5f 4f 4b 20 3a 20 54 43 4c 5f 45 52 52 4f 52  L_OK : TCL_ERROR
cde0: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
cdf0: 20 74 65 73 74 5f 62 6c 6f 62 5f 72 65 6f 70 65   test_blob_reope
ce00: 6e 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  n(.  ClientData 
ce10: 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e  clientData, /* N
ce20: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c  ot used */.  Tcl
ce30: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
ce40: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
ce50: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
ce60: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
ce70: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
ce80: 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
ce90: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
cea0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
ceb0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
cec0: 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
ced0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
cee0: 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 69 52 6f   Tcl_WideInt iRo
cef0: 77 69 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  wid;.  sqlite3_b
cf00: 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e  lob *pBlob;.  in
cf10: 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
cf20: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
cf30: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
cf40: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 43  erp, 1, objv, "C
cf50: 48 41 4e 4e 45 4c 20 52 4f 57 49 44 22 29 3b 0a  HANNEL ROWID");.
cf60: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
cf70: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
cf80: 20 62 6c 6f 62 48 61 6e 64 6c 65 46 72 6f 6d 4f   blobHandleFromO
cf90: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
cfa0: 31 5d 2c 20 26 70 42 6c 6f 62 29 20 29 20 72 65  1], &pBlob) ) re
cfb0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
cfc0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 57 69 64    if( Tcl_GetWid
cfd0: 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  eIntFromObj(inte
cfe0: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 52  rp, objv[2], &iR
cff0: 6f 77 69 64 29 20 29 20 72 65 74 75 72 6e 20 54  owid) ) return T
d000: 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
d010: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72  = sqlite3_blob_r
d020: 65 6f 70 65 6e 28 70 42 6c 6f 62 2c 20 69 52 6f  eopen(pBlob, iRo
d030: 77 69 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  wid);.  if( rc!=
d040: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d050: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
d060: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73  nterp, (char *)s
d070: 71 6c 69 74 65 33 54 65 73 74 45 72 72 6f 72 4e  qlite3TestErrorN
d080: 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 56 4f 4c  ame(rc), TCL_VOL
d090: 41 54 49 4c 45 29 3b 0a 20 20 7d 0a 0a 20 20 72  ATILE);.  }..  r
d0a0: 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
d0b0: 45 5f 4f 4b 20 3f 20 54 43 4c 5f 4f 4b 20 3a 20  E_OK ? TCL_OK : 
d0c0: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 7d 0a 0a 23  TCL_ERROR);.}..#
d0d0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  endif../*.** Usa
d0e0: 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 72 65 61  ge: sqlite3_crea
d0f0: 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 20  te_collation_v2 
d100: 44 42 2d 48 41 4e 44 4c 45 20 4e 41 4d 45 20 43  DB-HANDLE NAME C
d110: 4d 50 2d 50 52 4f 43 20 44 45 4c 2d 50 52 4f 43  MP-PROC DEL-PROC
d120: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 54 63  .**.**   This Tc
d130: 6c 20 70 72 6f 63 20 69 73 20 75 73 65 64 20 66  l proc is used f
d140: 6f 72 20 74 65 73 74 69 6e 67 20 74 68 65 20 65  or testing the e
d150: 78 70 65 72 69 6d 65 6e 74 61 6c 0a 2a 2a 20 20  xperimental.**  
d160: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
d170: 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 29 20 69  collation_v2() i
d180: 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 72  nterface..*/.str
d190: 75 63 74 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f  uct TestCollatio
d1a0: 6e 58 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  nX {.  Tcl_Inter
d1b0: 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c  p *interp;.  Tcl
d1c0: 5f 4f 62 6a 20 2a 70 43 6d 70 3b 0a 20 20 54 63  _Obj *pCmp;.  Tc
d1d0: 6c 5f 4f 62 6a 20 2a 70 44 65 6c 3b 0a 7d 3b 0a  l_Obj *pDel;.};.
d1e0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 54  typedef struct T
d1f0: 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 54 65  estCollationX Te
d200: 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 3b 0a 73 74  stCollationX;.st
d210: 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 43 72  atic void testCr
d220: 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c  eateCollationDel
d230: 28 76 6f 69 64 20 2a 70 43 74 78 29 7b 0a 20 20  (void *pCtx){.  
d240: 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a  TestCollationX *
d250: 70 20 3d 20 28 54 65 73 74 43 6f 6c 6c 61 74 69  p = (TestCollati
d260: 6f 6e 58 20 2a 29 70 43 74 78 3b 0a 0a 20 20 69  onX *)pCtx;..  i
d270: 6e 74 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c  nt rc = Tcl_Eval
d280: 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c  ObjEx(p->interp,
d290: 20 70 2d 3e 70 44 65 6c 2c 20 54 43 4c 5f 45 56   p->pDel, TCL_EV
d2a0: 41 4c 5f 44 49 52 45 43 54 7c 54 43 4c 5f 45 56  AL_DIRECT|TCL_EV
d2b0: 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 69 66  AL_GLOBAL);.  if
d2c0: 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a  ( rc!=TCL_OK ){.
d2d0: 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75      Tcl_Backgrou
d2e0: 6e 64 45 72 72 6f 72 28 70 2d 3e 69 6e 74 65 72  ndError(p->inter
d2f0: 70 29 3b 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 44  p);.  }..  Tcl_D
d300: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70  ecrRefCount(p->p
d310: 43 6d 70 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72  Cmp);.  Tcl_Decr
d320: 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 44 65 6c  RefCount(p->pDel
d330: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
d340: 65 28 28 76 6f 69 64 20 2a 29 70 29 3b 0a 7d 0a  e((void *)p);.}.
d350: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 43  static int testC
d360: 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 43 6d  reateCollationCm
d370: 70 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  p(.  void *pCtx,
d380: 0a 20 20 69 6e 74 20 6e 4c 65 66 74 2c 0a 20 20  .  int nLeft,.  
d390: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4c 65 66  const void *zLef
d3a0: 74 2c 0a 20 20 69 6e 74 20 6e 52 69 67 68 74 2c  t,.  int nRight,
d3b0: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
d3c0: 52 69 67 68 74 0a 29 7b 0a 20 20 54 65 73 74 43  Right.){.  TestC
d3d0: 6f 6c 6c 61 74 69 6f 6e 58 20 2a 70 20 3d 20 28  ollationX *p = (
d3e0: 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a  TestCollationX *
d3f0: 29 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a  )pCtx;.  Tcl_Obj
d400: 20 2a 70 53 63 72 69 70 74 20 3d 20 54 63 6c 5f   *pScript = Tcl_
d410: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d 3e  DuplicateObj(p->
d420: 70 43 6d 70 29 3b 0a 20 20 69 6e 74 20 69 52 65  pCmp);.  int iRe
d430: 73 20 3d 20 30 3b 0a 0a 20 20 54 63 6c 5f 49 6e  s = 0;..  Tcl_In
d440: 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69  crRefCount(pScri
d450: 70 74 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  pt);.  Tcl_ListO
d460: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
d470: 30 2c 20 70 53 63 72 69 70 74 2c 20 54 63 6c 5f  0, pScript, Tcl_
d480: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68  NewStringObj((ch
d490: 61 72 20 2a 29 7a 4c 65 66 74 2c 20 6e 4c 65 66  ar *)zLeft, nLef
d4a0: 74 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  t));.  Tcl_ListO
d4b0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
d4c0: 30 2c 20 70 53 63 72 69 70 74 2c 20 54 63 6c 5f  0, pScript, Tcl_
d4d0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68  NewStringObj((ch
d4e0: 61 72 20 2a 29 7a 52 69 67 68 74 2c 6e 52 69 67  ar *)zRight,nRig
d4f0: 68 74 29 29 3b 0a 0a 20 20 69 66 28 20 54 43 4c  ht));..  if( TCL
d500: 5f 4f 4b 21 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a  _OK!=Tcl_EvalObj
d510: 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 53  Ex(p->interp, pS
d520: 63 72 69 70 74 2c 20 54 43 4c 5f 45 56 41 4c 5f  cript, TCL_EVAL_
d530: 44 49 52 45 43 54 7c 54 43 4c 5f 45 56 41 4c 5f  DIRECT|TCL_EVAL_
d540: 47 4c 4f 42 41 4c 29 0a 20 20 20 7c 7c 20 54 43  GLOBAL).   || TC
d550: 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74  L_OK!=Tcl_GetInt
d560: 46 72 6f 6d 4f 62 6a 28 70 2d 3e 69 6e 74 65 72  FromObj(p->inter
d570: 70 2c 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73  p, Tcl_GetObjRes
d580: 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20  ult(p->interp), 
d590: 26 69 52 65 73 29 0a 20 20 29 7b 0a 20 20 20 20  &iRes).  ){.    
d5a0: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72  Tcl_BackgroundEr
d5b0: 72 6f 72 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a  ror(p->interp);.
d5c0: 20 20 7d 0a 20 20 54 63 6c 5f 44 65 63 72 52 65    }.  Tcl_DecrRe
d5d0: 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b  fCount(pScript);
d5e0: 0a 0a 20 20 72 65 74 75 72 6e 20 69 52 65 73 3b  ..  return iRes;
d5f0: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  .}.static int te
d600: 73 74 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  st_create_collat
d610: 69 6f 6e 5f 76 32 28 0a 20 20 43 6c 69 65 6e 74  ion_v2(.  Client
d620: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
d630: 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a   /* Not used */.
d640: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
d650: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
d660: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
d670: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
d680: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
d690: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
d6a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
d6b0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
d6c0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
d6d0: 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
d6e0: 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
d6f0: 0a 29 7b 0a 20 20 54 65 73 74 43 6f 6c 6c 61 74  .){.  TestCollat
d700: 69 6f 6e 58 20 2a 70 3b 0a 20 20 73 71 6c 69 74  ionX *p;.  sqlit
d710: 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
d720: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35  ;..  if( objc!=5
d730: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
d740: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
d750: 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 2d 48 41   1, objv, "DB-HA
d760: 4e 44 4c 45 20 4e 41 4d 45 20 43 4d 50 2d 50 52  NDLE NAME CMP-PR
d770: 4f 43 20 44 45 4c 2d 50 52 4f 43 22 29 3b 0a 20  OC DEL-PROC");. 
d780: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
d790: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
d7a0: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
d7b0: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
d7c0: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
d7d0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
d7e0: 52 4f 52 3b 0a 0a 20 20 70 20 3d 20 28 54 65 73  ROR;..  p = (Tes
d7f0: 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 29 73 71  tCollationX *)sq
d800: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
d810: 65 6f 66 28 54 65 73 74 43 6f 6c 6c 61 74 69 6f  eof(TestCollatio
d820: 6e 58 29 29 3b 0a 20 20 70 2d 3e 70 43 6d 70 20  nX));.  p->pCmp 
d830: 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 70 2d 3e  = objv[3];.  p->
d840: 70 44 65 6c 20 3d 20 6f 62 6a 76 5b 34 5d 3b 0a  pDel = objv[4];.
d850: 20 20 70 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e    p->interp = in
d860: 74 65 72 70 3b 0a 20 20 54 63 6c 5f 49 6e 63 72  terp;.  Tcl_Incr
d870: 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 43 6d 70  RefCount(p->pCmp
d880: 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
d890: 43 6f 75 6e 74 28 70 2d 3e 70 44 65 6c 29 3b 0a  Count(p->pDel);.
d8a0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
d8b0: 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
d8c0: 5f 76 32 28 64 62 2c 20 54 63 6c 5f 47 65 74 53  _v2(db, Tcl_GetS
d8d0: 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20  tring(objv[2]), 
d8e0: 31 36 2c 20 0a 20 20 20 20 20 20 28 76 6f 69 64  16, .      (void
d8f0: 20 2a 29 70 2c 20 74 65 73 74 43 72 65 61 74 65   *)p, testCreate
d900: 43 6f 6c 6c 61 74 69 6f 6e 43 6d 70 2c 20 74 65  CollationCmp, te
d910: 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f  stCreateCollatio
d920: 6e 44 65 6c 0a 20 20 29 3b 0a 20 20 69 66 28 20  nDel.  );.  if( 
d930: 72 63 21 3d 53 51 4c 49 54 45 5f 4d 49 53 55 53  rc!=SQLITE_MISUS
d940: 45 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  E ){.    Tcl_App
d950: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
d960: 2c 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74  , "sqlite3_creat
d970: 65 5f 63 6f 6c 6c 61 74 65 5f 76 32 28 29 20 66  e_collate_v2() f
d980: 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20  ailed to detect 
d990: 22 0a 20 20 20 20 20 20 22 61 6e 20 69 6e 76 61  ".      "an inva
d9a0: 6c 69 64 20 65 6e 63 6f 64 69 6e 67 22 2c 20 28  lid encoding", (
d9b0: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65  char*)0);.    re
d9c0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d9d0: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
d9e0: 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
d9f0: 69 6f 6e 5f 76 32 28 64 62 2c 20 54 63 6c 5f 47  ion_v2(db, Tcl_G
da00: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
da10: 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  ), SQLITE_UTF8, 
da20: 0a 20 20 20 20 20 20 28 76 6f 69 64 20 2a 29 70  .      (void *)p
da30: 2c 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c  , testCreateColl
da40: 61 74 69 6f 6e 43 6d 70 2c 20 74 65 73 74 43 72  ationCmp, testCr
da50: 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c  eateCollationDel
da60: 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  .  );.  return T
da70: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
da80: 55 53 41 47 45 3a 20 73 71 6c 69 74 65 33 5f 63  USAGE: sqlite3_c
da90: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
daa0: 32 20 44 42 20 4e 41 4d 45 20 4e 41 52 47 20 45  2 DB NAME NARG E
dab0: 4e 43 20 3f 53 57 49 54 43 48 45 53 3f 0a 2a 2a  NC ?SWITCHES?.**
dac0: 0a 2a 2a 20 41 76 61 69 6c 61 62 6c 65 20 73 77  .** Available sw
dad0: 69 74 63 68 65 73 20 61 72 65 3a 0a 2a 2a 0a 2a  itches are:.**.*
dae0: 2a 20 20 20 2d 66 75 6e 63 20 20 20 20 53 43 52  *   -func    SCR
daf0: 49 50 54 0a 2a 2a 20 20 20 2d 73 74 65 70 20 20  IPT.**   -step  
db00: 20 20 53 43 52 49 50 54 0a 2a 2a 20 20 20 2d 66    SCRIPT.**   -f
db10: 69 6e 61 6c 20 20 20 53 43 52 49 50 54 0a 2a 2a  inal   SCRIPT.**
db20: 20 20 20 2d 64 65 73 74 72 6f 79 20 53 43 52 49     -destroy SCRI
db30: 50 54 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  PT.*/.typedef st
db40: 72 75 63 74 20 43 72 65 61 74 65 46 75 6e 63 74  ruct CreateFunct
db50: 69 6f 6e 56 32 20 43 72 65 61 74 65 46 75 6e 63  ionV2 CreateFunc
db60: 74 69 6f 6e 56 32 3b 0a 73 74 72 75 63 74 20 43  tionV2;.struct C
db70: 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 20  reateFunctionV2 
db80: 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  {.  Tcl_Interp *
db90: 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62  interp;.  Tcl_Ob
dba0: 6a 20 2a 70 46 75 6e 63 3b 20 20 20 20 20 20 20  j *pFunc;       
dbb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63 72            /* Scr
dbc0: 69 70 74 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e  ipt for function
dbd0: 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20   invocation */. 
dbe0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 74 65 70 3b   Tcl_Obj *pStep;
dbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc00: 20 2f 2a 20 53 63 72 69 70 74 20 66 6f 72 20 61   /* Script for a
dc10: 67 67 2e 20 73 74 65 70 20 69 6e 76 6f 63 61 74  gg. step invocat
dc20: 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  ion */.  Tcl_Obj
dc30: 20 2a 70 46 69 6e 61 6c 3b 20 20 20 20 20 20 20   *pFinal;       
dc40: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63 72 69           /* Scri
dc50: 70 74 20 66 6f 72 20 61 67 67 2e 20 66 69 6e 61  pt for agg. fina
dc60: 6c 69 7a 61 74 69 6f 6e 20 69 6e 76 6f 63 61 74  lization invocat
dc70: 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  ion */.  Tcl_Obj
dc80: 20 2a 70 44 65 73 74 72 6f 79 3b 20 20 20 20 20   *pDestroy;     
dc90: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74           /* Dest
dca0: 72 75 63 74 6f 72 20 73 63 72 69 70 74 20 2a 2f  ructor script */
dcb0: 0a 7d 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .};.static void 
dcc0: 63 66 32 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  cf2Func(sqlite3_
dcd0: 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 69 6e  context *ctx, in
dce0: 74 20 6e 41 72 67 2c 20 73 71 6c 69 74 65 33 5f  t nArg, sqlite3_
dcf0: 76 61 6c 75 65 20 2a 2a 61 41 72 67 29 7b 0a 7d  value **aArg){.}
dd00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 66 32  .static void cf2
dd10: 53 74 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Step(sqlite3_con
dd20: 74 65 78 74 20 2a 63 74 78 2c 20 69 6e 74 20 6e  text *ctx, int n
dd30: 41 72 67 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  Arg, sqlite3_val
dd40: 75 65 20 2a 2a 61 41 72 67 29 7b 0a 7d 0a 73 74  ue **aArg){.}.st
dd50: 61 74 69 63 20 76 6f 69 64 20 63 66 32 46 69 6e  atic void cf2Fin
dd60: 61 6c 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  al(sqlite3_conte
dd70: 78 74 20 2a 63 74 78 29 7b 0a 7d 0a 73 74 61 74  xt *ctx){.}.stat
dd80: 69 63 20 76 6f 69 64 20 63 66 32 44 65 73 74 72  ic void cf2Destr
dd90: 6f 79 28 76 6f 69 64 20 2a 70 55 73 65 72 29 7b  oy(void *pUser){
dda0: 0a 20 20 43 72 65 61 74 65 46 75 6e 63 74 69 6f  .  CreateFunctio
ddb0: 6e 56 32 20 2a 70 20 3d 20 28 43 72 65 61 74 65  nV2 *p = (Create
ddc0: 46 75 6e 63 74 69 6f 6e 56 32 20 2a 29 70 55 73  FunctionV2 *)pUs
ddd0: 65 72 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e  er;..  if( p->in
dde0: 74 65 72 70 20 26 26 20 70 2d 3e 70 44 65 73 74  terp && p->pDest
ddf0: 72 6f 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  roy ){.    int r
de00: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  c = Tcl_EvalObjE
de10: 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e  x(p->interp, p->
de20: 70 44 65 73 74 72 6f 79 2c 20 30 29 3b 0a 20 20  pDestroy, 0);.  
de30: 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b    if( rc!=TCL_OK
de40: 20 29 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e   ) Tcl_Backgroun
de50: 64 45 72 72 6f 72 28 70 2d 3e 69 6e 74 65 72 70  dError(p->interp
de60: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d  );.  }..  if( p-
de70: 3e 70 46 75 6e 63 20 29 20 54 63 6c 5f 44 65 63  >pFunc ) Tcl_Dec
de80: 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 46 75  rRefCount(p->pFu
de90: 6e 63 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70  nc); .  if( p->p
dea0: 53 74 65 70 20 29 20 54 63 6c 5f 44 65 63 72 52  Step ) Tcl_DecrR
deb0: 65 66 43 6f 75 6e 74 28 70 2d 3e 70 53 74 65 70  efCount(p->pStep
dec0: 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 46 69  ); .  if( p->pFi
ded0: 6e 61 6c 20 29 20 54 63 6c 5f 44 65 63 72 52 65  nal ) Tcl_DecrRe
dee0: 66 43 6f 75 6e 74 28 70 2d 3e 70 46 69 6e 61 6c  fCount(p->pFinal
def0: 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 44 65  ); .  if( p->pDe
df00: 73 74 72 6f 79 20 29 20 54 63 6c 5f 44 65 63 72  stroy ) Tcl_Decr
df10: 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 44 65 73  RefCount(p->pDes
df20: 74 72 6f 79 29 3b 20 0a 20 20 73 71 6c 69 74 65  troy); .  sqlite
df30: 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 73 74 61  3_free(p);.}.sta
df40: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 72 65  tic int test_cre
df50: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28  ate_function_v2(
df60: 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
df70: 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20 20 20  ientData,       
df80: 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a     /* Not used *
df90: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
dfa0: 69 6e 74 65 72 70 2c 20 20 20 20 20 20 20 20 20  interp,         
dfb0: 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 76 6f 6b      /* The invok
dfc0: 69 6e 67 20 54 43 4c 20 69 6e 74 65 72 70 72 65  ing TCL interpre
dfd0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  ter */.  int obj
dfe0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
dff0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
e000: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
e010: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
e020: 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 20 20 20 20  NST objv[]      
e030: 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20       /* Command 
e040: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
e050: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
e060: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
e070: 6e 63 3b 0a 20 20 69 6e 74 20 6e 41 72 67 3b 0a  nc;.  int nArg;.
e080: 20 20 69 6e 74 20 65 6e 63 3b 0a 20 20 43 72 65    int enc;.  Cre
e090: 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 20 2a 70  ateFunctionV2 *p
e0a0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
e0b0: 20 72 63 3b 0a 0a 20 20 73 74 72 75 63 74 20 45   rc;..  struct E
e0c0: 6e 63 54 61 62 6c 65 20 7b 0a 20 20 20 20 63 6f  ncTable {.    co
e0d0: 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 63 3b 0a  nst char *zEnc;.
e0e0: 20 20 20 20 69 6e 74 20 65 6e 63 3b 0a 20 20 7d      int enc;.  }
e0f0: 20 61 45 6e 63 5b 5d 20 3d 20 7b 0a 20 20 20 20   aEnc[] = {.    
e100: 7b 22 75 74 66 38 22 2c 20 20 20 20 53 51 4c 49  {"utf8",    SQLI
e110: 54 45 5f 55 54 46 38 20 7d 2c 0a 20 20 20 20 7b  TE_UTF8 },.    {
e120: 22 75 74 66 31 36 22 2c 20 20 20 53 51 4c 49 54  "utf16",   SQLIT
e130: 45 5f 55 54 46 31 36 20 7d 2c 0a 20 20 20 20 7b  E_UTF16 },.    {
e140: 22 75 74 66 31 36 6c 65 22 2c 20 53 51 4c 49 54  "utf16le", SQLIT
e150: 45 5f 55 54 46 31 36 4c 45 20 7d 2c 0a 20 20 20  E_UTF16LE },.   
e160: 20 7b 22 75 74 66 31 36 62 65 22 2c 20 53 51 4c   {"utf16be", SQL
e170: 49 54 45 5f 55 54 46 31 36 42 45 20 7d 2c 0a 20  ITE_UTF16BE },. 
e180: 20 20 20 7b 22 61 6e 79 22 2c 20 20 20 20 20 53     {"any",     S
e190: 51 4c 49 54 45 5f 41 4e 59 20 7d 2c 0a 20 20 20  QLITE_ANY },.   
e1a0: 20 7b 22 30 22 2c 20 30 20 7d 0a 20 20 7d 3b 0a   {"0", 0 }.  };.
e1b0: 0a 20 20 69 66 28 20 6f 62 6a 63 3c 35 20 7c 7c  .  if( objc<5 ||
e1c0: 20 28 6f 62 6a 63 25 32 29 3d 3d 30 20 29 7b 0a   (objc%2)==0 ){.
e1d0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
e1e0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
e1f0: 6f 62 6a 76 2c 20 22 44 42 20 4e 41 4d 45 20 4e  objv, "DB NAME N
e200: 41 52 47 20 45 4e 43 20 53 57 49 54 43 48 45 53  ARG ENC SWITCHES
e210: 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ...");.    retur
e220: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
e230: 0a 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  ..  if( getDbPoi
e240: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
e250: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
e260: 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
e270: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
e280: 7a 46 75 6e 63 20 3d 20 54 63 6c 5f 47 65 74 53  zFunc = Tcl_GetS
e290: 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
e2a0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
e2b0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
e2c0: 6f 62 6a 76 5b 33 5d 2c 20 26 6e 41 72 67 29 20  objv[3], &nArg) 
e2d0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
e2e0: 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
e2f0: 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 53 74 72  tIndexFromObjStr
e300: 75 63 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  uct(interp, objv
e310: 5b 34 5d 2c 20 61 45 6e 63 2c 20 73 69 7a 65 6f  [4], aEnc, sizeo
e320: 66 28 61 45 6e 63 5b 30 5d 29 2c 20 0a 20 20 20  f(aEnc[0]), .   
e330: 20 20 20 20 20 20 20 22 65 6e 63 6f 64 69 6e 67         "encoding
e340: 22 2c 20 30 2c 20 26 65 6e 63 29 0a 20 20 29 7b  ", 0, &enc).  ){
e350: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
e360: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 65 6e 63  ERROR;.  }.  enc
e370: 20 3d 20 61 45 6e 63 5b 65 6e 63 5d 2e 65 6e 63   = aEnc[enc].enc
e380: 3b 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  ;..  p = sqlite3
e390: 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 43  _malloc(sizeof(C
e3a0: 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 29  reateFunctionV2)
e3b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 20 29  );.  assert( p )
e3c0: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  ;.  memset(p, 0,
e3d0: 20 73 69 7a 65 6f 66 28 43 72 65 61 74 65 46 75   sizeof(CreateFu
e3e0: 6e 63 74 69 6f 6e 56 32 29 29 3b 0a 20 20 70 2d  nctionV2));.  p-
e3f0: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
e400: 3b 0a 0a 20 20 66 6f 72 28 69 3d 35 3b 20 69 3c  ;..  for(i=5; i<
e410: 6f 62 6a 63 3b 20 69 2b 3d 32 29 7b 0a 20 20 20  objc; i+=2){.   
e420: 20 69 6e 74 20 69 53 77 69 74 63 68 3b 0a 20 20   int iSwitch;.  
e430: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a    const char *az
e440: 53 77 69 74 63 68 5b 5d 20 3d 20 7b 22 2d 66 75  Switch[] = {"-fu
e450: 6e 63 22 2c 20 22 2d 73 74 65 70 22 2c 20 22 2d  nc", "-step", "-
e460: 66 69 6e 61 6c 22 2c 20 22 2d 64 65 73 74 72 6f  final", "-destro
e470: 79 22 2c 20 30 7d 3b 0a 20 20 20 20 69 66 28 20  y", 0};.    if( 
e480: 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
e490: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
e4a0: 5b 69 5d 2c 20 61 7a 53 77 69 74 63 68 2c 20 22  [i], azSwitch, "
e4b0: 73 77 69 74 63 68 22 2c 20 30 2c 20 26 69 53 77  switch", 0, &iSw
e4c0: 69 74 63 68 29 20 29 7b 0a 20 20 20 20 20 20 73  itch) ){.      s
e4d0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
e4e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
e4f0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
e500: 20 20 20 73 77 69 74 63 68 28 20 69 53 77 69 74     switch( iSwit
e510: 63 68 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  ch ){.      case
e520: 20 30 3a 20 70 2d 3e 70 46 75 6e 63 20 3d 20 6f   0: p->pFunc = o
e530: 62 6a 76 5b 69 2b 31 5d 3b 20 20 20 20 20 20 62  bjv[i+1];      b
e540: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
e550: 20 31 3a 20 70 2d 3e 70 53 74 65 70 20 3d 20 6f   1: p->pStep = o
e560: 62 6a 76 5b 69 2b 31 5d 3b 20 20 20 20 20 20 62  bjv[i+1];      b
e570: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
e580: 20 32 3a 20 70 2d 3e 70 46 69 6e 61 6c 20 3d 20   2: p->pFinal = 
e590: 6f 62 6a 76 5b 69 2b 31 5d 3b 20 20 20 20 20 62  objv[i+1];     b
e5a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
e5b0: 20 33 3a 20 70 2d 3e 70 44 65 73 74 72 6f 79 20   3: p->pDestroy 
e5c0: 3d 20 6f 62 6a 76 5b 69 2b 31 5d 3b 20 20 20 62  = objv[i+1];   b
e5d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
e5e0: 20 20 69 66 28 20 70 2d 3e 70 46 75 6e 63 20 29    if( p->pFunc )
e5f0: 20 70 2d 3e 70 46 75 6e 63 20 3d 20 54 63 6c 5f   p->pFunc = Tcl_
e600: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d 3e  DuplicateObj(p->
e610: 70 46 75 6e 63 29 3b 20 0a 20 20 69 66 28 20 70  pFunc); .  if( p
e620: 2d 3e 70 53 74 65 70 20 29 20 70 2d 3e 70 53 74  ->pStep ) p->pSt
e630: 65 70 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  ep = Tcl_Duplica
e640: 74 65 4f 62 6a 28 70 2d 3e 70 53 74 65 70 29 3b  teObj(p->pStep);
e650: 20 0a 20 20 69 66 28 20 70 2d 3e 70 46 69 6e 61   .  if( p->pFina
e660: 6c 20 29 20 70 2d 3e 70 46 69 6e 61 6c 20 3d 20  l ) p->pFinal = 
e670: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
e680: 28 70 2d 3e 70 46 69 6e 61 6c 29 3b 20 0a 20 20  (p->pFinal); .  
e690: 69 66 28 20 70 2d 3e 70 44 65 73 74 72 6f 79 20  if( p->pDestroy 
e6a0: 29 20 70 2d 3e 70 44 65 73 74 72 6f 79 20 3d 20  ) p->pDestroy = 
e6b0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
e6c0: 28 70 2d 3e 70 44 65 73 74 72 6f 79 29 3b 20 0a  (p->pDestroy); .
e6d0: 0a 20 20 69 66 28 20 70 2d 3e 70 46 75 6e 63 20  .  if( p->pFunc 
e6e0: 29 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75  ) Tcl_IncrRefCou
e6f0: 6e 74 28 70 2d 3e 70 46 75 6e 63 29 3b 20 0a 20  nt(p->pFunc); . 
e700: 20 69 66 28 20 70 2d 3e 70 53 74 65 70 20 29 20   if( p->pStep ) 
e710: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
e720: 28 70 2d 3e 70 53 74 65 70 29 3b 20 0a 20 20 69  (p->pStep); .  i
e730: 66 28 20 70 2d 3e 70 46 69 6e 61 6c 20 29 20 54  f( p->pFinal ) T
e740: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
e750: 70 2d 3e 70 46 69 6e 61 6c 29 3b 20 0a 20 20 69  p->pFinal); .  i
e760: 66 28 20 70 2d 3e 70 44 65 73 74 72 6f 79 20 29  f( p->pDestroy )
e770: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
e780: 74 28 70 2d 3e 70 44 65 73 74 72 6f 79 29 3b 20  t(p->pDestroy); 
e790: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
e7a0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
e7b0: 5f 76 32 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e  _v2(db, zFunc, n
e7c0: 41 72 67 2c 20 65 6e 63 2c 20 28 76 6f 69 64 20  Arg, enc, (void 
e7d0: 2a 29 70 2c 20 0a 20 20 20 20 20 20 28 70 2d 3e  *)p, .      (p->
e7e0: 70 46 75 6e 63 20 3f 20 63 66 32 46 75 6e 63 20  pFunc ? cf2Func 
e7f0: 3a 20 30 29 2c 0a 20 20 20 20 20 20 28 70 2d 3e  : 0),.      (p->
e800: 70 53 74 65 70 20 3f 20 63 66 32 53 74 65 70 20  pStep ? cf2Step 
e810: 3a 20 30 29 2c 0a 20 20 20 20 20 20 28 70 2d 3e  : 0),.      (p->
e820: 70 46 69 6e 61 6c 20 3f 20 63 66 32 46 69 6e 61  pFinal ? cf2Fina
e830: 6c 20 3a 20 30 29 2c 0a 20 20 20 20 20 20 63 66  l : 0),.      cf
e840: 32 44 65 73 74 72 6f 79 0a 20 20 29 3b 0a 20 20  2Destroy.  );.  
e850: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
e860: 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 52 65 73  K ){.    Tcl_Res
e870: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  etResult(interp)
e880: 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
e890: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73  Result(interp, s
e8a0: 71 6c 69 74 65 33 54 65 73 74 45 72 72 6f 72 4e  qlite3TestErrorN
e8b0: 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20  ame(rc), 0);.   
e8c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
e8d0: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
e8e0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
e8f0: 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
e900: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 20 44  load_extension D
e910: 42 2d 48 41 4e 44 4c 45 20 46 49 4c 45 20 3f 50  B-HANDLE FILE ?P
e920: 52 4f 43 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ROC?.*/.static i
e930: 6e 74 20 74 65 73 74 5f 6c 6f 61 64 5f 65 78 74  nt test_load_ext
e940: 65 6e 73 69 6f 6e 28 0a 20 20 43 6c 69 65 6e 74  ension(.  Client
e950: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
e960: 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a   /* Not used */.
e970: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
e980: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
e990: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
e9a0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
e9b0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
e9c0: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
e9d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
e9e0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
e9f0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
ea00: 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
ea10: 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
ea20: 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66  .){.  Tcl_CmdInf
ea30: 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 73 71 6c  o cmdInfo;.  sql
ea40: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
ea50: 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b  rc;.  char *zDb;
ea60: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a  .  char *zFile;.
ea70: 20 20 63 68 61 72 20 2a 7a 50 72 6f 63 20 3d 20    char *zProc = 
ea80: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20  0;.  char *zErr 
ea90: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  = 0;..  if( objc
eaa0: 21 3d 34 20 26 26 20 6f 62 6a 63 21 3d 33 20 29  !=4 && objc!=3 )
eab0: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
eac0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
ead0: 2c 20 6f 62 6a 76 2c 20 22 44 42 2d 48 41 4e 44  , objv, "DB-HAND
eae0: 4c 45 20 46 49 4c 45 20 3f 50 52 4f 43 3f 22 29  LE FILE ?PROC?")
eaf0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
eb00: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44  _ERROR;.  }.  zD
eb10: 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  b = Tcl_GetStrin
eb20: 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 7a 46  g(objv[1]);.  zF
eb30: 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ile = Tcl_GetStr
eb40: 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
eb50: 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20  if( objc==4 ){. 
eb60: 20 20 20 7a 50 72 6f 63 20 3d 20 54 63 6c 5f 47     zProc = Tcl_G
eb70: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
eb80: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 74  );.  }..  /* Ext
eb90: 72 61 63 74 20 74 68 65 20 43 20 64 61 74 61 62  ract the C datab
eba0: 61 73 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20  ase handle from 
ebb0: 74 68 65 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20  the Tcl command 
ebc0: 6e 61 6d 65 20 2a 2f 0a 20 20 69 66 28 20 21 54  name */.  if( !T
ebd0: 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66  cl_GetCommandInf
ebe0: 6f 28 69 6e 74 65 72 70 2c 20 7a 44 62 2c 20 26  o(interp, zDb, &
ebf0: 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  cmdInfo) ){.    
ec00: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
ec10: 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e  (interp, "comman
ec20: 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 20  d not found: ", 
ec30: 7a 44 62 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  zDb, (char*)0);.
ec40: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
ec50: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 64 62 20 3d  RROR;.  }.  db =
ec60: 20 28 28 73 74 72 75 63 74 20 53 71 6c 69 74 65   ((struct Sqlite
ec70: 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43  Db*)cmdInfo.objC
ec80: 6c 69 65 6e 74 44 61 74 61 29 2d 3e 64 62 3b 0a  lientData)->db;.
ec90: 20 20 61 73 73 65 72 74 28 64 62 29 3b 0a 0a 20    assert(db);.. 
eca0: 20 2f 2a 20 43 61 6c 6c 20 74 68 65 20 75 6e 64   /* Call the und
ecb0: 65 72 6c 79 69 6e 67 20 43 20 66 75 6e 63 74 69  erlying C functi
ecc0: 6f 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  on. If an error 
ecd0: 6f 63 63 75 72 73 2c 20 73 65 74 20 72 63 20 74  occurs, set rc t
ece0: 6f 20 0a 20 20 2a 2a 20 54 43 4c 5f 45 52 52 4f  o .  ** TCL_ERRO
ecf0: 52 20 61 6e 64 20 6c 6f 61 64 20 61 6e 79 20 65  R and load any e
ed00: 72 72 6f 72 20 73 74 72 69 6e 67 20 69 6e 74 6f  rror string into
ed10: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
ed20: 2e 20 49 66 20 6e 6f 20 0a 20 20 2a 2a 20 65 72  . If no .  ** er
ed30: 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
ed40: 72 63 20 74 6f 20 54 43 4c 5f 4f 4b 2e 0a 20 20  rc to TCL_OK..  
ed50: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
ed60: 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
ed70: 53 49 4f 4e 0a 20 20 72 63 20 3d 20 53 51 4c 49  SION.  rc = SQLI
ed80: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7a 45 72 72  TE_ERROR;.  zErr
ed90: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
eda0: 74 66 28 22 74 68 69 73 20 62 75 69 6c 64 20 6f  tf("this build o
edb0: 6d 69 74 73 20 73 71 6c 69 74 65 33 5f 6c 6f 61  mits sqlite3_loa
edc0: 64 5f 65 78 74 65 6e 73 69 6f 6e 28 29 22 29 3b  d_extension()");
edd0: 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d 20 73 71  .#else.  rc = sq
ede0: 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e  lite3_load_exten
edf0: 73 69 6f 6e 28 64 62 2c 20 7a 46 69 6c 65 2c 20  sion(db, zFile, 
ee00: 7a 50 72 6f 63 2c 20 26 7a 45 72 72 29 3b 0a 23  zProc, &zErr);.#
ee10: 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 21 3d  endif.  if( rc!=
ee20: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
ee30: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
ee40: 6e 74 65 72 70 2c 20 7a 45 72 72 20 3f 20 7a 45  nterp, zErr ? zE
ee50: 72 72 20 3a 20 22 22 2c 20 54 43 4c 5f 56 4f 4c  rr : "", TCL_VOL
ee60: 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 63 20 3d  ATILE);.    rc =
ee70: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65   TCL_ERROR;.  }e
ee80: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 54 43  lse{.    rc = TC
ee90: 4c 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  L_OK;.  }.  sqli
eea0: 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a  te3_free(zErr);.
eeb0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
eec0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
eed0: 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61  lite3_enable_loa
eee0: 64 5f 65 78 74 65 6e 73 69 6f 6e 20 44 42 2d 48  d_extension DB-H
eef0: 41 4e 44 4c 45 20 4f 4e 4f 46 46 0a 2a 2f 0a 73  ANDLE ONOFF.*/.s
ef00: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65  tatic int test_e
ef10: 6e 61 62 6c 65 5f 6c 6f 61 64 28 0a 20 20 43 6c  nable_load(.  Cl
ef20: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
ef30: 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64  ata, /* Not used
ef40: 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
ef50: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
ef60: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
ef70: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
ef80: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
ef90: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
efa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
efb0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
efc0: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
efd0: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
efe0: 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
eff0: 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d  s */.){.  Tcl_Cm
f000: 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20  dInfo cmdInfo;. 
f010: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
f020: 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 69 6e 74  char *zDb;.  int
f030: 20 6f 6e 6f 66 66 3b 0a 0a 20 20 69 66 28 20 6f   onoff;..  if( o
f040: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
f050: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
f060: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
f070: 22 44 42 2d 48 41 4e 44 4c 45 20 4f 4e 4f 46 46  "DB-HANDLE ONOFF
f080: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
f090: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
f0a0: 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  zDb = Tcl_GetStr
f0b0: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 0a 20  ing(objv[1]);.. 
f0c0: 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20   /* Extract the 
f0d0: 43 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  C database handl
f0e0: 65 20 66 72 6f 6d 20 74 68 65 20 54 63 6c 20 63  e from the Tcl c
f0f0: 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 2a 2f 0a 20  ommand name */. 
f100: 20 69 66 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d   if( !Tcl_GetCom
f110: 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c  mandInfo(interp,
f120: 20 7a 44 62 2c 20 26 63 6d 64 49 6e 66 6f 29 20   zDb, &cmdInfo) 
f130: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
f140: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
f150: 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f 75  "command not fou
f160: 6e 64 3a 20 22 2c 20 7a 44 62 2c 20 28 63 68 61  nd: ", zDb, (cha
f170: 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
f180: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
f190: 0a 20 20 64 62 20 3d 20 28 28 73 74 72 75 63 74  .  db = ((struct
f1a0: 20 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e   SqliteDb*)cmdIn
f1b0: 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61  fo.objClientData
f1c0: 29 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  )->db;.  assert(
f1d0: 64 62 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74  db);..  /* Get t
f1e0: 68 65 20 6f 6e 6f 66 66 20 70 61 72 61 6d 65 74  he onoff paramet
f1f0: 65 72 20 2a 2f 0a 20 20 69 66 28 20 54 63 6c 5f  er */.  if( Tcl_
f200: 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
f210: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
f220: 5d 2c 20 26 6f 6e 6f 66 66 29 20 29 7b 0a 20 20  ], &onoff) ){.  
f230: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
f240: 4f 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20  OR;.  }..#ifdef 
f250: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
f260: 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 54 63 6c  _EXTENSION.  Tcl
f270: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
f280: 74 65 72 70 2c 20 22 74 68 69 73 20 62 75 69 6c  terp, "this buil
f290: 64 20 6f 6d 69 74 73 20 73 71 6c 69 74 65 33 5f  d omits sqlite3_
f2a0: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 29  load_extension()
f2b0: 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ");.  return TCL
f2c0: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20  _ERROR;.#else.  
f2d0: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c  sqlite3_enable_l
f2e0: 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 64 62  oad_extension(db
f2f0: 2c 20 6f 6e 6f 66 66 29 3b 0a 20 20 72 65 74 75  , onoff);.  retu
f300: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 23 65 6e 64 69  rn TCL_OK;.#endi
f310: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  f.}../*.** Usage
f320: 3a 20 20 73 71 6c 69 74 65 5f 61 62 6f 72 74 0a  :  sqlite_abort.
f330: 2a 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  **.** Shutdown t
f340: 68 65 20 70 72 6f 63 65 73 73 20 69 6d 6d 65 64  he process immed
f350: 69 61 74 65 6c 79 2e 20 20 54 68 69 73 20 69 73  iately.  This is
f360: 20 6e 6f 74 20 61 20 63 6c 65 61 6e 20 73 68 75   not a clean shu
f370: 74 64 6f 77 6e 2e 0a 2a 2a 20 54 68 69 73 20 63  tdown..** This c
f380: 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74  ommand is used t
f390: 6f 20 74 65 73 74 20 74 68 65 20 72 65 63 6f 76  o test the recov
f3a0: 65 72 61 62 69 6c 69 74 79 20 6f 66 20 61 20 64  erability of a d
f3b0: 61 74 61 62 61 73 65 20 69 6e 0a 2a 2a 20 74 68  atabase in.** th
f3c0: 65 20 65 76 65 6e 74 20 6f 66 20 61 20 70 72 6f  e event of a pro
f3d0: 67 72 61 6d 20 63 72 61 73 68 2e 0a 2a 2f 0a 73  gram crash..*/.s
f3e0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
f3f0: 5f 61 62 6f 72 74 28 0a 20 20 76 6f 69 64 20 2a  _abort(.  void *
f400: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
f410: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
f420: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
f430: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
f440: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
f450: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
f460: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
f470: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
f480: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
f490: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
f4a0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
f4b0: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
f4c0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 4d 53  .#if defined(_MS
f4d0: 43 5f 56 45 52 29 0a 20 20 2f 2a 20 57 65 20 64  C_VER).  /* We d
f4e0: 6f 20 74 68 69 73 2c 20 6f 74 68 65 72 77 69 73  o this, otherwis
f4f0: 65 20 74 68 65 20 74 65 73 74 20 77 69 6c 6c 20  e the test will 
f500: 68 61 6c 74 20 77 69 74 68 20 61 20 70 6f 70 75  halt with a popu
f510: 70 20 6d 65 73 73 61 67 65 0a 20 20 20 2a 20 74  p message.   * t
f520: 68 61 74 20 77 65 20 68 61 76 65 20 74 6f 20 63  hat we have to c
f530: 6c 69 63 6b 20 61 77 61 79 20 62 65 66 6f 72 65  lick away before
f540: 20 74 68 65 20 74 65 73 74 20 77 69 6c 6c 20 63   the test will c
f550: 6f 6e 74 69 6e 75 65 2e 0a 20 20 20 2a 2f 0a 20  ontinue..   */. 
f560: 20 5f 73 65 74 5f 61 62 6f 72 74 5f 62 65 68 61   _set_abort_beha
f570: 76 69 6f 72 28 20 30 2c 20 5f 43 41 4c 4c 5f 52  vior( 0, _CALL_R
f580: 45 50 4f 52 54 46 41 55 4c 54 20 29 3b 0a 23 65  EPORTFAULT );.#e
f590: 6e 64 69 66 0a 20 20 65 78 69 74 28 32 35 35 29  ndif.  exit(255)
f5a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 74 65  ;.  assert( inte
f5b0: 72 70 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 54 68  rp==0 );   /* Th
f5c0: 69 73 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66  is will always f
f5d0: 61 69 6c 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ail */.  return 
f5e0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
f5f0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
f600: 6f 75 74 69 6e 65 20 69 73 20 61 20 75 73 65 72  outine is a user
f610: 2d 64 65 66 69 6e 65 64 20 53 51 4c 20 66 75 6e  -defined SQL fun
f620: 63 74 69 6f 6e 20 77 68 6f 73 65 20 70 75 72 70  ction whose purp
f630: 6f 73 65 0a 2a 2a 20 69 73 20 74 6f 20 74 65 73  ose.** is to tes
f640: 74 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 74  t the sqlite_set
f650: 5f 72 65 73 75 6c 74 28 29 20 41 50 49 2e 0a 2a  _result() API..*
f660: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  /.static void te
f670: 73 74 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  stFunc(sqlite3_c
f680: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
f690: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
f6a0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29  e3_value **argv)
f6b0: 7b 0a 20 20 77 68 69 6c 65 28 20 61 72 67 63 3e  {.  while( argc>
f6c0: 3d 32 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =2 ){.    const 
f6d0: 63 68 61 72 20 2a 7a 41 72 67 30 20 3d 20 28 63  char *zArg0 = (c
f6e0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
f6f0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
f700: 3b 0a 20 20 20 20 69 66 28 20 7a 41 72 67 30 20  ;.    if( zArg0 
f710: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ){.      if( 0==
f720: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
f730: 41 72 67 30 2c 20 22 69 6e 74 22 29 20 29 7b 0a  Arg0, "int") ){.
f740: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
f750: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
f760: 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  xt, sqlite3_valu
f770: 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 29 3b  e_int(argv[1]));
f780: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
f790: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
f7a0: 7a 41 72 67 30 2c 22 69 6e 74 36 34 22 29 3d 3d  zArg0,"int64")==
f7b0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
f7c0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
f7d0: 34 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74  4(context, sqlit
f7e0: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61  e3_value_int64(a
f7f0: 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20  rgv[1]));.      
f800: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
f810: 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22  3StrICmp(zArg0,"
f820: 73 74 72 69 6e 67 22 29 3d 3d 30 20 29 7b 0a 20  string")==0 ){. 
f830: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
f840: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
f850: 78 74 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74  xt, (char*)sqlit
f860: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
f870: 67 76 5b 31 5d 29 2c 20 2d 31 2c 0a 20 20 20 20  gv[1]), -1,.    
f880: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54          SQLITE_T
f890: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
f8a0: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
f8b0: 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c  e3StrICmp(zArg0,
f8c0: 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a  "double")==0 ){.
f8d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
f8e0: 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f  result_double(co
f8f0: 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76  ntext, sqlite3_v
f900: 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76  alue_double(argv
f910: 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  [1]));.      }el
f920: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  se if( sqlite3St
f930: 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 6e 75 6c  rICmp(zArg0,"nul
f940: 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  l")==0 ){.      
f950: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
f960: 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 0a  _null(context);.
f970: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
f980: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
f990: 41 72 67 30 2c 22 76 61 6c 75 65 22 29 3d 3d 30  Arg0,"value")==0
f9a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
f9b0: 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65  te3_result_value
f9c0: 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 73  (context, argv[s
f9d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
f9e0: 28 61 72 67 76 5b 31 5d 29 5d 29 3b 0a 20 20 20  (argv[1])]);.   
f9f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fa00: 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74    goto error_out
fa10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
fa20: 6c 73 65 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  lse{.      goto 
fa30: 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 7d  error_out;.    }
fa40: 0a 20 20 20 20 61 72 67 63 20 2d 3d 20 32 3b 0a  .    argc -= 2;.
fa50: 20 20 20 20 61 72 67 76 20 2b 3d 20 32 3b 0a 20      argv += 2;. 
fa60: 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 65 72   }.  return;..er
fa70: 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ror_out:.  sqlit
fa80: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
fa90: 63 6f 6e 74 65 78 74 2c 22 66 69 72 73 74 20 61  context,"first a
faa0: 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62  rgument should b
fab0: 65 20 6f 6e 65 20 6f 66 3a 20 22 0a 20 20 20 20  e one of: ".    
fac0: 20 20 22 69 6e 74 20 69 6e 74 36 34 20 73 74 72    "int int64 str
fad0: 69 6e 67 20 64 6f 75 62 6c 65 20 6e 75 6c 6c 20  ing double null 
fae0: 76 61 6c 75 65 22 2c 20 2d 31 29 3b 0a 7d 0a 0a  value", -1);.}..
faf0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
fb00: 71 6c 69 74 65 5f 72 65 67 69 73 74 65 72 5f 74  qlite_register_t
fb10: 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 20 44 42  est_function  DB
fb20: 20 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 67    NAME.**.** Reg
fb30: 69 73 74 65 72 20 74 68 65 20 74 65 73 74 20 53  ister the test S
fb40: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74  QL function on t
fb50: 68 65 20 64 61 74 61 62 61 73 65 20 44 42 20 75  he database DB u
fb60: 6e 64 65 72 20 74 68 65 20 6e 61 6d 65 20 4e 41  nder the name NA
fb70: 4d 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ME..*/.static in
fb80: 74 20 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f  t test_register_
fb90: 66 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  func(.  void *No
fba0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
fbb0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
fbc0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
fbd0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
fbe0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
fbf0: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
fc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fc10: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
fc20: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
fc30: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
fc40: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
fc50: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
fc60: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
fc70: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72  int rc;.  if( ar
fc80: 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=3 ){.    Tcl
fc90: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
fca0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
fcb0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
fcc0: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20  "", argv[0], .  
fcd0: 20 20 20 20 20 22 20 44 42 20 46 55 4e 43 54 49       " DB FUNCTI
fce0: 4f 4e 2d 4e 41 4d 45 22 2c 20 30 29 3b 0a 20 20  ON-NAME", 0);.  
fcf0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
fd00: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
fd10: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
fd20: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
fd30: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
fd40: 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
fd50: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
fd60: 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c  ion(db, argv[2],
fd70: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
fd80: 2c 20 30 2c 20 0a 20 20 20 20 20 20 74 65 73 74  , 0, .      test
fd90: 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 69  Func, 0, 0);.  i
fda0: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
fdb0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
fdc0: 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
fdd0: 45 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a  ErrStr(rc), 0);.
fde0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
fdf0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
fe00: 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
fe10: 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
fe20: 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
fe30: 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20  ERROR;.  return 
fe40: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
fe50: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
fe60: 5f 66 69 6e 61 6c 69 7a 65 20 20 53 54 4d 54 20  _finalize  STMT 
fe70: 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20  .**.** Finalize 
fe80: 61 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64  a statement hand
fe90: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
fea0: 74 20 74 65 73 74 5f 66 69 6e 61 6c 69 7a 65 28  t test_finalize(
feb0: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
fec0: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
fed0: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
fee0: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
fef0: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
ff00: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
ff10: 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
ff20: 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  rc;.  sqlite3 *d
ff30: 62 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62  b = 0;..  if( ob
ff40: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
ff50: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
ff60: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
ff70: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
ff80: 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
ff90: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
ffa0: 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
ffb0: 3c 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20  <STMT>", 0);.   
ffc0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
ffd0: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
ffe0: 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
fff0: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
10000 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
10010 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
10020 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20  L_ERROR;..  if( 
10030 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 64 62 20  pStmt ){.    db 
10040 3d 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74  = StmtToDb(pStmt
10050 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
10060 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
10070 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74  Stmt);.  Tcl_Set
10080 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
10090 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
100a0 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
100b0 49 43 29 3b 0a 20 20 69 66 28 20 64 62 20 26 26  IC);.  if( db &&
100c0 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
100d0 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20  ode(interp, db, 
100e0 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
100f0 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e  _ERROR;.  return
10100 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
10110 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
10120 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 20 20 53  3_stmt_status  S
10130 54 4d 54 20 20 43 4f 44 45 20 20 52 45 53 45 54  TMT  CODE  RESET
10140 46 4c 41 47 0a 2a 2a 0a 2a 2a 20 47 65 74 20 74  FLAG.**.** Get t
10150 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73 74  he value of a st
10160 61 74 75 73 20 63 6f 75 6e 74 65 72 20 66 72 6f  atus counter fro
10170 6d 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  m a statement..*
10180 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
10190 74 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 0a 20  t_stmt_status(. 
101a0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
101b0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
101c0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
101d0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
101e0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
101f0 0a 20 20 69 6e 74 20 69 56 61 6c 75 65 3b 0a 20  .  int iValue;. 
10200 20 69 6e 74 20 69 2c 20 6f 70 2c 20 72 65 73 65   int i, op, rese
10210 74 46 6c 61 67 3b 0a 20 20 63 6f 6e 73 74 20 63  tFlag;.  const c
10220 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20  har *zOpName;.  
10230 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
10240 74 6d 74 3b 0a 0a 20 20 73 74 61 74 69 63 20 63  tmt;..  static c
10250 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
10260 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
10270 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 6f 70 3b  ame;.    int op;
10280 0a 20 20 7d 20 61 4f 70 5b 5d 20 3d 20 7b 0a 20  .  } aOp[] = {. 
10290 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 53 54 4d     { "SQLITE_STM
102a0 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e  TSTATUS_FULLSCAN
102b0 5f 53 54 45 50 22 2c 20 20 20 53 51 4c 49 54 45  _STEP",   SQLITE
102c0 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c  _STMTSTATUS_FULL
102d0 53 43 41 4e 5f 53 54 45 50 20 20 20 7d 2c 0a 20  SCAN_STEP   },. 
102e0 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 53 54 4d     { "SQLITE_STM
102f0 54 53 54 41 54 55 53 5f 53 4f 52 54 22 2c 20 20  TSTATUS_SORT",  
10300 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
10310 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54  _STMTSTATUS_SORT
10320 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
10330 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 53 54 4d     { "SQLITE_STM
10340 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45  TSTATUS_AUTOINDE
10350 58 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45  X",       SQLITE
10360 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f  _STMTSTATUS_AUTO
10370 49 4e 44 45 58 20 20 20 20 20 20 20 7d 2c 0a 20  INDEX       },. 
10380 20 7d 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d   };.  if( objc!=
10390 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  4 ){.    Tcl_Wro
103a0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
103b0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54  , 1, objv, "STMT
103c0 20 50 41 52 41 4d 45 54 45 52 20 52 45 53 45 54   PARAMETER RESET
103d0 46 4c 41 47 22 29 3b 0a 20 20 20 20 72 65 74 75  FLAG");.    retu
103e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
103f0 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
10400 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
10410 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
10420 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
10430 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
10440 52 3b 0a 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 54  R;.  zOpName = T
10450 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
10460 76 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30  v[2]);.  for(i=0
10470 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 4f  ; i<ArraySize(aO
10480 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  p); i++){.    if
10490 28 20 73 74 72 63 6d 70 28 61 4f 70 5b 69 5d 2e  ( strcmp(aOp[i].
104a0 7a 4e 61 6d 65 2c 20 7a 4f 70 4e 61 6d 65 29 3d  zName, zOpName)=
104b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 70 20 3d  =0 ){.      op =
104c0 20 61 4f 70 5b 69 5d 2e 6f 70 3b 0a 20 20 20 20   aOp[i].op;.    
104d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
104e0 20 7d 0a 20 20 69 66 28 20 69 3e 3d 41 72 72 61   }.  if( i>=Arra
104f0 79 53 69 7a 65 28 61 4f 70 29 20 29 7b 0a 20 20  ySize(aOp) ){.  
10500 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
10510 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
10520 6f 62 6a 76 5b 32 5d 2c 20 26 6f 70 29 20 29 20  objv[2], &op) ) 
10530 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10540 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
10550 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
10560 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
10570 5d 2c 20 26 72 65 73 65 74 46 6c 61 67 29 20 29  ], &resetFlag) )
10580 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
10590 52 3b 0a 20 20 69 56 61 6c 75 65 20 3d 20 73 71  R;.  iValue = sq
105a0 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
105b0 73 28 70 53 74 6d 74 2c 20 6f 70 2c 20 72 65 73  s(pStmt, op, res
105c0 65 74 46 6c 61 67 29 3b 0a 20 20 54 63 6c 5f 53  etFlag);.  Tcl_S
105d0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
105e0 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
105f0 6a 28 69 56 61 6c 75 65 29 29 3b 0a 20 20 72 65  j(iValue));.  re
10600 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
10610 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
10620 6c 69 74 65 33 5f 6e 65 78 74 5f 73 74 6d 74 20  lite3_next_stmt 
10630 20 44 42 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20   DB  STMT.**.** 
10640 52 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20  Return the next 
10650 73 74 61 74 6d 65 6e 74 20 69 6e 20 73 65 71 75  statment in sequ
10660 65 6e 63 65 20 61 66 74 65 72 20 53 54 4d 54 2e  ence after STMT.
10670 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
10680 65 73 74 5f 6e 65 78 74 5f 73 74 6d 74 28 0a 20  est_next_stmt(. 
10690 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
106a0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
106b0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
106c0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
106d0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
106e0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
106f0 2a 70 53 74 6d 74 3b 0a 20 20 73 71 6c 69 74 65  *pStmt;.  sqlite
10700 33 20 2a 64 62 20 3d 20 30 3b 0a 20 20 63 68 61  3 *db = 0;.  cha
10710 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 0a 20 20 69  r zBuf[50];..  i
10720 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
10730 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
10740 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
10750 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
10760 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
10770 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
10780 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
10790 29 2c 20 22 20 44 42 20 53 54 4d 54 22 2c 20 30  ), " DB STMT", 0
107a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
107b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
107c0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
107d0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
107e0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
107f0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
10800 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
10810 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
10820 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
10830 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 26  ring(objv[2]), &
10840 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
10850 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 70 53 74  TCL_ERROR;.  pSt
10860 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f 6e 65 78  mt = sqlite3_nex
10870 74 5f 73 74 6d 74 28 64 62 2c 20 70 53 74 6d 74  t_stmt(db, pStmt
10880 29 3b 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29  );.  if( pStmt )
10890 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
108a0 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72  3TestMakePointer
108b0 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  Str(interp, zBuf
108c0 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72  , pStmt) ) retur
108d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
108e0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
108f0 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
10900 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
10910 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
10920 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
10930 33 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 20  3_stmt_readonly 
10940 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75   STMT.**.** Retu
10950 72 6e 20 74 72 75 65 20 69 66 20 53 54 4d 54 20  rn true if STMT 
10960 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
10970 72 20 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74  r or a pointer t
10980 6f 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  o a statement.**
10990 20 74 68 61 74 20 69 73 20 67 75 61 72 61 6e 74   that is guarant
109a0 65 65 64 20 74 6f 20 6c 65 61 76 65 20 74 68 65  eed to leave the
109b0 20 64 61 74 61 62 61 73 65 20 75 6e 6d 6f 64 69   database unmodi
109c0 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  fied..*/.static 
109d0 69 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 72 65  int test_stmt_re
109e0 61 64 6f 6e 6c 79 28 0a 20 20 76 6f 69 64 20 2a  adonly(.  void *
109f0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
10a00 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
10a10 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
10a20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
10a30 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
10a40 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
10a50 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
10a60 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
10a70 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
10a80 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
10a90 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
10aa0 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
10ab0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
10ac0 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
10ad0 2c 20 22 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20  , " STMT", 0);. 
10ae0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
10af0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
10b00 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
10b10 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
10b20 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
10b30 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
10b40 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
10b50 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 72  = sqlite3_stmt_r
10b60 65 61 64 6f 6e 6c 79 28 70 53 74 6d 74 29 3b 0a  eadonly(pStmt);.
10b70 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
10b80 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
10b90 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 63 29  ewBooleanObj(rc)
10ba0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
10bb0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
10bc0 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ge:  sqlite3_stm
10bd0 74 5f 62 75 73 79 20 20 53 54 4d 54 0a 2a 2a 0a  t_busy  STMT.**.
10be0 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
10bf0 66 20 53 54 4d 54 20 69 73 20 61 20 6e 6f 6e 2d  f STMT is a non-
10c00 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 74 6f 20  NULL pointer to 
10c10 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74  a statement.** t
10c20 68 61 74 20 68 61 73 20 62 65 65 6e 20 73 74 65  hat has been ste
10c30 70 70 65 64 20 62 75 74 20 6e 6f 74 20 74 6f 20  pped but not to 
10c40 63 6f 6d 70 6c 65 74 69 6f 6e 2e 0a 2a 2f 0a 73  completion..*/.s
10c50 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
10c60 74 6d 74 5f 62 75 73 79 28 0a 20 20 76 6f 69 64  tmt_busy(.  void
10c70 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
10c80 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
10c90 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
10ca0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
10cb0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
10cc0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
10cd0 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  t;.  int rc;..  
10ce0 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
10cf0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
10d00 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
10d10 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
10d20 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
10d30 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
10d40 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
10d50 30 29 2c 20 22 20 53 54 4d 54 22 2c 20 30 29 3b  0), " STMT", 0);
10d60 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
10d70 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
10d80 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
10d90 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
10da0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
10db0 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
10dc0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
10dd0 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  c = sqlite3_stmt
10de0 5f 62 75 73 79 28 70 53 74 6d 74 29 3b 0a 20 20  _busy(pStmt);.  
10df0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
10e00 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
10e10 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 63 29 29 3b  BooleanObj(rc));
10e20 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
10e30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
10e40 3a 20 20 75 73 65 73 5f 73 74 6d 74 5f 6a 6f 75  :  uses_stmt_jou
10e50 72 6e 61 6c 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a  rnal  STMT.**.**
10e60 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
10e70 53 54 4d 54 20 75 73 65 73 20 61 20 73 74 61 74  STMT uses a stat
10e80 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  ement journal..*
10e90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 73 65  /.static int use
10ea0 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 28 0a  s_stmt_journal(.
10eb0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
10ec0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
10ed0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
10ee0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
10ef0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
10f00 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
10f10 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20   *pStmt;..  if( 
10f20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
10f30 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
10f40 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
10f50 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
10f60 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
10f70 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
10f80 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
10f90 22 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20  " STMT", 0);.   
10fa0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
10fb0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
10fc0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
10fd0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
10fe0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
10ff0 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
11000 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74  L_ERROR;.  sqlit
11010 65 33 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79  e3_stmt_readonly
11020 28 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53  (pStmt);.  Tcl_S
11030 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
11040 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65  rp, Tcl_NewBoole
11050 61 6e 4f 62 6a 28 28 28 56 64 62 65 20 2a 29 70  anObj(((Vdbe *)p
11060 53 74 6d 74 29 2d 3e 75 73 65 73 53 74 6d 74 4a  Stmt)->usesStmtJ
11070 6f 75 72 6e 61 6c 29 29 3b 0a 20 20 72 65 74 75  ournal));.  retu
11080 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
11090 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
110a0 69 74 65 33 5f 72 65 73 65 74 20 20 53 54 4d 54  ite3_reset  STMT
110b0 20 0a 2a 2a 0a 2a 2a 20 52 65 73 65 74 20 61 20   .**.** Reset a 
110c0 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65  statement handle
110d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
110e0 74 65 73 74 5f 72 65 73 65 74 28 0a 20 20 76 6f  test_reset(.  vo
110f0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
11100 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
11110 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
11120 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
11130 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
11140 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
11150 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  tmt;.  int rc;..
11160 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
11170 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
11180 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
11190 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
111a0 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
111b0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
111c0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
111d0 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c  , 0), " <STMT>",
111e0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
111f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
11200 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
11210 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
11220 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
11230 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
11240 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11250 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
11260 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
11270 20 69 66 28 20 70 53 74 6d 74 20 26 26 20 73 71   if( pStmt && sq
11280 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
11290 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44  (interp, StmtToD
112a0 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 7b  b(pStmt), rc) ){
112b0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
112c0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c  ERROR;.  }.  Tcl
112d0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
112e0 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
112f0 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  orName(rc), TCL_
11300 53 54 41 54 49 43 29 3b 0a 2f 2a 0a 20 20 69 66  STATIC);./*.  if
11310 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
11320 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11330 7d 0a 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43  }.*/.  return TC
11340 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
11350 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65  sage:  sqlite3_e
11360 78 70 69 72 65 64 20 53 54 4d 54 20 0a 2a 2a 0a  xpired STMT .**.
11370 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
11380 66 20 61 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f  f a recompilatio
11390 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  n of the stateme
113a0 6e 74 20 69 73 20 72 65 63 6f 6d 6d 65 6e 64 65  nt is recommende
113b0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
113c0 20 74 65 73 74 5f 65 78 70 69 72 65 64 28 0a 20   test_expired(. 
113d0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
113e0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
113f0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
11400 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
11410 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
11420 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11430 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a  OMIT_DEPRECATED.
11440 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
11450 70 53 74 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a  pStmt;.  if( obj
11460 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
11470 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
11480 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
11490 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
114a0 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
114b0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
114c0 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c  objv[0], 0), " <
114d0 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20  STMT>", 0);.    
114e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
114f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53  ;.  }.  if( getS
11500 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
11510 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
11520 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
11530 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
11540 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74  ERROR;.  Tcl_Set
11550 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
11560 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e  , Tcl_NewBoolean
11570 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 78 70 69  Obj(sqlite3_expi
11580 72 65 64 28 70 53 74 6d 74 29 29 29 3b 0a 23 65  red(pStmt)));.#e
11590 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43  ndif.  return TC
115a0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
115b0 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 74  sage:  sqlite3_t
115c0 72 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67 73  ransfer_bindings
115d0 20 46 52 4f 4d 53 54 4d 54 20 54 4f 53 54 4d 54   FROMSTMT TOSTMT
115e0 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20  .**.** Transfer 
115f0 61 6c 6c 20 62 69 6e 64 69 6e 67 73 20 66 72 6f  all bindings fro
11600 6d 20 46 52 4f 4d 53 54 4d 54 20 6f 76 65 72 20  m FROMSTMT over 
11610 74 6f 20 54 4f 53 54 4d 54 0a 2a 2f 0a 73 74 61  to TOSTMT.*/.sta
11620 74 69 63 20 69 6e 74 20 74 65 73 74 5f 74 72 61  tic int test_tra
11630 6e 73 66 65 72 5f 62 69 6e 64 28 0a 20 20 76 6f  nsfer_bind(.  vo
11640 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
11650 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
11660 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
11670 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
11680 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69  NST objv[].){.#i
11690 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
116a0 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20 20 73  T_DEPRECATED.  s
116b0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
116c0 6d 74 31 2c 20 2a 70 53 74 6d 74 32 3b 0a 20 20  mt1, *pStmt2;.  
116d0 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
116e0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
116f0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
11700 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
11710 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
11720 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
11730 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
11740 30 29 2c 20 22 20 46 52 4f 4d 2d 53 54 4d 54 20  0), " FROM-STMT 
11750 54 4f 2d 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20  TO-STMT", 0);.  
11760 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
11770 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
11780 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
11790 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
117a0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
117b0 74 6d 74 31 29 29 20 72 65 74 75 72 6e 20 54 43  tmt1)) return TC
117c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 67  L_ERROR;.  if( g
117d0 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
117e0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
117f0 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 26 70  ing(objv[2]), &p
11800 53 74 6d 74 32 29 29 20 72 65 74 75 72 6e 20 54  Stmt2)) return T
11810 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
11820 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
11830 65 72 70 2c 20 0a 20 20 20 20 20 54 63 6c 5f 4e  erp, .     Tcl_N
11840 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  ewIntObj(sqlite3
11850 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e  _transfer_bindin
11860 67 73 28 70 53 74 6d 74 31 2c 70 53 74 6d 74 32  gs(pStmt1,pStmt2
11870 29 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  )));.#endif.  re
11880 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
11890 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
118a0 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 20 44 42  lite3_changes DB
118b0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
118c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e  e number of chan
118d0 67 65 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20  ges made to the 
118e0 64 61 74 61 62 61 73 65 20 62 79 20 74 68 65 20  database by the 
118f0 6c 61 73 74 20 53 51 4c 0a 2a 2a 20 65 78 65 63  last SQL.** exec
11900 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ution..*/.static
11910 20 69 6e 74 20 74 65 73 74 5f 63 68 61 6e 67 65   int test_change
11920 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  s(.  void * clie
11930 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
11940 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
11950 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
11960 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
11970 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
11980 64 62 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  db;.  if( objc!=
11990 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
119a0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
119b0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
119c0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
119d0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
119e0 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
119f0 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
11a00 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11a10 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
11a20 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
11a30 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
11a40 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
11a50 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11a60 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
11a70 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
11a80 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  ewIntObj(sqlite3
11a90 5f 63 68 61 6e 67 65 73 28 64 62 29 29 29 3b 0a  _changes(db)));.
11aa0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
11ab0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
11ac0 73 20 74 68 65 20 22 73 74 61 74 69 63 5f 62 69  s the "static_bi
11ad0 6e 64 5f 76 61 6c 75 65 22 20 74 68 61 74 20 76  nd_value" that v
11ae0 61 72 69 61 62 6c 65 73 20 61 72 65 20 62 6f 75  ariables are bou
11af0 6e 64 20 74 6f 20 77 68 65 6e 0a 2a 2a 20 74 68  nd to when.** th
11b00 65 20 46 4c 41 47 20 6f 70 74 69 6f 6e 20 6f 66  e FLAG option of
11b10 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 20 69 73   sqlite3_bind is
11b20 20 22 73 74 61 74 69 63 22 0a 2a 2f 0a 73 74 61   "static".*/.sta
11b30 74 69 63 20 63 68 61 72 20 2a 73 71 6c 69 74 65  tic char *sqlite
11b40 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c  _static_bind_val
11b50 75 65 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69  ue = 0;.static i
11b60 6e 74 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63  nt sqlite_static
11b70 5f 62 69 6e 64 5f 6e 62 79 74 65 20 3d 20 30 3b  _bind_nbyte = 0;
11b80 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
11b90 73 71 6c 69 74 65 33 5f 62 69 6e 64 20 20 56 4d  sqlite3_bind  VM
11ba0 20 20 49 44 58 20 20 56 41 4c 55 45 20 20 46 4c    IDX  VALUE  FL
11bb0 41 47 53 0a 2a 2a 0a 2a 2a 20 53 65 74 73 20 74  AGS.**.** Sets t
11bc0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
11bd0 49 44 58 2d 74 68 20 6f 63 63 75 72 61 6e 63 65  IDX-th occurance
11be0 20 6f 66 20 22 3f 22 20 69 6e 20 74 68 65 20 6f   of "?" in the o
11bf0 72 69 67 69 6e 61 6c 20 53 51 4c 0a 2a 2a 20 73  riginal SQL.** s
11c00 74 72 69 6e 67 2e 20 20 56 41 4c 55 45 20 69 73  tring.  VALUE is
11c10 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 2e 20   the new value. 
11c20 20 49 66 20 46 4c 41 47 53 3d 3d 22 6e 75 6c 6c   If FLAGS=="null
11c30 22 20 74 68 65 6e 20 56 41 4c 55 45 20 69 73 0a  " then VALUE is.
11c40 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 74  ** ignored and t
11c50 68 65 20 76 61 6c 75 65 20 69 73 20 73 65 74 20  he value is set 
11c60 74 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 46 4c 41  to NULL.  If FLA
11c70 47 53 3d 3d 22 73 74 61 74 69 63 22 20 74 68 65  GS=="static" the
11c80 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69  n.** the value i
11c90 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
11ca0 75 65 20 6f 66 20 61 20 73 74 61 74 69 63 20 76  ue of a static v
11cb0 61 72 69 61 62 6c 65 20 6e 61 6d 65 64 0a 2a 2a  ariable named.**
11cc0 20 22 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f   "sqlite_static_
11cd0 62 69 6e 64 5f 76 61 6c 75 65 22 2e 20 20 49 66  bind_value".  If
11ce0 20 46 4c 41 47 53 3d 3d 22 6e 6f 72 6d 61 6c 22   FLAGS=="normal"
11cf0 20 74 68 65 6e 20 61 20 63 6f 70 79 0a 2a 2a 20   then a copy.** 
11d00 6f 66 20 74 68 65 20 56 41 4c 55 45 20 69 73 20  of the VALUE is 
11d10 6d 61 64 65 2e 20 20 49 66 20 46 4c 41 47 53 3d  made.  If FLAGS=
11d20 3d 22 62 6c 6f 62 31 30 22 20 74 68 65 6e 20 61  ="blob10" then a
11d30 20 56 41 4c 55 45 20 69 73 20 69 67 6e 6f 72 65   VALUE is ignore
11d40 64 0a 2a 2a 20 61 6e 20 61 20 31 30 2d 62 79 74  d.** an a 10-byt
11d50 65 20 62 6c 6f 62 20 22 61 62 63 5c 30 30 30 78  e blob "abc\000x
11d60 79 7a 5c 30 30 30 70 71 22 20 69 73 20 69 6e 73  yz\000pq" is ins
11d70 65 72 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  erted..*/.static
11d80 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 28 0a   int test_bind(.
11d90 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
11da0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
11db0 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
11dc0 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
11dd0 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
11de0 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
11df0 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
11e00 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
11e10 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
11e20 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
11e30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
11e40 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
11e50 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
11e60 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
11e70 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
11e80 69 64 78 3b 0a 20 20 69 66 28 20 61 72 67 63 21  idx;.  if( argc!
11e90 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =5 ){.    Tcl_Ap
11ea0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
11eb0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
11ec0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
11ed0 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
11ee0 20 20 22 20 56 4d 20 49 44 58 20 56 41 4c 55 45    " VM IDX VALUE
11ef0 20 28 6e 75 6c 6c 7c 73 74 61 74 69 63 7c 6e 6f   (null|static|no
11f00 72 6d 61 6c 29 5c 22 22 2c 20 30 29 3b 0a 20 20  rmal)\"", 0);.  
11f10 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
11f20 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
11f30 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
11f40 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 70  erp, argv[1], &p
11f50 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
11f60 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
11f70 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72  Tcl_GetInt(inter
11f80 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26 69 64 78  p, argv[2], &idx
11f90 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
11fa0 52 52 4f 52 3b 0a 20 20 69 66 28 20 73 74 72 63  RROR;.  if( strc
11fb0 6d 70 28 61 72 67 76 5b 34 5d 2c 22 6e 75 6c 6c  mp(argv[4],"null
11fc0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ")==0 ){.    rc 
11fd0 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e  = sqlite3_bind_n
11fe0 75 6c 6c 28 70 53 74 6d 74 2c 20 69 64 78 29 3b  ull(pStmt, idx);
11ff0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
12000 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 73 74 61  cmp(argv[4],"sta
12010 74 69 63 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tic")==0 ){.    
12020 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
12030 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64  d_text(pStmt, id
12040 78 2c 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63  x, sqlite_static
12050 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 20 2d 31 2c  _bind_value, -1,
12060 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   0);.  }else if(
12070 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c   strcmp(argv[4],
12080 22 73 74 61 74 69 63 2d 6e 62 79 74 65 73 22 29  "static-nbytes")
12090 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
120a0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
120b0 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 73 71  t(pStmt, idx, sq
120c0 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64  lite_static_bind
120d0 5f 76 61 6c 75 65 2c 0a 20 20 20 20 20 20 20 20  _value,.        
120e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
12100 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e  qlite_static_bin
12110 64 5f 6e 62 79 74 65 2c 20 30 29 3b 0a 20 20 7d  d_nbyte, 0);.  }
12120 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
12130 61 72 67 76 5b 34 5d 2c 22 6e 6f 72 6d 61 6c 22  argv[4],"normal"
12140 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
12150 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
12160 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 61  xt(pStmt, idx, a
12170 72 67 76 5b 33 5d 2c 20 2d 31 2c 20 53 51 4c 49  rgv[3], -1, SQLI
12180 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
12190 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
121a0 70 28 61 72 67 76 5b 34 5d 2c 22 62 6c 6f 62 31  p(argv[4],"blob1
121b0 30 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  0")==0 ){.    rc
121c0 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
121d0 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c  text(pStmt, idx,
121e0 20 22 61 62 63 5c 30 30 30 78 79 7a 5c 30 30 30   "abc\000xyz\000
121f0 70 71 22 2c 20 31 30 2c 20 53 51 4c 49 54 45 5f  pq", 10, SQLITE_
12200 53 54 41 54 49 43 29 3b 0a 20 20 7d 65 6c 73 65  STATIC);.  }else
12210 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
12220 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
12230 34 74 68 20 61 72 67 75 6d 65 6e 74 20 73 68 6f  4th argument sho
12240 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20 20  uld be ".       
12250 20 22 5c 22 6e 75 6c 6c 5c 22 20 6f 72 20 5c 22   "\"null\" or \"
12260 73 74 61 74 69 63 5c 22 20 6f 72 20 5c 22 6e 6f  static\" or \"no
12270 72 6d 61 6c 5c 22 22 2c 20 30 29 3b 0a 20 20 20  rmal\"", 0);.   
12280 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
12290 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  R;.  }.  if( sql
122a0 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
122b0 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62  interp, StmtToDb
122c0 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72  (pStmt), rc) ) r
122d0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
122e0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
122f0 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
12300 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66      sprintf(zBuf
12310 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b 0a  , "(%d) ", rc);.
12320 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
12330 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
12340 66 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  f, sqlite3ErrStr
12350 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (rc), 0);.    re
12360 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12370 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
12380 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  _OK;.}..#ifndef 
12390 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
123a0 36 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61  6./*.** Usage: a
123b0 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20  dd_test_collate 
123c0 3c 64 62 20 70 74 72 3e 20 3c 75 74 66 38 3e 20  <db ptr> <utf8> 
123d0 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36  <utf16le> <utf16
123e0 62 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  be>.**.** This f
123f0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
12400 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
12410 69 74 65 20 73 65 6c 65 63 74 73 20 74 68 65 20  ite selects the 
12420 63 6f 72 72 65 63 74 20 63 6f 6c 6c 61 74 69 6f  correct collatio
12430 6e 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 63 61  n.** sequence ca
12440 6c 6c 62 61 63 6b 20 77 68 65 6e 20 6d 75 6c 74  llback when mult
12450 69 70 6c 65 20 76 65 72 73 69 6f 6e 73 20 28 66  iple versions (f
12460 6f 72 20 64 69 66 66 65 72 65 6e 74 20 74 65 78  or different tex
12470 74 20 65 6e 63 6f 64 69 6e 67 73 29 0a 2a 2a 20  t encodings).** 
12480 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a  are available..*
12490 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69  *.** Calling thi
124a0 73 20 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74  s routine regist
124b0 65 72 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ers the collatio
124c0 6e 20 73 65 71 75 65 6e 63 65 20 22 74 65 73 74  n sequence "test
124d0 5f 63 6f 6c 6c 61 74 65 22 0a 2a 2a 20 77 69 74  _collate".** wit
124e0 68 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  h database handl
124f0 65 20 3c 64 62 3e 2e 20 54 68 65 20 73 65 63 6f  e <db>. The seco
12500 6e 64 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74  nd argument must
12510 20 62 65 20 61 20 6c 69 73 74 20 6f 66 20 74 68   be a list of th
12520 72 65 65 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20 76  ree.** boolean v
12530 61 6c 75 65 73 2e 20 49 66 20 74 68 65 20 66 69  alues. If the fi
12540 72 73 74 20 69 73 20 74 72 75 65 2c 20 74 68 65  rst is true, the
12550 6e 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  n a version of t
12560 65 73 74 5f 63 6f 6c 6c 61 74 65 20 69 73 0a 2a  est_collate is.*
12570 2a 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72  * registered for
12580 20 55 54 46 2d 38 2c 20 69 66 20 74 68 65 20 73   UTF-8, if the s
12590 65 63 6f 6e 64 20 69 73 20 74 72 75 65 2c 20 61  econd is true, a
125a0 20 76 65 72 73 69 6f 6e 20 69 73 20 72 65 67 69   version is regi
125b0 73 74 65 72 65 64 20 66 6f 72 0a 2a 2a 20 55 54  stered for.** UT
125c0 46 2d 31 36 6c 65 2c 20 69 66 20 74 68 65 20 74  F-16le, if the t
125d0 68 69 72 64 20 69 73 20 74 72 75 65 2c 20 61 20  hird is true, a 
125e0 55 54 46 2d 31 36 62 65 20 76 65 72 73 69 6f 6e  UTF-16be version
125f0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a   is available..*
12600 2a 20 50 72 65 76 69 6f 75 73 20 76 65 72 73 69  * Previous versi
12610 6f 6e 73 20 6f 66 20 74 65 73 74 5f 63 6f 6c 6c  ons of test_coll
12620 61 74 65 20 61 72 65 20 64 65 6c 65 74 65 64 2e  ate are deleted.
12630 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61  .**.** The colla
12640 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 65  tion sequence te
12650 73 74 5f 63 6f 6c 6c 61 74 65 20 69 73 20 69 6d  st_collate is im
12660 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 61 6c  plemented by cal
12670 6c 69 6e 67 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c  ling the.** foll
12680 6f 77 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74  owing TCL script
12690 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 74 65 73 74 5f  :.**.**   "test_
126a0 63 6f 6c 6c 61 74 65 20 3c 65 6e 63 3e 20 3c 6c  collate <enc> <l
126b0 68 73 3e 20 3c 72 68 73 3e 22 0a 2a 2a 0a 2a 2a  hs> <rhs>".**.**
126c0 20 54 68 65 20 3c 6c 68 73 3e 20 61 6e 64 20 3c   The <lhs> and <
126d0 72 68 73 3e 20 61 72 65 20 74 68 65 20 74 77 6f  rhs> are the two
126e0 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 63 6f   values being co
126f0 6d 70 61 72 65 64 2c 20 65 6e 63 6f 64 65 64 20  mpared, encoded 
12700 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 54 68 65  in UTF-8..** The
12710 20 3c 65 6e 63 3e 20 70 61 72 61 6d 65 74 65 72   <enc> parameter
12720 20 69 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67   is the encoding
12730 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   of the collatio
12740 6e 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a  n function that.
12750 2a 2a 20 53 51 4c 69 74 65 20 73 65 6c 65 63 74  ** SQLite select
12760 65 64 20 74 6f 20 63 61 6c 6c 2e 20 54 68 65 20  ed to call. The 
12770 54 43 4c 20 74 65 73 74 20 73 63 72 69 70 74 20  TCL test script 
12780 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 0a 2a  implements the.*
12790 2a 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  * "test_collate"
127a0 20 70 72 6f 63 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74   proc..**.** Not
127b0 65 20 74 68 61 74 20 74 68 69 73 20 77 69 6c 6c  e that this will
127c0 20 6f 6e 6c 79 20 77 6f 72 6b 20 77 69 74 68 20   only work with 
127d0 6f 6e 65 20 69 6e 74 65 70 72 65 74 65 72 20 61  one intepreter a
127e0 74 20 61 20 74 69 6d 65 2c 20 61 73 20 74 68 65  t a time, as the
127f0 0a 2a 2a 20 69 6e 74 65 72 70 20 70 6f 69 6e 74  .** interp point
12800 65 72 20 74 6f 20 75 73 65 20 77 68 65 6e 20 65  er to use when e
12810 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 54 43  valuating the TC
12820 4c 20 73 63 72 69 70 74 20 69 73 20 73 74 6f 72  L script is stor
12830 65 64 20 69 6e 0a 2a 2a 20 70 54 65 73 74 43 6f  ed in.** pTestCo
12840 6c 6c 61 74 65 49 6e 74 65 72 70 2e 0a 2a 2f 0a  llateInterp..*/.
12850 73 74 61 74 69 63 20 54 63 6c 5f 49 6e 74 65 72  static Tcl_Inter
12860 70 2a 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49  p* pTestCollateI
12870 6e 74 65 72 70 3b 0a 73 74 61 74 69 63 20 69 6e  nterp;.static in
12880 74 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66  t test_collate_f
12890 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70 43 74  unc(.  void *pCt
128a0 78 2c 20 0a 20 20 69 6e 74 20 6e 41 2c 20 63 6f  x, .  int nA, co
128b0 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a 20 20  nst void *zA,.  
128c0 69 6e 74 20 6e 42 2c 20 63 6f 6e 73 74 20 76 6f  int nB, const vo
128d0 69 64 20 2a 7a 42 0a 29 7b 0a 20 20 54 63 6c 5f  id *zB.){.  Tcl_
128e0 49 6e 74 65 72 70 20 2a 69 20 3d 20 70 54 65 73  Interp *i = pTes
128f0 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 3b 0a  tCollateInterp;.
12900 20 20 69 6e 74 20 65 6e 63 69 6e 20 3d 20 53 51    int encin = SQ
12910 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
12920 70 43 74 78 29 3b 0a 20 20 69 6e 74 20 72 65 73  pCtx);.  int res
12930 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 73 71  ;.  int n;..  sq
12940 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
12950 6c 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58  l;.  Tcl_Obj *pX
12960 3b 0a 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65  ;..  pX = Tcl_Ne
12970 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74  wStringObj("test
12980 5f 63 6f 6c 6c 61 74 65 22 2c 20 2d 31 29 3b 0a  _collate", -1);.
12990 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
129a0 6e 74 28 70 58 29 3b 0a 0a 20 20 73 77 69 74 63  nt(pX);..  switc
129b0 68 28 20 65 6e 63 69 6e 20 29 7b 0a 20 20 20 20  h( encin ){.    
129c0 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46 38  case SQLITE_UTF8
129d0 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74  :.      Tcl_List
129e0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
129f0 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72  (i,pX,Tcl_NewStr
12a00 69 6e 67 4f 62 6a 28 22 55 54 46 2d 38 22 2c 2d  ingObj("UTF-8",-
12a10 31 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  1));.      break
12a20 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
12a30 45 5f 55 54 46 31 36 4c 45 3a 0a 20 20 20 20 20  E_UTF16LE:.     
12a40 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
12a50 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54  ndElement(i,pX,T
12a60 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
12a70 22 55 54 46 2d 31 36 4c 45 22 2c 2d 31 29 29 3b  "UTF-16LE",-1));
12a80 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
12a90 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54    case SQLITE_UT
12aa0 46 31 36 42 45 3a 0a 20 20 20 20 20 20 54 63 6c  F16BE:.      Tcl
12ab0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
12ac0 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e  ement(i,pX,Tcl_N
12ad0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46  ewStringObj("UTF
12ae0 2d 31 36 42 45 22 2c 2d 31 29 29 3b 0a 20 20 20  -16BE",-1));.   
12af0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
12b00 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73  fault:.      ass
12b10 65 72 74 28 30 29 3b 0a 20 20 7d 0a 0a 20 20 73  ert(0);.  }..  s
12b20 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
12b30 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 56 61  nMalloc();.  pVa
12b40 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  l = sqlite3Value
12b50 4e 65 77 28 30 29 3b 0a 20 20 69 66 28 20 70 56  New(0);.  if( pV
12b60 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
12b70 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61  3ValueSetStr(pVa
12b80 6c 2c 20 6e 41 2c 20 7a 41 2c 20 65 6e 63 69 6e  l, nA, zA, encin
12b90 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
12ba0 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65  ;.    n = sqlite
12bb0 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 56  3_value_bytes(pV
12bc0 61 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  al);.    Tcl_Lis
12bd0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
12be0 74 28 69 2c 70 58 2c 0a 20 20 20 20 20 20 20 20  t(i,pX,.        
12bf0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
12c00 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  ((char*)sqlite3_
12c10 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29  value_text(pVal)
12c20 2c 6e 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ,n));.    sqlite
12c30 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61  3ValueSetStr(pVa
12c40 6c 2c 20 6e 42 2c 20 7a 42 2c 20 65 6e 63 69 6e  l, nB, zB, encin
12c50 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
12c60 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65  ;.    n = sqlite
12c70 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 56  3_value_bytes(pV
12c80 61 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  al);.    Tcl_Lis
12c90 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
12ca0 74 28 69 2c 70 58 2c 0a 20 20 20 20 20 20 20 20  t(i,pX,.        
12cb0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
12cc0 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  ((char*)sqlite3_
12cd0 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29  value_text(pVal)
12ce0 2c 6e 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ,n));.    sqlite
12cf0 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
12d00 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
12d10 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
12d20 3b 0a 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  ;..  Tcl_EvalObj
12d30 45 78 28 69 2c 20 70 58 2c 20 30 29 3b 0a 20 20  Ex(i, pX, 0);.  
12d40 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
12d50 28 70 58 29 3b 0a 20 20 54 63 6c 5f 47 65 74 49  (pX);.  Tcl_GetI
12d60 6e 74 46 72 6f 6d 4f 62 6a 28 69 2c 20 54 63 6c  ntFromObj(i, Tcl
12d70 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 29  _GetObjResult(i)
12d80 2c 20 26 72 65 73 29 3b 0a 20 20 72 65 74 75 72  , &res);.  retur
12d90 6e 20 72 65 73 3b 0a 7d 0a 73 74 61 74 69 63 20  n res;.}.static 
12da0 69 6e 74 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65  int test_collate
12db0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
12dc0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
12dd0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
12de0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
12df0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
12e00 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
12e10 62 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20  b;.  int val;.  
12e20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
12e30 56 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  Val;.  int rc;..
12e40 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 20    if( objc!=5 ) 
12e50 67 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20  goto bad_args;. 
12e60 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74   pTestCollateInt
12e70 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
12e80 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
12e90 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
12ea0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
12eb0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
12ec0 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28  CL_ERROR;..  if(
12ed0 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74   TCL_OK!=Tcl_Get
12ee0 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
12ef0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
12f00 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &val) ) return T
12f10 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
12f20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
12f30 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 74  collation(db, "t
12f40 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53 51  est_collate", SQ
12f50 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20  LITE_UTF8, .    
12f60 20 20 20 20 20 20 28 76 6f 69 64 20 2a 29 53 51        (void *)SQ
12f70 4c 49 54 45 5f 55 54 46 38 2c 20 76 61 6c 3f 74  LITE_UTF8, val?t
12f80 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63  est_collate_func
12f90 3a 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  :0);.  if( rc==S
12fa0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12fb0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 55 74 66  const void *zUtf
12fc0 31 36 3b 0a 20 20 20 20 69 66 28 20 54 43 4c 5f  16;.    if( TCL_
12fd0 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  OK!=Tcl_GetBoole
12fe0 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
12ff0 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29  , objv[3], &val)
13000 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
13010 52 4f 52 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ROR;.    rc = sq
13020 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
13030 6c 61 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74  lation(db, "test
13040 5f 63 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54  _collate", SQLIT
13050 45 5f 55 54 46 31 36 4c 45 2c 20 0a 20 20 20 20  E_UTF16LE, .    
13060 20 20 20 20 20 20 20 20 28 76 6f 69 64 20 2a 29          (void *)
13070 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20  SQLITE_UTF16LE, 
13080 76 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61 74 65  val?test_collate
13090 5f 66 75 6e 63 3a 30 29 3b 0a 20 20 20 20 69 66  _func:0);.    if
130a0 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65  ( TCL_OK!=Tcl_Ge
130b0 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
130c0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
130d0 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20   &val) ) return 
130e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 23 69 66 20  TCL_ERROR;..#if 
130f0 30 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  0.    if( sqlite
13100 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 3e 30 20  3_iMallocFail>0 
13110 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13120 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 2b 2b 3b 0a  _iMallocFail++;.
13130 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
13140 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
13150 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
13160 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69  .    pVal = sqli
13170 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b  te3ValueNew(db);
13180 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
13190 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31  eSetStr(pVal, -1
131a0 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  , "test_collate"
131b0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
131c0 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
131d0 20 20 20 7a 55 74 66 31 36 20 3d 20 73 71 6c 69     zUtf16 = sqli
131e0 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61  te3ValueText(pVa
131f0 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  l, SQLITE_UTF16N
13200 41 54 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20  ATIVE);.    if( 
13210 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
13220 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
13230 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
13240 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
13250 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
13260 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 64 62  e_collation16(db
13270 2c 20 7a 55 74 66 31 36 2c 20 53 51 4c 49 54 45  , zUtf16, SQLITE
13280 5f 55 54 46 31 36 42 45 2c 20 0a 20 20 20 20 20  _UTF16BE, .     
13290 20 20 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c       (void *)SQL
132a0 49 54 45 5f 55 54 46 31 36 42 45 2c 20 76 61 6c  ITE_UTF16BE, val
132b0 3f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75  ?test_collate_fu
132c0 6e 63 3a 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  nc:0);.    }.   
132d0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
132e0 65 28 70 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c  e(pVal);.    sql
132f0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
13300 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d  (db->mutex);.  }
13310 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
13320 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
13330 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
13340 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
13350 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
13360 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
13370 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
13380 65 72 70 2c 20 73 71 6c 69 74 65 33 54 65 73 74  erp, sqlite3Test
13390 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30  ErrorName(rc), 0
133a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
133b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
133c0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 62  eturn TCL_OK;..b
133d0 61 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 41  ad_args:.  Tcl_A
133e0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
133f0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
13400 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
13410 2c 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  ,.      Tcl_GetS
13420 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
13430 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 44 42 3e  v[0], 0), " <DB>
13440 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65   <utf8> <utf16le
13450 3e 20 3c 75 74 66 31 36 62 65 3e 22 2c 20 30 29  > <utf16be>", 0)
13460 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ;.  return TCL_E
13470 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  RROR;.}../*.** W
13480 68 65 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  hen the collatio
13490 6e 20 6e 65 65 64 65 64 20 63 61 6c 6c 62 61 63  n needed callbac
134a0 6b 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 72 65  k is invoked, re
134b0 63 6f 72 64 20 74 68 65 20 6e 61 6d 65 20 6f 66  cord the name of
134c0 20 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74   .** the request
134d0 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  ed collating fun
134e0 63 74 69 6f 6e 20 68 65 72 65 2e 20 20 54 68 65  ction here.  The
134f0 20 72 65 63 6f 72 64 65 64 20 6e 61 6d 65 20 69   recorded name i
13500 73 20 6c 69 6e 6b 65 64 0a 2a 2a 20 74 6f 20 61  s linked.** to a
13510 20 54 43 4c 20 76 61 72 69 61 62 6c 65 20 61 6e   TCL variable an
13520 64 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73  d used to make s
13530 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65 71  ure that the req
13540 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  uested collation
13550 0a 2a 2a 20 6e 61 6d 65 20 69 73 20 63 6f 72 72  .** name is corr
13560 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ect..*/.static c
13570 68 61 72 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61  har zNeededColla
13580 74 69 6f 6e 5b 32 30 30 5d 3b 0a 73 74 61 74 69  tion[200];.stati
13590 63 20 63 68 61 72 20 2a 70 7a 4e 65 65 64 65 64  c char *pzNeeded
135a0 43 6f 6c 6c 61 74 69 6f 6e 20 3d 20 7a 4e 65 65  Collation = zNee
135b0 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 3b 0a 0a 0a  dedCollation;...
135c0 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20 77 68 65  /*.** Called whe
135d0 6e 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  n a collating se
135e0 71 75 65 6e 63 65 20 69 73 20 6e 65 65 64 65 64  quence is needed
135f0 2e 20 20 52 65 67 69 73 74 65 72 65 64 20 75 73  .  Registered us
13600 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63  ing.** sqlite3_c
13610 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31  ollation_needed1
13620 36 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  6()..*/.static v
13630 6f 69 64 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65  oid test_collate
13640 5f 6e 65 65 64 65 64 5f 63 62 28 0a 20 20 76 6f  _needed_cb(.  vo
13650 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 73 71 6c  id *pCtx, .  sql
13660 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20  ite3 *db,.  int 
13670 65 54 65 78 74 52 65 70 2c 0a 20 20 63 6f 6e 73  eTextRep,.  cons
13680 74 20 76 6f 69 64 20 2a 70 4e 61 6d 65 0a 29 7b  t void *pName.){
13690 0a 20 20 69 6e 74 20 65 6e 63 20 3d 20 45 4e 43  .  int enc = ENC
136a0 28 64 62 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  (db);.  int i;. 
136b0 20 63 68 61 72 20 2a 7a 3b 0a 20 20 66 6f 72 28   char *z;.  for(
136c0 7a 20 3d 20 28 63 68 61 72 2a 29 70 4e 61 6d 65  z = (char*)pName
136d0 2c 20 69 3d 30 3b 20 2a 7a 20 7c 7c 20 7a 5b 31  , i=0; *z || z[1
136e0 5d 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ]; z++){.    if(
136f0 20 2a 7a 20 29 20 7a 4e 65 65 64 65 64 43 6f 6c   *z ) zNeededCol
13700 6c 61 74 69 6f 6e 5b 69 2b 2b 5d 20 3d 20 2a 7a  lation[i++] = *z
13710 3b 0a 20 20 7d 0a 20 20 7a 4e 65 65 64 65 64 43  ;.  }.  zNeededC
13720 6f 6c 6c 61 74 69 6f 6e 5b 69 5d 20 3d 20 30 3b  ollation[i] = 0;
13730 0a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  .  sqlite3_creat
13740 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 20  e_collation(.   
13750 20 20 20 64 62 2c 20 22 74 65 73 74 5f 63 6f 6c     db, "test_col
13760 6c 61 74 65 22 2c 20 45 4e 43 28 64 62 29 2c 20  late", ENC(db), 
13770 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54  SQLITE_INT_TO_PT
13780 52 28 65 6e 63 29 2c 20 74 65 73 74 5f 63 6f 6c  R(enc), test_col
13790 6c 61 74 65 5f 66 75 6e 63 29 3b 0a 7d 0a 0a 2f  late_func);.}../
137a0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64 64 5f  *.** Usage: add_
137b0 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65  test_collate_nee
137c0 64 65 64 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63  ded DB.*/.static
137d0 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 6c 61 74   int test_collat
137e0 65 5f 6e 65 65 64 65 64 28 0a 20 20 76 6f 69 64  e_needed(.  void
137f0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
13800 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
13810 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
13820 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
13830 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
13840 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
13850 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
13860 21 3d 32 20 29 20 67 6f 74 6f 20 62 61 64 5f 61  !=2 ) goto bad_a
13870 72 67 73 3b 0a 20 20 69 66 28 20 67 65 74 44 62  rgs;.  if( getDb
13880 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
13890 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
138a0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
138b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
138c0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
138d0 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64  collation_needed
138e0 31 36 28 64 62 2c 20 30 2c 20 74 65 73 74 5f 63  16(db, 0, test_c
138f0 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 5f 63 62  ollate_needed_cb
13900 29 3b 0a 20 20 7a 4e 65 65 64 65 64 43 6f 6c 6c  );.  zNeededColl
13910 61 74 69 6f 6e 5b 30 5d 20 3d 20 30 3b 0a 20 20  ation[0] = 0;.  
13920 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
13930 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
13940 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
13950 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74  TCL_ERROR;.  ret
13960 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 62 61 64  urn TCL_OK;..bad
13970 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 57 72 6f  _args:.  Tcl_Wro
13980 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
13990 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29  , 1, objv, "DB")
139a0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ;.  return TCL_E
139b0 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  RROR;.}../*.** t
139c0 63 6c 63 6d 64 3a 20 20 20 61 64 64 5f 61 6c 69  clcmd:   add_ali
139d0 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c  gnment_test_coll
139e0 61 74 69 6f 6e 73 20 20 44 42 0a 2a 2a 0a 2a 2a  ations  DB.**.**
139f0 20 41 64 64 20 74 77 6f 20 6e 65 77 20 63 6f 6c   Add two new col
13a00 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
13a10 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
13a20 20 44 42 0a 2a 2a 0a 2a 2a 20 20 20 20 20 75 74   DB.**.**     ut
13a30 66 31 36 5f 61 6c 69 67 6e 65 64 0a 2a 2a 20 20  f16_aligned.**  
13a40 20 20 20 75 74 66 31 36 5f 75 6e 61 6c 69 67 6e     utf16_unalign
13a50 65 64 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 63 6f  ed.**.** Both co
13a60 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
13a70 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 73  s use the same s
13a80 6f 72 74 20 6f 72 64 65 72 20 61 73 20 42 49 4e  ort order as BIN
13a90 41 52 59 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79  ARY..** The only
13aa0 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 20 74   difference is t
13ab0 68 61 74 20 74 68 65 20 75 74 66 31 36 5f 61 6c  hat the utf16_al
13ac0 69 67 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 0a  igned collating.
13ad0 2a 2a 20 73 65 71 75 65 6e 63 65 20 69 73 20 64  ** sequence is d
13ae0 65 63 6c 61 72 65 64 20 77 69 74 68 20 74 68 65  eclared with the
13af0 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c   SQLITE_UTF16_AL
13b00 49 47 4e 45 44 20 66 6c 61 67 2e 0a 2a 2a 20 42  IGNED flag..** B
13b10 6f 74 68 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  oth collating fu
13b20 6e 63 74 69 6f 6e 73 20 69 6e 63 72 65 6d 65 6e  nctions incremen
13b30 74 20 74 68 65 20 75 6e 61 6c 69 67 6e 65 64 20  t the unaligned 
13b40 75 74 66 31 36 20 63 6f 75 6e 74 65 72 0a 2a 2a  utf16 counter.**
13b50 20 77 68 65 6e 65 76 65 72 20 74 68 65 79 20 73   whenever they s
13b60 65 65 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  ee a string that
13b70 20 62 65 67 69 6e 73 20 6f 6e 20 61 6e 20 6f 64   begins on an od
13b80 64 20 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e  d byte boundary.
13b90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
13ba0 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f  naligned_string_
13bb0 63 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 73 74 61  counter = 0;.sta
13bc0 74 69 63 20 69 6e 74 20 61 6c 69 67 6e 6d 65 6e  tic int alignmen
13bd0 74 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76 6f 69  tCollFunc(.  voi
13be0 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e  d *NotUsed,.  in
13bf0 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
13c00 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e  oid *pKey1,.  in
13c10 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76  t nKey2, const v
13c20 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20  oid *pKey2.){.  
13c30 69 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d  int rc, n;.  n =
13c40 20 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e   nKey1<nKey2 ? n
13c50 4b 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20  Key1 : nKey2;.  
13c60 69 66 28 20 6e 4b 65 79 31 3e 30 20 26 26 20 31  if( nKey1>0 && 1
13c70 3d 3d 28 31 26 28 53 51 4c 49 54 45 5f 50 54 52  ==(1&(SQLITE_PTR
13c80 5f 54 4f 5f 49 4e 54 28 70 4b 65 79 31 29 29 29  _TO_INT(pKey1)))
13c90 20 29 20 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72   ) unaligned_str
13ca0 69 6e 67 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  ing_counter++;. 
13cb0 20 69 66 28 20 6e 4b 65 79 32 3e 30 20 26 26 20   if( nKey2>0 && 
13cc0 31 3d 3d 28 31 26 28 53 51 4c 49 54 45 5f 50 54  1==(1&(SQLITE_PT
13cd0 52 5f 54 4f 5f 49 4e 54 28 70 4b 65 79 32 29 29  R_TO_INT(pKey2))
13ce0 29 20 29 20 75 6e 61 6c 69 67 6e 65 64 5f 73 74  ) ) unaligned_st
13cf0 72 69 6e 67 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a  ring_counter++;.
13d00 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b    rc = memcmp(pK
13d10 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a  ey1, pKey2, n);.
13d20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20    if( rc==0 ){. 
13d30 20 20 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d 20     rc = nKey1 - 
13d40 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74  nKey2;.  }.  ret
13d50 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63  urn rc;.}.static
13d60 20 69 6e 74 20 61 64 64 5f 61 6c 69 67 6e 6d 65   int add_alignme
13d70 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f  nt_test_collatio
13d80 6e 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ns(.  void * cli
13d90 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
13da0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
13db0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
13dc0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
13dd0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
13de0 2a 64 62 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3e  *db;.  if( objc>
13df0 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65  =2 ){.    if( ge
13e00 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
13e10 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
13e20 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
13e30 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
13e40 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  OR;.    sqlite3_
13e50 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
13e60 28 64 62 2c 20 22 75 74 66 31 36 5f 75 6e 61 6c  (db, "utf16_unal
13e70 69 67 6e 65 64 22 2c 20 53 51 4c 49 54 45 5f 55  igned", SQLITE_U
13e80 54 46 31 36 2c 20 0a 20 20 20 20 20 20 20 20 30  TF16, .        0
13e90 2c 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c 46  , alignmentCollF
13ea0 75 6e 63 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  unc);.    sqlite
13eb0 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
13ec0 6f 6e 28 64 62 2c 20 22 75 74 66 31 36 5f 61 6c  on(db, "utf16_al
13ed0 69 67 6e 65 64 22 2c 20 53 51 4c 49 54 45 5f 55  igned", SQLITE_U
13ee0 54 46 31 36 5f 41 4c 49 47 4e 45 44 2c 20 0a 20  TF16_ALIGNED, . 
13ef0 20 20 20 20 20 20 20 30 2c 20 61 6c 69 67 6e 6d         0, alignm
13f00 65 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b 0a 20 20  entCollFunc);.  
13f10 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
13f20 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  E_OK;.}.#endif /
13f30 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
13f40 45 5f 4f 4d 49 54 5f 55 54 46 31 36 29 20 2a 2f  E_OMIT_UTF16) */
13f50 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61  ../*.** Usage: a
13f60 64 64 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  dd_test_function
13f70 20 3c 64 62 20 70 74 72 3e 20 3c 75 74 66 38 3e   <db ptr> <utf8>
13f80 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31   <utf16le> <utf1
13f90 36 62 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  6be>.**.** This 
13fa0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
13fb0 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
13fc0 4c 69 74 65 20 73 65 6c 65 63 74 73 20 74 68 65  Lite selects the
13fd0 20 63 6f 72 72 65 63 74 20 75 73 65 72 0a 2a 2a   correct user.**
13fe0 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 62 61   function callba
13ff0 63 6b 20 77 68 65 6e 20 6d 75 6c 74 69 70 6c 65  ck when multiple
14000 20 76 65 72 73 69 6f 6e 73 20 28 66 6f 72 20 64   versions (for d
14010 69 66 66 65 72 65 6e 74 20 74 65 78 74 20 65 6e  ifferent text en
14020 63 6f 64 69 6e 67 73 29 0a 2a 2a 20 61 72 65 20  codings).** are 
14030 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  available..**.**
14040 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   Calling this ro
14050 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 20  utine registers 
14060 75 70 20 74 6f 20 74 68 72 65 65 20 76 65 72 73  up to three vers
14070 69 6f 6e 73 20 6f 66 20 74 68 65 20 75 73 65 72  ions of the user
14080 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 22 74 65   function.** "te
14090 73 74 5f 66 75 6e 63 74 69 6f 6e 22 20 77 69 74  st_function" wit
140a0 68 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  h database handl
140b0 65 20 3c 64 62 3e 2e 20 20 49 66 20 74 68 65 20  e <db>.  If the 
140c0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
140d0 69 73 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 6e  is.** true, then
140e0 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 65   a version of te
140f0 73 74 5f 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  st_function is r
14100 65 67 69 73 74 65 72 65 64 20 66 6f 72 20 55 54  egistered for UT
14110 46 2d 38 2c 20 69 66 20 74 68 65 0a 2a 2a 20 74  F-8, if the.** t
14120 68 69 72 64 20 69 73 20 74 72 75 65 2c 20 61 20  hird is true, a 
14130 76 65 72 73 69 6f 6e 20 69 73 20 72 65 67 69 73  version is regis
14140 74 65 72 65 64 20 66 6f 72 20 55 54 46 2d 31 36  tered for UTF-16
14150 6c 65 2c 20 69 66 20 74 68 65 20 66 6f 75 72 74  le, if the fourt
14160 68 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 61 20  h is.** true, a 
14170 55 54 46 2d 31 36 62 65 20 76 65 72 73 69 6f 6e  UTF-16be version
14180 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20   is available.  
14190 50 72 65 76 69 6f 75 73 20 76 65 72 73 69 6f 6e  Previous version
141a0 73 20 6f 66 0a 2a 2a 20 74 65 73 74 5f 66 75 6e  s of.** test_fun
141b0 63 74 69 6f 6e 20 61 72 65 20 64 65 6c 65 74 65  ction are delete
141c0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 75 73 65  d..**.** The use
141d0 72 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d  r function is im
141e0 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 61 6c  plemented by cal
141f0 6c 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ling the followi
14200 6e 67 20 54 43 4c 20 73 63 72 69 70 74 3a 0a 2a  ng TCL script:.*
14210 2a 0a 2a 2a 20 20 20 22 74 65 73 74 5f 66 75 6e  *.**   "test_fun
14220 63 74 69 6f 6e 20 3c 65 6e 63 3e 20 3c 61 72 67  ction <enc> <arg
14230 3e 22 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65 20 3c  >".**.** Where <
14240 65 6e 63 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55  enc> is one of U
14250 54 46 2d 38 2c 20 55 54 46 2d 31 36 4c 45 20 6f  TF-8, UTF-16LE o
14260 72 20 55 54 46 31 36 42 45 2c 20 61 6e 64 20 3c  r UTF16BE, and <
14270 61 72 67 3e 20 69 73 20 74 68 65 0a 2a 2a 20 73  arg> is the.** s
14280 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 70  ingle argument p
14290 61 73 73 65 64 20 74 6f 20 74 68 65 20 53 51 4c  assed to the SQL
142a0 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 76   function. The v
142b0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
142c0 0a 2a 2a 20 74 68 65 20 54 43 4c 20 73 63 72 69  .** the TCL scri
142d0 70 74 20 69 73 20 75 73 65 64 20 61 73 20 74 68  pt is used as th
142e0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
142f0 66 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74 69  f the SQL functi
14300 6f 6e 2e 20 49 74 0a 2a 2a 20 69 73 20 70 61 73  on. It.** is pas
14310 73 65 64 20 74 6f 20 53 51 4c 69 74 65 20 75 73  sed to SQLite us
14320 69 6e 67 20 55 54 46 2d 31 36 42 45 20 66 6f 72  ing UTF-16BE for
14330 20 61 20 55 54 46 2d 38 20 74 65 73 74 5f 66 75   a UTF-8 test_fu
14340 6e 63 74 69 6f 6e 28 29 2c 20 55 54 46 2d 38 0a  nction(), UTF-8.
14350 2a 2a 20 66 6f 72 20 61 20 55 54 46 2d 31 36 4c  ** for a UTF-16L
14360 45 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 28  E test_function(
14370 29 2c 20 61 6e 64 20 55 54 46 2d 31 36 4c 45 20  ), and UTF-16LE 
14380 66 6f 72 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74  for an implement
14390 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 70 72  ation that.** pr
143a0 65 66 65 72 73 20 55 54 46 2d 31 36 42 45 2e 0a  efers UTF-16BE..
143b0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
143c0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 73 74 61  E_OMIT_UTF16.sta
143d0 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 66 75  tic void test_fu
143e0 6e 63 74 69 6f 6e 5f 75 74 66 38 28 0a 20 20 73  nction_utf8(.  s
143f0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
14400 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72  pCtx, .  int nAr
14410 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  g,.  sqlite3_val
14420 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54  ue **argv.){.  T
14430 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
14440 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58  p;.  Tcl_Obj *pX
14450 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ;.  sqlite3_valu
14460 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72  e *pVal;.  inter
14470 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70 20  p = (Tcl_Interp 
14480 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  *)sqlite3_user_d
14490 61 74 61 28 70 43 74 78 29 3b 0a 20 20 70 58 20  ata(pCtx);.  pX 
144a0 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
144b0 62 6a 28 22 74 65 73 74 5f 66 75 6e 63 74 69 6f  bj("test_functio
144c0 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49  n", -1);.  Tcl_I
144d0 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b  ncrRefCount(pX);
144e0 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
144f0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
14500 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53  rp, pX, Tcl_NewS
14510 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 38 22  tringObj("UTF-8"
14520 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
14530 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
14540 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 0a  nt(interp, pX, .
14550 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72        Tcl_NewStr
14560 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71  ingObj((char*)sq
14570 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
14580 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b  (argv[0]), -1));
14590 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  .  Tcl_EvalObjEx
145a0 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 30 29 3b  (interp, pX, 0);
145b0 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
145c0 75 6e 74 28 70 58 29 3b 0a 20 20 73 71 6c 69 74  unt(pX);.  sqlit
145d0 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70  e3_result_text(p
145e0 43 74 78 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  Ctx, Tcl_GetStri
145f0 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  ngResult(interp)
14600 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41  , -1, SQLITE_TRA
14610 4e 53 49 45 4e 54 29 3b 0a 20 20 70 56 61 6c 20  NSIENT);.  pVal 
14620 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
14630 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  w(0);.  sqlite3V
14640 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c  alueSetStr(pVal,
14650 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72 69   -1, Tcl_GetStri
14660 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  ngResult(interp)
14670 2c 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f  , .      SQLITE_
14680 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41  UTF8, SQLITE_STA
14690 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  TIC);.  sqlite3_
146a0 72 65 73 75 6c 74 5f 74 65 78 74 31 36 62 65 28  result_text16be(
146b0 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61  pCtx, sqlite3_va
146c0 6c 75 65 5f 74 65 78 74 31 36 62 65 28 70 56 61  lue_text16be(pVa
146d0 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53 51  l),.      -1, SQ
146e0 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
146f0 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
14700 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 73 74 61  ree(pVal);.}.sta
14710 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 66 75  tic void test_fu
14720 6e 63 74 69 6f 6e 5f 75 74 66 31 36 6c 65 28 0a  nction_utf16le(.
14730 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
14740 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20  t *pCtx, .  int 
14750 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nArg,.  sqlite3_
14760 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
14770 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
14780 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  terp;.  Tcl_Obj 
14790 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  *pX;.  sqlite3_v
147a0 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e  alue *pVal;.  in
147b0 74 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65  terp = (Tcl_Inte
147c0 72 70 20 2a 29 73 71 6c 69 74 65 33 5f 75 73 65  rp *)sqlite3_use
147d0 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20  r_data(pCtx);.  
147e0 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  pX = Tcl_NewStri
147f0 6e 67 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e 63  ngObj("test_func
14800 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63  tion", -1);.  Tc
14810 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
14820 58 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  X);.  Tcl_ListOb
14830 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
14840 6e 74 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e  nterp, pX, Tcl_N
14850 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46  ewStringObj("UTF
14860 2d 31 36 4c 45 22 2c 20 2d 31 29 29 3b 0a 20 20  -16LE", -1));.  
14870 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
14880 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
14890 20 70 58 2c 20 0a 20 20 20 20 20 20 54 63 6c 5f   pX, .      Tcl_
148a0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68  NewStringObj((ch
148b0 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
148c0 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 2c  e_text(argv[0]),
148d0 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61   -1));.  Tcl_Eva
148e0 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70  lObjEx(interp, p
148f0 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63  X, 0);.  Tcl_Dec
14900 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20  rRefCount(pX);. 
14910 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56   pVal = sqlite3V
14920 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73 71  alueNew(0);.  sq
14930 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
14940 28 70 56 61 6c 2c 20 2d 31 2c 20 54 63 6c 5f 47  (pVal, -1, Tcl_G
14950 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69  etStringResult(i
14960 6e 74 65 72 70 29 2c 20 0a 20 20 20 20 20 20 53  nterp), .      S
14970 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
14980 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71  TE_STATIC);.  sq
14990 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
149a0 74 28 70 43 74 78 2c 28 63 68 61 72 2a 29 73 71  t(pCtx,(char*)sq
149b0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
149c0 28 70 56 61 6c 29 2c 2d 31 2c 53 51 4c 49 54 45  (pVal),-1,SQLITE
149d0 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73  _TRANSIENT);.  s
149e0 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
149f0 70 56 61 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20  pVal);.}.static 
14a00 76 6f 69 64 20 74 65 73 74 5f 66 75 6e 63 74 69  void test_functi
14a10 6f 6e 5f 75 74 66 31 36 62 65 28 0a 20 20 73 71  on_utf16be(.  sq
14a20 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
14a30 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67  Ctx, .  int nArg
14a40 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
14a50 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54 63  e **argv.){.  Tc
14a60 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
14a70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b  ;.  Tcl_Obj *pX;
14a80 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
14a90 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72 70   *pVal;.  interp
14aa0 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a   = (Tcl_Interp *
14ab0 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61  )sqlite3_user_da
14ac0 74 61 28 70 43 74 78 29 3b 0a 20 20 70 58 20 3d  ta(pCtx);.  pX =
14ad0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
14ae0 6a 28 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  j("test_function
14af0 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e  ", -1);.  Tcl_In
14b00 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a  crRefCount(pX);.
14b10 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
14b20 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
14b30 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53 74  p, pX, Tcl_NewSt
14b40 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 42  ringObj("UTF-16B
14b50 45 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  E", -1));.  Tcl_
14b60 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
14b70 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c  ment(interp, pX,
14b80 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53   .      Tcl_NewS
14b90 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29  tringObj((char*)
14ba0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
14bb0 78 74 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29  xt(argv[0]), -1)
14bc0 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  );.  Tcl_EvalObj
14bd0 45 78 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 30  Ex(interp, pX, 0
14be0 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  );.  Tcl_DecrRef
14bf0 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 70 56 61  Count(pX);.  pVa
14c00 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  l = sqlite3Value
14c10 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65  New(0);.  sqlite
14c20 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61  3ValueSetStr(pVa
14c30 6c 2c 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74  l, -1, Tcl_GetSt
14c40 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72  ringResult(inter
14c50 70 29 2c 20 0a 20 20 20 20 20 20 53 51 4c 49 54  p), .      SQLIT
14c60 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53  E_UTF8, SQLITE_S
14c70 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65  TATIC);.  sqlite
14c80 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36 28  3_result_text16(
14c90 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61  pCtx, sqlite3_va
14ca0 6c 75 65 5f 74 65 78 74 31 36 6c 65 28 70 56 61  lue_text16le(pVa
14cb0 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53 51  l),.      -1, SQ
14cc0 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
14cd0 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
14ce0 74 5f 74 65 78 74 31 36 62 65 28 70 43 74 78 2c  t_text16be(pCtx,
14cf0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
14d00 65 78 74 31 36 6c 65 28 70 56 61 6c 29 2c 0a 20  ext16le(pVal),. 
14d10 20 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f       -1, SQLITE_
14d20 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71  TRANSIENT);.  sq
14d30 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
14d40 74 31 36 6c 65 28 70 43 74 78 2c 20 73 71 6c 69  t16le(pCtx, sqli
14d50 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36  te3_value_text16
14d60 6c 65 28 70 56 61 6c 29 2c 0a 20 20 20 20 20 20  le(pVal),.      
14d70 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
14d80 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  IENT);.  sqlite3
14d90 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
14da0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
14db0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
14dc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
14dd0 74 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 76 6f  t_function(.  vo
14de0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
14df0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
14e00 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
14e10 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
14e20 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69  NST objv[].){.#i
14e30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14e40 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65  T_UTF16.  sqlite
14e50 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 76 61 6c  3 *db;.  int val
14e60 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35  ;..  if( objc!=5
14e70 20 29 20 67 6f 74 6f 20 62 61 64 5f 61 72 67 73   ) goto bad_args
14e80 3b 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  ;.  if( getDbPoi
14e90 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
14ea0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
14eb0 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
14ec0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
14ed0 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c   if( TCL_OK!=Tcl
14ee0 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
14ef0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
14f00 32 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75  2], &val) ) retu
14f10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
14f20 69 66 28 20 76 61 6c 20 29 7b 0a 20 20 20 20 73  if( val ){.    s
14f30 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
14f40 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74  nction(db, "test
14f50 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 31 2c 20 53  _function", 1, S
14f60 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20  QLITE_UTF8, .   
14f70 20 20 20 20 20 69 6e 74 65 72 70 2c 20 74 65 73       interp, tes
14f80 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 38 2c  t_function_utf8,
14f90 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66   0, 0);.  }.  if
14fa0 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65  ( TCL_OK!=Tcl_Ge
14fb0 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
14fc0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
14fd0 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20   &val) ) return 
14fe0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
14ff0 20 76 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69   val ){.    sqli
15000 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
15010 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 66 75  ion(db, "test_fu
15020 6e 63 74 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49  nction", 1, SQLI
15030 54 45 5f 55 54 46 31 36 4c 45 2c 20 0a 20 20 20  TE_UTF16LE, .   
15040 20 20 20 20 20 69 6e 74 65 72 70 2c 20 74 65 73       interp, tes
15050 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36  t_function_utf16
15060 6c 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  le, 0, 0);.  }. 
15070 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c   if( TCL_OK!=Tcl
15080 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
15090 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
150a0 34 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75  4], &val) ) retu
150b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
150c0 69 66 28 20 76 61 6c 20 29 7b 0a 20 20 20 20 73  if( val ){.    s
150d0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
150e0 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74  nction(db, "test
150f0 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 31 2c 20 53  _function", 1, S
15100 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20 0a  QLITE_UTF16BE, .
15110 20 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20          interp, 
15120 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74  test_function_ut
15130 66 31 36 62 65 2c 20 30 2c 20 30 29 3b 0a 20 20  f16be, 0, 0);.  
15140 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
15150 4f 4b 3b 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20  OK;.bad_args:.  
15160 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
15170 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
15180 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
15190 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 54 63 6c  e \"",.      Tcl
151a0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
151b0 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
151c0 20 3c 44 42 3e 20 3c 75 74 66 38 3e 20 3c 75 74   <DB> <utf8> <ut
151d0 66 31 36 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e  f16le> <utf16be>
151e0 22 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  ", 0);.#endif /*
151f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
15200 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54  16 */.  return T
15210 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a  CL_ERROR;.}../*.
15220 2a 2a 20 55 73 61 67 65 3a 20 20 20 20 20 20 20  ** Usage:       
15230 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 65    sqlite3_test_e
15240 72 72 73 74 72 20 3c 65 72 72 20 63 6f 64 65 3e  rrstr <err code>
15250 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 61 74  .**.** Test that
15260 20 74 68 65 20 65 6e 67 6c 69 73 68 20 6c 61 6e   the english lan
15270 67 75 61 67 65 20 73 74 72 69 6e 67 20 65 71 75  guage string equ
15280 69 76 61 6c 65 6e 74 73 20 66 6f 72 20 73 71 6c  ivalents for sql
15290 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 73 0a  ite error codes.
152a0 2a 2a 20 61 72 65 20 73 61 6e 65 2e 20 54 68 65  ** are sane. The
152b0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 6e   parameter is an
152c0 20 69 6e 74 65 67 65 72 20 72 65 70 72 65 73 65   integer represe
152d0 6e 74 69 6e 67 20 61 6e 20 73 71 6c 69 74 65 20  nting an sqlite 
152e0 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 54  error code..** T
152f0 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 6c  he result is a l
15300 69 73 74 20 6f 66 20 74 77 6f 20 65 6c 65 6d 65  ist of two eleme
15310 6e 74 73 2c 20 74 68 65 20 73 74 72 69 6e 67 20  nts, the string 
15320 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
15330 66 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 20 63  f the.** error c
15340 6f 64 65 20 61 6e 64 20 74 68 65 20 65 6e 67 6c  ode and the engl
15350 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70  ish language exp
15360 6c 61 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  lanation..*/.sta
15370 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72 72  tic int test_err
15380 73 74 72 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  str(.  void * cl
15390 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
153a0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
153b0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
153c0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
153d0 76 5b 5d 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a  v[].){.  char *z
153e0 43 6f 64 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Code;.  int i;. 
153f0 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a   if( objc!=1 ){.
15400 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
15410 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
15420 6f 62 6a 76 2c 20 22 3c 65 72 72 6f 72 20 63 6f  objv, "<error co
15430 64 65 3e 22 29 3b 0a 20 20 7d 0a 0a 20 20 7a 43  de>");.  }..  zC
15440 6f 64 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ode = Tcl_GetStr
15450 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20  ing(objv[1]);.  
15460 66 6f 72 28 69 3d 30 3b 20 69 3c 32 30 30 3b 20  for(i=0; i<200; 
15470 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 30 3d  i++){.    if( 0=
15480 3d 73 74 72 63 6d 70 28 74 31 45 72 72 6f 72 4e  =strcmp(t1ErrorN
15490 61 6d 65 28 69 29 2c 20 7a 43 6f 64 65 29 20 29  ame(i), zCode) )
154a0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 54 63   break;.  }.  Tc
154b0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
154c0 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69  rp, (char *)sqli
154d0 74 65 33 45 72 72 53 74 72 28 69 29 2c 20 30 29  te3ErrStr(i), 0)
154e0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
154f0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
15500 65 3a 20 20 20 20 62 72 65 61 6b 70 6f 69 6e 74  e:    breakpoint
15510 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
15520 69 6e 65 20 65 78 69 73 74 73 20 66 6f 72 20 6f  ine exists for o
15530 6e 65 20 70 75 72 70 6f 73 65 20 2d 20 74 6f 20  ne purpose - to 
15540 70 72 6f 76 69 64 65 20 61 20 70 6c 61 63 65 20  provide a place 
15550 74 6f 20 70 75 74 20 61 0a 2a 2a 20 62 72 65 61  to put a.** brea
15560 6b 70 6f 69 6e 74 20 77 69 74 68 20 47 44 42 20  kpoint with GDB 
15570 74 68 61 74 20 63 61 6e 20 62 65 20 74 72 69 67  that can be trig
15580 67 65 72 65 64 20 75 73 69 6e 67 20 54 43 4c 20  gered using TCL 
15590 63 6f 64 65 2e 20 20 54 68 65 20 75 73 65 0a 2a  code.  The use.*
155a0 2a 20 66 6f 72 20 74 68 69 73 20 69 73 20 77 68  * for this is wh
155b0 65 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  en a particular 
155c0 74 65 73 74 20 66 61 69 6c 73 20 6f 6e 20 28 73  test fails on (s
155d0 61 79 29 20 74 68 65 20 31 34 38 35 74 68 20 69  ay) the 1485th i
155e0 74 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 20  teration..** In 
155f0 74 68 65 20 54 43 4c 20 74 65 73 74 20 73 63 72  the TCL test scr
15600 69 70 74 2c 20 77 65 20 63 61 6e 20 61 64 64 20  ipt, we can add 
15610 63 6f 64 65 20 6c 69 6b 65 20 74 68 69 73 3a 0a  code like this:.
15620 2a 2a 0a 2a 2a 20 20 20 20 20 69 66 20 7b 24 69  **.**     if {$i
15630 3d 3d 31 34 38 35 7d 20 62 72 65 61 6b 70 6f 69  ==1485} breakpoi
15640 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 72 75  nt.**.** Then ru
15650 6e 20 74 65 73 74 66 69 78 74 75 72 65 20 69 6e  n testfixture in
15660 20 74 68 65 20 64 65 62 75 67 67 65 72 20 61 6e   the debugger an
15670 64 20 77 61 69 74 20 66 6f 72 20 74 68 65 20 62  d wait for the b
15680 72 65 61 6b 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20  reakpoint to.** 
15690 66 69 72 65 2e 20 20 54 68 65 6e 20 61 64 64 69  fire.  Then addi
156a0 74 69 6f 6e 61 6c 20 62 72 65 61 6b 70 6f 69 6e  tional breakpoin
156b0 74 73 20 63 61 6e 20 62 65 20 73 65 74 20 74 6f  ts can be set to
156c0 20 74 72 61 63 65 20 64 6f 77 6e 20 74 68 65 20   trace down the 
156d0 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  bug..*/.static i
156e0 6e 74 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69  nt test_breakpoi
156f0 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  nt(.  void *NotU
15700 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
15710 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
15720 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
15730 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
15740 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
15750 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
15760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
15770 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
15780 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
15790 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
157a0 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
157b0 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 72  gument */.){.  r
157c0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 20  eturn TCL_OK;   
157d0 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68        /* Do noth
157e0 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ing */.}../*.** 
157f0 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
15800 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 20 20  _bind_zeroblob  
15810 53 54 4d 54 20 49 44 58 20 4e 0a 2a 2a 0a 2a 2a  STMT IDX N.**.**
15820 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65   Test the sqlite
15830 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 20  3_bind_zeroblob 
15840 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54  interface.  STMT
15850 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73   is a prepared s
15860 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 49 44 58  tatement..** IDX
15870 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
15880 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74   a wildcard in t
15890 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
158a0 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d  ement.  This com
158b0 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20  mand.** binds a 
158c0 4e 2d 62 79 74 65 20 7a 65 72 6f 2d 66 69 6c 6c  N-byte zero-fill
158d0 65 64 20 42 4c 4f 42 20 74 6f 20 74 68 65 20 77  ed BLOB to the w
158e0 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74  ildcard..*/.stat
158f0 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
15900 5f 7a 65 72 6f 62 6c 6f 62 28 0a 20 20 76 6f 69  _zeroblob(.  voi
15910 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
15920 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
15930 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
15940 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
15950 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
15960 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
15970 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  mt;.  int idx;. 
15980 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 72 63   int n;.  int rc
15990 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  ;..  if( objc!=4
159a0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
159b0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
159c0 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20   1, objv, "STMT 
159d0 49 44 58 20 4e 22 29 3b 0a 20 20 20 20 72 65 74  IDX N");.    ret
159e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
159f0 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
15a00 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
15a10 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
15a20 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
15a30 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
15a40 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
15a50 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
15a60 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69  erp, objv[2], &i
15a70 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  dx) ) return TCL
15a80 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
15a90 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
15aa0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
15ab0 20 26 6e 29 20 29 20 72 65 74 75 72 6e 20 54 43   &n) ) return TC
15ac0 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
15ad0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65   sqlite3_bind_ze
15ae0 72 6f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 64  roblob(pStmt, id
15af0 78 2c 20 6e 29 3b 0a 20 20 69 66 28 20 73 71 6c  x, n);.  if( sql
15b00 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
15b10 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62  interp, StmtToDb
15b20 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72  (pStmt), rc) ) r
15b30 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
15b40 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
15b50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
15b60 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15b70 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
15b80 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
15b90 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ge:   sqlite3_bi
15ba0 6e 64 5f 69 6e 74 20 20 53 54 4d 54 20 4e 20 56  nd_int  STMT N V
15bb0 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  ALUE.**.** Test 
15bc0 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
15bd0 5f 69 6e 74 20 69 6e 74 65 72 66 61 63 65 2e 20  _int interface. 
15be0 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61   STMT is a prepa
15bf0 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  red statement..*
15c00 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78  * N is the index
15c10 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69   of a wildcard i
15c20 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
15c30 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20  tatement.  This 
15c40 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73  command.** binds
15c50 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
15c60 72 20 56 41 4c 55 45 20 74 6f 20 74 68 61 74 20  r VALUE to that 
15c70 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61  wildcard..*/.sta
15c80 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
15c90 64 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20  d_int(.  void * 
15ca0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
15cb0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
15cc0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
15cd0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
15ce0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
15cf0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
15d00 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74    int idx;.  int
15d10 20 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63   value;.  int rc
15d20 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  ;..  if( objc!=4
15d30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
15d40 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
15d50 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
15d60 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
15d70 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
15d80 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
15d90 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20  [0], 0), " STMT 
15da0 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20  N VALUE", 0);.  
15db0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
15dc0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
15dd0 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
15de0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
15df0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
15e00 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
15e10 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
15e20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
15e30 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
15e40 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72  ], &idx) ) retur
15e50 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
15e60 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
15e70 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
15e80 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20 29 20  v[3], &value) ) 
15e90 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15ea0 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
15eb0 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74  3_bind_int(pStmt
15ec0 2c 20 69 64 78 2c 20 76 61 6c 75 65 29 3b 0a 20  , idx, value);. 
15ed0 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
15ee0 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
15ef0 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c  StmtToDb(pStmt),
15f00 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
15f10 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
15f20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15f30 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
15f40 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  RROR;.  }..  ret
15f50 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
15f60 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
15f70 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
15f80 34 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a  4  STMT N VALUE.
15f90 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73  **.** Test the s
15fa0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
15fb0 34 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54  4 interface.  ST
15fc0 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64  MT is a prepared
15fd0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e   statement..** N
15fe0 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
15ff0 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74   a wildcard in t
16000 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
16010 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d  ement.  This com
16020 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20  mand.** binds a 
16030 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 56  64-bit integer V
16040 41 4c 55 45 20 74 6f 20 74 68 61 74 20 77 69 6c  ALUE to that wil
16050 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  dcard..*/.static
16060 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 69   int test_bind_i
16070 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 20 63  nt64(.  void * c
16080 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
16090 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
160a0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
160b0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
160c0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
160d0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
160e0 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 36 34 20   int idx;.  i64 
160f0 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b  value;.  int rc;
16100 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20  ..  if( objc!=4 
16110 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
16120 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
16130 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
16140 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
16150 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
16160 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
16170 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e  0], 0), " STMT N
16180 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20   VALUE", 0);.   
16190 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
161a0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
161b0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
161c0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
161d0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
161e0 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
161f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
16200 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
16210 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
16220 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e  , &idx) ) return
16230 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
16240 28 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74  ( Tcl_GetWideInt
16250 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
16260 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29  objv[3], &value)
16270 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
16280 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
16290 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
162a0 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75  pStmt, idx, valu
162b0 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  e);.  if( sqlite
162c0 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
162d0 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53  erp, StmtToDb(pS
162e0 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75  tmt), rc) ) retu
162f0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16300 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16310 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
16320 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
16330 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
16340 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  .}.../*.** Usage
16350 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
16360 5f 64 6f 75 62 6c 65 20 20 53 54 4d 54 20 4e 20  _double  STMT N 
16370 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74  VALUE.**.** Test
16380 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e   the sqlite3_bin
16390 64 5f 64 6f 75 62 6c 65 20 69 6e 74 65 72 66 61  d_double interfa
163a0 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70  ce.  STMT is a p
163b0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
163c0 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69  t..** N is the i
163d0 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61  ndex of a wildca
163e0 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72  rd in the prepar
163f0 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ed statement.  T
16400 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62  his command.** b
16410 69 6e 64 73 20 61 20 36 34 2d 62 69 74 20 69 6e  inds a 64-bit in
16420 74 65 67 65 72 20 56 41 4c 55 45 20 74 6f 20 74  teger VALUE to t
16430 68 61 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f  hat wildcard..*/
16440 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
16450 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 0a 20 20  _bind_double(.  
16460 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
16470 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
16480 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
16490 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
164a0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
164b0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
164c0 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78  pStmt;.  int idx
164d0 3b 0a 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65  ;.  double value
164e0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f  ;.  int rc;.  co
164f0 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 3b 0a  nst char *zVal;.
16500 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 61 74 69    int i;.  stati
16510 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b  c const struct {
16520 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
16530 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e  *zName;     /* N
16540 61 6d 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  ame of the speci
16550 61 6c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  al floating poin
16560 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 75  t value */.    u
16570 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 55 70 70  nsigned int iUpp
16580 65 72 3b 20 20 20 2f 2a 20 55 70 70 65 72 20 33  er;   /* Upper 3
16590 32 20 62 69 74 73 20 2a 2f 0a 20 20 20 20 75 6e  2 bits */.    un
165a0 73 69 67 6e 65 64 20 69 6e 74 20 69 4c 6f 77 65  signed int iLowe
165b0 72 3b 20 20 20 2f 2a 20 4c 6f 77 65 72 20 33 32  r;   /* Lower 32
165c0 20 62 69 74 73 20 2a 2f 0a 20 20 7d 20 61 53 70   bits */.  } aSp
165d0 65 63 69 61 6c 46 70 5b 5d 20 3d 20 7b 0a 20 20  ecialFp[] = {.  
165e0 20 20 7b 20 20 22 4e 61 4e 22 2c 20 20 20 20 20    {  "NaN",     
165f0 20 30 78 37 66 66 66 66 66 66 66 2c 20 30 78 66   0x7fffffff, 0xf
16600 66 66 66 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b  fffffff },.    {
16610 20 20 22 53 4e 61 4e 22 2c 20 20 20 20 20 30 78    "SNaN",     0x
16620 37 66 66 37 66 66 66 66 2c 20 30 78 66 66 66 66  7ff7ffff, 0xffff
16630 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22  ffff },.    {  "
16640 2d 4e 61 4e 22 2c 20 20 20 20 20 30 78 66 66 66  -NaN",     0xfff
16650 66 66 66 66 66 2c 20 30 78 66 66 66 66 66 66 66  fffff, 0xfffffff
16660 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 53 4e  f },.    {  "-SN
16670 61 4e 22 2c 20 20 20 20 30 78 66 66 66 37 66 66  aN",    0xfff7ff
16680 66 66 2c 20 30 78 66 66 66 66 66 66 66 66 20 7d  ff, 0xffffffff }
16690 2c 0a 20 20 20 20 7b 20 20 22 2b 49 6e 66 22 2c  ,.    {  "+Inf",
166a0 20 20 20 20 20 30 78 37 66 66 30 30 30 30 30 2c       0x7ff00000,
166b0 20 30 78 30 30 30 30 30 30 30 30 20 7d 2c 0a 20   0x00000000 },. 
166c0 20 20 20 7b 20 20 22 2d 49 6e 66 22 2c 20 20 20     {  "-Inf",   
166d0 20 20 30 78 66 66 66 30 30 30 30 30 2c 20 30 78    0xfff00000, 0x
166e0 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20  00000000 },.    
166f0 7b 20 20 22 45 70 73 69 6c 6f 6e 22 2c 20 20 30  {  "Epsilon",  0
16700 78 30 30 30 30 30 30 30 30 2c 20 30 78 30 30 30  x00000000, 0x000
16710 30 30 30 30 31 20 7d 2c 0a 20 20 20 20 7b 20 20  00001 },.    {  
16720 22 2d 45 70 73 69 6c 6f 6e 22 2c 20 30 78 38 30  "-Epsilon", 0x80
16730 30 30 30 30 30 30 2c 20 30 78 30 30 30 30 30 30  000000, 0x000000
16740 30 31 20 7d 2c 0a 20 20 20 20 7b 20 20 22 4e 61  01 },.    {  "Na
16750 4e 30 22 2c 20 20 20 20 20 30 78 37 66 66 38 30  N0",     0x7ff80
16760 30 30 30 2c 20 30 78 30 30 30 30 30 30 30 30 20  000, 0x00000000 
16770 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 4e 61 4e 30  },.    {  "-NaN0
16780 22 2c 20 20 20 20 30 78 66 66 66 38 30 30 30 30  ",    0xfff80000
16790 2c 20 30 78 30 30 30 30 30 30 30 30 20 7d 2c 0a  , 0x00000000 },.
167a0 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63    };..  if( objc
167b0 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
167c0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
167d0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
167e0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
167f0 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
16800 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
16810 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54  bjv[0], 0), " ST
16820 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b  MT N VALUE", 0);
16830 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
16840 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
16850 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
16860 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
16870 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
16880 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
16890 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
168a0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
168b0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
168c0 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65  v[2], &idx) ) re
168d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
168e0 0a 20 20 2f 2a 20 49 6e 74 65 72 63 65 70 74 20  .  /* Intercept 
168f0 74 68 65 20 73 74 72 69 6e 67 20 22 4e 61 4e 22  the string "NaN"
16900 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 61 20   and generate a 
16910 4e 61 4e 20 76 61 6c 75 65 20 66 6f 72 20 69 74  NaN value for it
16920 2e 0a 20 20 2a 2a 20 41 6c 6c 20 6f 74 68 65 72  ..  ** All other
16930 20 73 74 72 69 6e 67 73 20 61 72 65 20 70 61 73   strings are pas
16940 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 54  sed through to T
16950 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d  cl_GetDoubleFrom
16960 4f 62 6a 28 29 2e 0a 20 20 2a 2a 20 54 63 6c 5f  Obj()..  ** Tcl_
16970 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a  GetDoubleFromObj
16980 28 29 20 73 68 6f 75 6c 64 20 75 6e 64 65 72 73  () should unders
16990 74 61 6e 64 20 22 4e 61 4e 22 20 62 75 74 20 73  tand "NaN" but s
169a0 6f 6d 65 20 76 65 72 73 69 6f 6e 73 0a 20 20 2a  ome versions.  *
169b0 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62 75 67 2e  * contain a bug.
169c0 0a 20 20 2a 2f 0a 20 20 7a 56 61 6c 20 3d 20 54  .  */.  zVal = T
169d0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
169e0 76 5b 33 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30  v[3]);.  for(i=0
169f0 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 70 65 63  ; i<sizeof(aSpec
16a00 69 61 6c 46 70 29 2f 73 69 7a 65 6f 66 28 61 53  ialFp)/sizeof(aS
16a10 70 65 63 69 61 6c 46 70 5b 30 5d 29 3b 20 69 2b  pecialFp[0]); i+
16a20 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63  +){.    if( strc
16a30 6d 70 28 61 53 70 65 63 69 61 6c 46 70 5b 69 5d  mp(aSpecialFp[i]
16a40 2e 7a 4e 61 6d 65 2c 20 7a 56 61 6c 29 3d 3d 30  .zName, zVal)==0
16a50 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
16a60 33 5f 75 69 6e 74 36 34 20 78 3b 0a 20 20 20 20  3_uint64 x;.    
16a70 20 20 78 20 3d 20 61 53 70 65 63 69 61 6c 46 70    x = aSpecialFp
16a80 5b 69 5d 2e 69 55 70 70 65 72 3b 0a 20 20 20 20  [i].iUpper;.    
16a90 20 20 78 20 3c 3c 3d 20 33 32 3b 0a 20 20 20 20    x <<= 32;.    
16aa0 20 20 78 20 7c 3d 20 61 53 70 65 63 69 61 6c 46    x |= aSpecialF
16ab0 70 5b 69 5d 2e 69 4c 6f 77 65 72 3b 0a 20 20 20  p[i].iLower;.   
16ac0 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
16ad0 66 28 76 61 6c 75 65 29 3d 3d 38 20 29 3b 0a 20  f(value)==8 );. 
16ae0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a       assert( siz
16af0 65 6f 66 28 78 29 3d 3d 38 20 29 3b 0a 20 20 20  eof(x)==8 );.   
16b00 20 20 20 6d 65 6d 63 70 79 28 26 76 61 6c 75 65     memcpy(&value
16b10 2c 20 26 78 2c 20 38 29 3b 0a 20 20 20 20 20 20  , &x, 8);.      
16b20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
16b30 0a 20 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f 66  .  if( i>=sizeof
16b40 28 61 53 70 65 63 69 61 6c 46 70 29 2f 73 69 7a  (aSpecialFp)/siz
16b50 65 6f 66 28 61 53 70 65 63 69 61 6c 46 70 5b 30  eof(aSpecialFp[0
16b60 5d 29 20 26 26 0a 20 20 20 20 20 20 20 20 20 54  ]) &&.         T
16b70 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d  cl_GetDoubleFrom
16b80 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
16b90 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20 29 7b 0a  [3], &value) ){.
16ba0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
16bb0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  RROR;.  }.  rc =
16bc0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f   sqlite3_bind_do
16bd0 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 64 78 2c  uble(pStmt, idx,
16be0 20 76 61 6c 75 65 29 3b 0a 20 20 69 66 28 20 73   value);.  if( s
16bf0 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
16c00 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f  e(interp, StmtTo
16c10 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29  Db(pStmt), rc) )
16c20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16c30 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  R;.  if( rc!=SQL
16c40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
16c50 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
16c60 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43    }..  return TC
16c70 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
16c80 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
16c90 62 69 6e 64 5f 6e 75 6c 6c 20 20 53 54 4d 54 20  bind_null  STMT 
16ca0 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65  N.**.** Test the
16cb0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
16cc0 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53  ll interface.  S
16cd0 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65  TMT is a prepare
16ce0 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  d statement..** 
16cf0 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  N is the index o
16d00 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20  f a wildcard in 
16d10 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
16d20 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  tement.  This co
16d30 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61  mmand.** binds a
16d40 20 4e 55 4c 4c 20 74 6f 20 74 68 65 20 77 69 6c   NULL to the wil
16d50 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  dcard..*/.static
16d60 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 6e   int test_bind_n
16d70 75 6c 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ull(.  void * cl
16d80 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
16d90 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
16da0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
16db0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
16dc0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
16dd0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
16de0 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 72  int idx;.  int r
16df0 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
16e00 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
16e10 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
16e20 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
16e30 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
16e40 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
16e50 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
16e60 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54  v[0], 0), " STMT
16e70 20 4e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74   N", 0);.    ret
16e80 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16e90 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
16ea0 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
16eb0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
16ec0 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
16ed0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
16ee0 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
16ef0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
16f00 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69  erp, objv[2], &i
16f10 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  dx) ) return TCL
16f20 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
16f30 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c  sqlite3_bind_nul
16f40 6c 28 70 53 74 6d 74 2c 20 69 64 78 29 3b 0a 20  l(pStmt, idx);. 
16f50 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
16f60 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
16f70 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c  StmtToDb(pStmt),
16f80 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
16f90 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
16fa0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16fb0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
16fc0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  RROR;.  }..  ret
16fd0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
16fe0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
16ff0 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 20  lite3_bind_text 
17000 20 53 54 4d 54 20 4e 20 53 54 52 49 4e 47 20 42   STMT N STRING B
17010 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  YTES.**.** Test 
17020 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
17030 5f 74 65 78 74 20 69 6e 74 65 72 66 61 63 65 2e  _text interface.
17040 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70    STMT is a prep
17050 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
17060 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65  ** N is the inde
17070 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20  x of a wildcard 
17080 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
17090 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73  statement.  This
170a0 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64   command.** bind
170b0 73 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67  s a UTF-8 string
170c0 20 53 54 52 49 4e 47 20 74 6f 20 74 68 65 20 77   STRING to the w
170d0 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 73 74  ildcard.  The st
170e0 72 69 6e 67 20 69 73 20 42 59 54 45 53 20 62 79  ring is BYTES by
170f0 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a  tes.** long..*/.
17100 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
17110 62 69 6e 64 5f 74 65 78 74 28 0a 20 20 76 6f 69  bind_text(.  voi
17120 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
17130 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
17140 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
17150 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
17160 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
17170 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
17180 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  mt;.  int idx;. 
17190 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 68   int bytes;.  ch
171a0 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74  ar *value;.  int
171b0 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
171c0 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=5 ){.    Tcl_A
171d0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
171e0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
171f0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
17200 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
17210 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
17220 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54  bjv[0], 0), " ST
17230 4d 54 20 4e 20 56 41 4c 55 45 20 42 59 54 45 53  MT N VALUE BYTES
17240 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
17250 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
17260 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
17270 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
17280 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
17290 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
172a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
172b0 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
172c0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
172d0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78  p, objv[2], &idx
172e0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
172f0 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d 20  RROR;.  value = 
17300 28 63 68 61 72 2a 29 54 63 6c 5f 47 65 74 42 79  (char*)Tcl_GetBy
17310 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f  teArrayFromObj(o
17320 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 3b  bjv[3], &bytes);
17330 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
17340 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
17350 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73   objv[4], &bytes
17360 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
17370 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
17380 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
17390 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75  pStmt, idx, valu
173a0 65 2c 20 62 79 74 65 73 2c 20 53 51 4c 49 54 45  e, bytes, SQLITE
173b0 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 69  _TRANSIENT);.  i
173c0 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
173d0 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74  rCode(interp, St
173e0 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72  mtToDb(pStmt), r
173f0 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
17400 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21  ERROR;.  if( rc!
17410 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17420 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
17430 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
17440 65 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65 28  e3TestErrorName(
17450 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  rc), 0);.    ret
17460 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17470 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
17480 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
17490 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
174a0 69 6e 64 5f 74 65 78 74 31 36 20 3f 2d 73 74 61  ind_text16 ?-sta
174b0 74 69 63 3f 20 53 54 4d 54 20 4e 20 53 54 52 49  tic? STMT N STRI
174c0 4e 47 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54  NG BYTES.**.** T
174d0 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f  est the sqlite3_
174e0 62 69 6e 64 5f 74 65 78 74 31 36 20 69 6e 74 65  bind_text16 inte
174f0 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20  rface.  STMT is 
17500 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
17510 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68  ment..** N is th
17520 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c  e index of a wil
17530 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65  dcard in the pre
17540 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
17550 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a    This command.*
17560 2a 20 62 69 6e 64 73 20 61 20 55 54 46 2d 31 36  * binds a UTF-16
17570 20 73 74 72 69 6e 67 20 53 54 52 49 4e 47 20 74   string STRING t
17580 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e 20  o the wildcard. 
17590 20 54 68 65 20 73 74 72 69 6e 67 20 69 73 20 42   The string is B
175a0 59 54 45 53 20 62 79 74 65 73 0a 2a 2a 20 6c 6f  YTES bytes.** lo
175b0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
175c0 74 20 74 65 73 74 5f 62 69 6e 64 5f 74 65 78 74  t test_bind_text
175d0 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  16(.  void * cli
175e0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
175f0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
17600 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
17610 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
17620 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  [].){.#ifndef SQ
17630 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
17640 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
17650 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78  pStmt;.  int idx
17660 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20  ;.  int bytes;. 
17670 20 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20   char *value;.  
17680 69 6e 74 20 72 63 3b 0a 0a 20 20 76 6f 69 64 20  int rc;..  void 
17690 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 3d  (*xDel)(void*) =
176a0 20 28 6f 62 6a 63 3d 3d 36 3f 53 51 4c 49 54 45   (objc==6?SQLITE
176b0 5f 53 54 41 54 49 43 3a 53 51 4c 49 54 45 5f 54  _STATIC:SQLITE_T
176c0 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 54 63 6c  RANSIENT);.  Tcl
176d0 5f 4f 62 6a 20 2a 6f 53 74 6d 74 20 20 20 20 3d  _Obj *oStmt    =
176e0 20 6f 62 6a 76 5b 6f 62 6a 63 2d 34 5d 3b 0a 20   objv[objc-4];. 
176f0 20 54 63 6c 5f 4f 62 6a 20 2a 6f 4e 20 20 20 20   Tcl_Obj *oN    
17700 20 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 33     = objv[objc-3
17710 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 53  ];.  Tcl_Obj *oS
17720 74 72 69 6e 67 20 20 3d 20 6f 62 6a 76 5b 6f 62  tring  = objv[ob
17730 6a 63 2d 32 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a  jc-2];.  Tcl_Obj
17740 20 2a 6f 42 79 74 65 73 20 20 20 3d 20 6f 62 6a   *oBytes   = obj
17750 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 0a 20 20 69 66  v[objc-1];..  if
17760 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a  ( objc!=5 && obj
17770 63 21 3d 36 29 7b 0a 20 20 20 20 54 63 6c 5f 41  c!=6){.    Tcl_A
17780 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
17790 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
177a0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
177b0 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
177c0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
177d0 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54  bjv[0], 0), " ST
177e0 4d 54 20 4e 20 56 41 4c 55 45 20 42 59 54 45 53  MT N VALUE BYTES
177f0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
17800 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
17810 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
17820 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
17830 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 53 74  cl_GetString(oSt
17840 6d 74 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  mt), &pStmt) ) r
17850 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17860 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
17870 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
17880 20 6f 4e 2c 20 26 69 64 78 29 20 29 20 72 65 74   oN, &idx) ) ret
17890 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
178a0 20 76 61 6c 75 65 20 3d 20 28 63 68 61 72 2a 29   value = (char*)
178b0 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
178c0 46 72 6f 6d 4f 62 6a 28 6f 53 74 72 69 6e 67 2c  FromObj(oString,
178d0 20 30 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47   0);.  if( Tcl_G
178e0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
178f0 65 72 70 2c 20 6f 42 79 74 65 73 2c 20 26 62 79  erp, oBytes, &by
17900 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43  tes) ) return TC
17910 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
17920 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
17930 78 74 31 36 28 70 53 74 6d 74 2c 20 69 64 78 2c  xt16(pStmt, idx,
17940 20 28 76 6f 69 64 20 2a 29 76 61 6c 75 65 2c 20   (void *)value, 
17950 62 79 74 65 73 2c 20 78 44 65 6c 29 3b 0a 20 20  bytes, xDel);.  
17960 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
17970 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53  rrCode(interp, S
17980 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20  tmtToDb(pStmt), 
17990 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
179a0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
179b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
179c0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
179d0 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
179e0 74 65 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65  te3TestErrorName
179f0 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (rc), 0);.    re
17a00 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17a10 20 20 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53    }..#endif /* S
17a20 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
17a30 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   */.  return TCL
17a40 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
17a50 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
17a60 69 6e 64 5f 62 6c 6f 62 20 3f 2d 73 74 61 74 69  ind_blob ?-stati
17a70 63 3f 20 53 54 4d 54 20 4e 20 44 41 54 41 20 42  c? STMT N DATA B
17a80 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  YTES.**.** Test 
17a90 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
17aa0 5f 62 6c 6f 62 20 69 6e 74 65 72 66 61 63 65 2e  _blob interface.
17ab0 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70    STMT is a prep
17ac0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
17ad0 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65  ** N is the inde
17ae0 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20  x of a wildcard 
17af0 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
17b00 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73  statement.  This
17b10 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64   command.** bind
17b20 73 20 61 20 42 4c 4f 42 20 74 6f 20 74 68 65 20  s a BLOB to the 
17b30 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 42  wildcard.  The B
17b40 4c 4f 42 20 69 73 20 42 59 54 45 53 20 62 79 74  LOB is BYTES byt
17b50 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73  es in size..*/.s
17b60 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
17b70 69 6e 64 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64  ind_blob(.  void
17b80 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
17b90 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
17ba0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
17bb0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
17bc0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
17bd0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
17be0 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  t;.  int idx;.  
17bf0 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 68 61  int bytes;.  cha
17c00 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20  r *value;.  int 
17c10 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 64 65  rc;.  sqlite3_de
17c20 73 74 72 75 63 74 6f 72 5f 74 79 70 65 20 78 44  structor_type xD
17c30 65 73 74 72 75 63 74 6f 72 20 3d 20 53 51 4c 49  estructor = SQLI
17c40 54 45 5f 54 52 41 4e 53 49 45 4e 54 3b 0a 0a 20  TE_TRANSIENT;.. 
17c50 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20   if( objc!=5 && 
17c60 6f 62 6a 63 21 3d 36 20 29 7b 0a 20 20 20 20 54  objc!=6 ){.    T
17c70 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
17c80 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
17c90 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
17ca0 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
17cb0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
17cc0 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
17cd0 22 20 53 54 4d 54 20 4e 20 44 41 54 41 20 42 59  " STMT N DATA BY
17ce0 54 45 53 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  TES", 0);.    re
17cf0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17d00 20 20 7d 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d    }..  if( objc=
17d10 3d 36 20 29 7b 0a 20 20 20 20 78 44 65 73 74 72  =6 ){.    xDestr
17d20 75 63 74 6f 72 20 3d 20 53 51 4c 49 54 45 5f 53  uctor = SQLITE_S
17d30 54 41 54 49 43 3b 0a 20 20 20 20 6f 62 6a 76 2b  TATIC;.    objv+
17d40 2b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  +;.  }..  if( ge
17d50 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
17d60 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
17d70 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
17d80 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
17d90 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
17da0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
17db0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
17dc0 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e  , &idx) ) return
17dd0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 76 61   TCL_ERROR;.  va
17de0 6c 75 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  lue = Tcl_GetStr
17df0 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20  ing(objv[3]);.  
17e00 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
17e10 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
17e20 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73 29 20 29  jv[4], &bytes) )
17e30 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17e40 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
17e50 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74  e3_bind_blob(pSt
17e60 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 2c 20  mt, idx, value, 
17e70 62 79 74 65 73 2c 20 78 44 65 73 74 72 75 63 74  bytes, xDestruct
17e80 6f 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  or);.  if( sqlit
17e90 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
17ea0 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70  terp, StmtToDb(p
17eb0 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74  Stmt), rc) ) ret
17ec0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17ed0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17ee0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
17ef0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
17f00 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
17f10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
17f20 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
17f30 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74  _parameter_count
17f40 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74    STMT.**.** Ret
17f50 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
17f60 66 20 77 69 6c 64 63 61 72 64 73 20 69 6e 20 74  f wildcards in t
17f70 68 65 20 67 69 76 65 6e 20 73 74 61 74 65 6d 65  he given stateme
17f80 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
17f90 74 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61  t test_bind_para
17fa0 6d 65 74 65 72 5f 63 6f 75 6e 74 28 0a 20 20 76  meter_count(.  v
17fb0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
17fc0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
17fd0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
17fe0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
17ff0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
18000 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
18010 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  Stmt;..  if( obj
18020 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
18030 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
18040 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
18050 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72  TMT");.    retur
18060 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
18070 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
18080 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
18090 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
180a0 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
180b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
180c0 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
180d0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
180e0 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
180f0 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
18100 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 29 29  r_count(pStmt)))
18110 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
18120 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
18130 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  e:   sqlite3_bin
18140 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65  d_parameter_name
18150 20 20 53 54 4d 54 20 20 4e 0a 2a 2a 0a 2a 2a 20    STMT  N.**.** 
18160 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
18170 6f 66 20 74 68 65 20 4e 74 68 20 77 69 6c 64 63  of the Nth wildc
18180 61 72 64 2e 20 20 54 68 65 20 66 69 72 73 74 20  ard.  The first 
18190 77 69 6c 64 63 61 72 64 20 69 73 20 31 2e 0a 2a  wildcard is 1..*
181a0 2a 20 41 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  * An empty strin
181b0 67 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  g is returned if
181c0 20 4e 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e   N is out of ran
181d0 67 65 20 6f 72 20 69 66 20 74 68 65 20 77 69 6c  ge or if the wil
181e0 64 63 61 72 64 0a 2a 2a 20 69 73 20 6e 61 6d 65  dcard.** is name
181f0 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  less..*/.static 
18200 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 70 61  int test_bind_pa
18210 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 0a 20 20  rameter_name(.  
18220 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
18230 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
18240 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
18250 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
18260 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
18270 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
18280 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 3b 0a  pStmt;.  int i;.
18290 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
182a0 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
182b0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
182c0 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20 4e 22  , objv, "STMT N"
182d0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
182e0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
182f0 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
18300 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
18310 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
18320 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
18330 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
18340 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
18350 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
18360 6a 76 5b 32 5d 2c 20 26 69 29 20 29 20 72 65 74  jv[2], &i) ) ret
18370 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
18380 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
18390 74 28 69 6e 74 65 72 70 2c 20 0a 20 20 20 20 20  t(interp, .     
183a0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
183b0 28 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61  (sqlite3_bind_pa
183c0 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70 53 74  rameter_name(pSt
183d0 6d 74 2c 69 29 2c 2d 31 29 0a 20 20 29 3b 0a 20  mt,i),-1).  );. 
183e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
183f0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
18400 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70    sqlite3_bind_p
18410 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 20 20  arameter_index  
18420 53 54 4d 54 20 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a  STMT  NAME.**.**
18430 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
18440 78 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72  x of the wildcar
18450 64 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20  d called NAME.  
18460 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 72  Return 0 if ther
18470 65 20 69 73 0a 2a 2a 20 6e 6f 20 73 75 63 68 20  e is.** no such 
18480 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61  wildcard..*/.sta
18490 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
184a0 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65  d_parameter_inde
184b0 78 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  x(.  void * clie
184c0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
184d0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
184e0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
184f0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
18500 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
18510 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69  tmt *pStmt;..  i
18520 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
18530 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
18540 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
18550 6a 76 2c 20 22 53 54 4d 54 20 4e 41 4d 45 22 29  jv, "STMT NAME")
18560 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
18570 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
18580 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
18590 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
185a0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
185b0 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
185c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
185d0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
185e0 69 6e 74 65 72 70 2c 20 0a 20 20 20 20 20 54 63  interp, .     Tc
185f0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 0a 20 20 20  l_NewIntObj(.   
18600 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
18610 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78  _parameter_index
18620 28 70 53 74 6d 74 2c 54 63 6c 5f 47 65 74 53 74  (pStmt,Tcl_GetSt
18630 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 0a 20  ring(objv[2])). 
18640 20 20 20 20 29 0a 20 20 29 3b 0a 20 20 72 65 74      ).  );.  ret
18650 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
18660 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
18670 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64  lite3_clear_bind
18680 69 6e 67 73 20 53 54 4d 54 0a 2a 2a 0a 2a 2f 0a  ings STMT.**.*/.
18690 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
186a0 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 28 0a  clear_bindings(.
186b0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
186c0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
186d0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
186e0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
186f0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
18700 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
18710 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20   *pStmt;..  if( 
18720 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
18730 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
18740 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
18750 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65   "STMT");.    re
18760 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18770 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d    }.  if( getStm
18780 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
18790 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
187a0 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
187b0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
187c0 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ROR;.  Tcl_SetOb
187d0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
187e0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71  Tcl_NewIntObj(sq
187f0 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64  lite3_clear_bind
18800 69 6e 67 73 28 70 53 74 6d 74 29 29 29 3b 0a 20  ings(pStmt)));. 
18810 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
18820 7d 0a 0a 2f 2a 0a 20 2a 2a 20 55 73 61 67 65 3a  }../*. ** Usage:
18830 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 65 61 72     sqlite3_clear
18840 5f 62 69 6e 64 69 6e 67 73 20 53 54 4d 54 0a 20  _bindings STMT. 
18850 2a 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  **. */.static in
18860 74 20 74 65 73 74 5f 63 6c 65 61 72 5f 62 69 6e  t test_clear_bin
18870 64 69 6e 67 73 5f 6e 75 6c 6c 28 0a 20 20 76 6f  dings_null(.  vo
18880 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
18890 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
188a0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
188b0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
188c0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 20 20 0a  NST objv[].){  .
188d0 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b    if( objc!=1 ){
188e0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
188f0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 2f 2a 20  ERROR;.  }.  /* 
18900 74 65 73 74 20 66 6f 72 20 68 61 6e 64 6c 69 6e  test for handlin
18910 67 20 4e 55 4c 4c 20 3c 72 64 61 72 3a 2f 2f 70  g NULL <rdar://p
18920 72 6f 62 6c 65 6d 2f 36 36 34 36 33 33 31 3e 20  roblem/6646331> 
18930 2a 2f 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  */.  Tcl_SetObjR
18940 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
18950 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69  l_NewIntObj(sqli
18960 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e  te3_clear_bindin
18970 67 73 28 30 29 29 29 3b 0a 20 20 72 65 74 75 72  gs(0)));.  retur
18980 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
18990 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
189a0 74 65 33 5f 73 6c 65 65 70 20 4d 49 4c 4c 49 53  te3_sleep MILLIS
189b0 45 43 4f 4e 44 53 0a 2a 2f 0a 73 74 61 74 69 63  ECONDS.*/.static
189c0 20 69 6e 74 20 74 65 73 74 5f 73 6c 65 65 70 28   int test_sleep(
189d0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
189e0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
189f0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
18a00 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
18a10 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
18a20 29 7b 0a 20 20 69 6e 74 20 6d 73 3b 0a 0a 20 20  ){.  int ms;..  
18a30 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
18a40 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
18a50 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
18a60 62 6a 76 2c 20 22 4d 49 4c 4c 49 53 45 43 4f 4e  bjv, "MILLISECON
18a70 44 53 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  DS");.    return
18a80 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
18a90 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
18aa0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
18ab0 6f 62 6a 76 5b 31 5d 2c 20 26 6d 73 29 20 29 7b  objv[1], &ms) ){
18ac0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
18ad0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c  ERROR;.  }.  Tcl
18ae0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
18af0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
18b00 4f 62 6a 28 73 71 6c 69 74 65 33 5f 73 6c 65 65  Obj(sqlite3_slee
18b10 70 28 6d 73 29 29 29 3b 0a 20 20 72 65 74 75 72  p(ms)));.  retur
18b20 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
18b30 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
18b40 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f  3_extended_errco
18b50 64 65 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75  de DB.**.** Retu
18b60 72 6e 20 74 68 65 20 73 74 72 69 6e 67 20 72 65  rn the string re
18b70 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
18b80 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
18b90 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 0a 2a 2a  sqlite3_* API.**
18ba0 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 65 2e 67   error code. e.g
18bb0 2e 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52 22  . "SQLITE_ERROR"
18bc0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18bd0 74 65 73 74 5f 65 78 5f 65 72 72 63 6f 64 65 28  test_ex_errcode(
18be0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
18bf0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
18c00 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
18c10 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
18c20 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
18c30 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
18c40 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
18c50 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
18c60 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
18c70 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
18c80 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
18c90 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
18ca0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
18cb0 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20  bjv[0]), " DB", 
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 72 63 20 3d  CL_ERROR;.  rc =
18d30 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
18d40 64 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20  d_errcode(db);. 
18d50 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
18d60 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
18d70 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
18d80 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  ), 0);.  return 
18d90 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TCL_OK;.}.../*.*
18da0 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
18db0 5f 65 72 72 63 6f 64 65 20 44 42 0a 2a 2a 0a 2a  _errcode DB.**.*
18dc0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 74 72  * Return the str
18dd0 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69  ing representati
18de0 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  on of the most r
18df0 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20  ecent sqlite3_* 
18e00 41 50 49 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64  API.** error cod
18e10 65 2e 20 65 2e 67 2e 20 22 53 51 4c 49 54 45 5f  e. e.g. "SQLITE_
18e20 45 52 52 4f 52 22 2e 0a 2a 2f 0a 73 74 61 74 69  ERROR"..*/.stati
18e30 63 20 69 6e 74 20 74 65 73 74 5f 65 72 72 63 6f  c int test_errco
18e40 64 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  de(.  void * cli
18e50 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
18e60 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
18e70 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
18e80 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
18e90 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
18ea0 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  *db;.  int rc;..
18eb0 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
18ec0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
18ed0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
18ee0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
18ef0 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
18f00 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
18f10 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42  g(objv[0]), " DB
18f20 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
18f30 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
18f40 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
18f50 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
18f60 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
18f70 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
18f80 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
18f90 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63  c = sqlite3_errc
18fa0 6f 64 65 28 64 62 29 3b 0a 20 20 54 63 6c 5f 41  ode(db);.  Tcl_A
18fb0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
18fc0 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72  rp, (char *)t1Er
18fd0 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b  rorName(rc), 0);
18fe0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
18ff0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
19000 3a 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  :   sqlite3_errm
19010 73 67 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75  sg DB.**.** Retu
19020 72 6e 73 20 74 68 65 20 55 54 46 2d 38 20 72 65  rns the UTF-8 re
19030 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
19040 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
19050 65 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65  e string for the
19060 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  .** most recent 
19070 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 20 63 61  sqlite3_* API ca
19080 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
19090 74 20 74 65 73 74 5f 65 72 72 6d 73 67 28 0a 20  t test_errmsg(. 
190a0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
190b0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
190c0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
190d0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
190e0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
190f0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
19100 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
19110 72 72 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rr;..  if( objc!
19120 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
19130 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
19140 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
19150 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
19160 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
19170 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
19180 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
19190 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
191a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
191b0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
191c0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
191d0 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
191e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
191f0 3b 0a 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69  ;..  zErr = sqli
19200 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 3b 0a  te3_errmsg(db);.
19210 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
19220 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
19230 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 45 72 72  ewStringObj(zErr
19240 2c 20 2d 31 29 29 3b 0a 20 20 72 65 74 75 72 6e  , -1));.  return
19250 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
19260 2a 20 55 73 61 67 65 3a 20 20 20 74 65 73 74 5f  * Usage:   test_
19270 65 72 72 6d 73 67 31 36 20 44 42 0a 2a 2a 0a 2a  errmsg16 DB.**.*
19280 2a 20 52 65 74 75 72 6e 73 20 74 68 65 20 55 54  * Returns the UT
19290 46 2d 31 36 20 72 65 70 72 65 73 65 6e 74 61 74  F-16 representat
192a0 69 6f 6e 20 6f 66 20 74 68 65 20 65 72 72 6f 72  ion of the error
192b0 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 20   message string 
192c0 66 6f 72 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20  for the.** most 
192d0 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a  recent sqlite3_*
192e0 20 41 50 49 20 63 61 6c 6c 2e 20 54 68 69 73 20   API call. This 
192f0 69 73 20 61 20 62 79 74 65 20 61 72 72 61 79 20  is a byte array 
19300 6f 62 6a 65 63 74 20 61 74 20 74 68 65 20 54 43  object at the TC
19310 4c 20 0a 2a 2a 20 6c 65 76 65 6c 2c 20 61 6e 64  L .** level, and
19320 20 69 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65   it includes the
19330 20 30 78 30 30 20 30 78 30 30 20 74 65 72 6d 69   0x00 0x00 termi
19340 6e 61 74 6f 72 20 62 79 74 65 73 20 61 74 20 74  nator bytes at t
19350 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  he end of the.**
19360 20 55 54 46 2d 31 36 20 73 74 72 69 6e 67 2e 0a   UTF-16 string..
19370 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
19380 73 74 5f 65 72 72 6d 73 67 31 36 28 0a 20 20 76  st_errmsg16(.  v
19390 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
193a0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
193b0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
193c0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
193d0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
193e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
193f0 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74  IT_UTF16.  sqlit
19400 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
19410 76 6f 69 64 20 2a 7a 45 72 72 3b 0a 20 20 63 6f  void *zErr;.  co
19420 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  nst char *z;.  i
19430 6e 74 20 62 79 74 65 73 20 3d 20 30 3b 0a 0a 20  nt bytes = 0;.. 
19440 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
19450 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
19460 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
19470 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
19480 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
19490 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
194a0 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22  (objv[0]), " DB"
194b0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
194c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
194d0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
194e0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
194f0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
19500 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
19510 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a   TCL_ERROR;..  z
19520 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 65 72  Err = sqlite3_er
19530 72 6d 73 67 31 36 28 64 62 29 3b 0a 20 20 69 66  rmsg16(db);.  if
19540 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 7a 20  ( zErr ){.    z 
19550 3d 20 7a 45 72 72 3b 0a 20 20 20 20 66 6f 72 28  = zErr;.    for(
19560 62 79 74 65 73 3d 30 3b 20 7a 5b 62 79 74 65 73  bytes=0; z[bytes
19570 5d 20 7c 7c 20 7a 5b 62 79 74 65 73 2b 31 5d 3b  ] || z[bytes+1];
19580 20 62 79 74 65 73 2b 3d 32 29 7b 7d 0a 20 20 7d   bytes+=2){}.  }
19590 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
195a0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
195b0 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
195c0 7a 45 72 72 2c 20 62 79 74 65 73 29 29 3b 0a 23  zErr, bytes));.#
195d0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
195e0 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20  OMIT_UTF16 */.  
195f0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
19600 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
19610 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 20 44  qlite3_prepare D
19620 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74 61 69  B sql bytes ?tai
19630 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70  lvar?.**.** Comp
19640 69 6c 65 20 75 70 20 74 6f 20 3c 62 79 74 65 73  ile up to <bytes
19650 3e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 73  > bytes of the s
19660 75 70 70 6c 69 65 64 20 53 51 4c 20 73 74 72 69  upplied SQL stri
19670 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a  ng <sql> using.*
19680 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
19690 65 20 3c 44 42 3e 2e 20 54 68 65 20 70 61 72 61  e <DB>. The para
196a0 6d 65 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20  meter <tailval> 
196b0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
196c0 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61   global.** varia
196d0 62 6c 65 20 74 68 61 74 20 69 73 20 73 65 74 20  ble that is set 
196e0 74 6f 20 74 68 65 20 75 6e 75 73 65 64 20 70 6f  to the unused po
196f0 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28  rtion of <sql> (
19700 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54  if any). A.** ST
19710 4d 54 20 68 61 6e 64 6c 65 20 69 73 20 72 65 74  MT handle is ret
19720 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
19730 20 69 6e 74 20 74 65 73 74 5f 70 72 65 70 61 72   int test_prepar
19740 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
19750 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
19760 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
19770 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
19780 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
19790 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
197a0 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
197b0 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 62 79   *zSql;.  int by
197c0 74 65 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  tes;.  const cha
197d0 72 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20  r *zTail = 0;.  
197e0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
197f0 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  tmt = 0;.  char 
19800 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 69 6e 74 20  zBuf[50];.  int 
19810 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
19820 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b  =5 && objc!=4 ){
19830 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
19840 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
19850 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
19860 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
19870 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
19880 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42  g(objv[0]), " DB
19890 20 73 71 6c 20 62 79 74 65 73 20 3f 74 61 69 6c   sql bytes ?tail
198a0 76 61 72 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72  var?", 0);.    r
198b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
198c0 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
198d0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
198e0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
198f0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
19900 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19910 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65  .  zSql = Tcl_Ge
19920 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
19930 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
19940 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
19950 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65  , objv[3], &byte
19960 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  s) ) return TCL_
19970 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
19980 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 64  qlite3_prepare(d
19990 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20  b, zSql, bytes, 
199a0 26 70 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20  &pStmt, objc>=5 
199b0 3f 20 26 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20  ? &zTail : 0);. 
199c0 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
199d0 28 69 6e 74 65 72 70 29 3b 0a 20 20 69 66 28 20  (interp);.  if( 
199e0 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
199f0 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
19a00 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
19a10 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 7a 54 61  ERROR;.  if( zTa
19a20 69 6c 20 26 26 20 6f 62 6a 63 3e 3d 35 20 29 7b  il && objc>=5 ){
19a30 0a 20 20 20 20 69 66 28 20 62 79 74 65 73 3e 3d  .    if( bytes>=
19a40 30 20 29 7b 0a 20 20 20 20 20 20 62 79 74 65 73  0 ){.      bytes
19a50 20 3d 20 62 79 74 65 73 20 2d 20 28 69 6e 74 29   = bytes - (int)
19a60 28 7a 54 61 69 6c 2d 7a 53 71 6c 29 3b 0a 20 20  (zTail-zSql);.  
19a70 20 20 7d 0a 20 20 20 20 69 66 28 20 28 69 6e 74    }.    if( (int
19a80 29 73 74 72 6c 65 6e 28 7a 54 61 69 6c 29 3c 62  )strlen(zTail)<b
19a90 79 74 65 73 20 29 7b 0a 20 20 20 20 20 20 62 79  ytes ){.      by
19aa0 74 65 73 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  tes = (int)strle
19ab0 6e 28 7a 54 61 69 6c 29 3b 0a 20 20 20 20 7d 0a  n(zTail);.    }.
19ac0 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61      Tcl_ObjSetVa
19ad0 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  r2(interp, objv[
19ae0 34 5d 2c 20 30 2c 20 54 63 6c 5f 4e 65 77 53 74  4], 0, Tcl_NewSt
19af0 72 69 6e 67 4f 62 6a 28 7a 54 61 69 6c 2c 20 62  ringObj(zTail, b
19b00 79 74 65 73 29 2c 20 30 29 3b 0a 20 20 7d 0a 20  ytes), 0);.  }. 
19b10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19b20 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
19b30 28 20 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  ( pStmt==0 );.  
19b40 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20    sprintf(zBuf, 
19b50 22 28 25 64 29 20 22 2c 20 72 63 29 3b 0a 20 20  "(%d) ", rc);.  
19b60 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
19b70 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
19b80 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
19b90 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  db), 0);.    ret
19ba0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
19bb0 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20   }..  if( pStmt 
19bc0 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
19bd0 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65  e3TestMakePointe
19be0 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75  rStr(interp, zBu
19bf0 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74 75  f, pStmt) ) retu
19c00 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
19c10 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
19c20 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
19c30 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
19c40 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
19c50 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
19c60 33 5f 70 72 65 70 61 72 65 5f 76 32 20 44 42 20  3_prepare_v2 DB 
19c70 73 71 6c 20 62 79 74 65 73 20 3f 74 61 69 6c 76  sql bytes ?tailv
19c80 61 72 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c  ar?.**.** Compil
19c90 65 20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20  e up to <bytes> 
19ca0 62 79 74 65 73 20 6f 66 20 74 68 65 20 73 75 70  bytes of the sup
19cb0 70 6c 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67  plied SQL string
19cc0 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20   <sql> using.** 
19cd0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
19ce0 3c 44 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65  <DB>. The parame
19cf0 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73  ter <tailval> is
19d00 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67   the name of a g
19d10 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  lobal.** variabl
19d20 65 20 74 68 61 74 20 69 73 20 73 65 74 20 74 6f  e that is set to
19d30 20 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74   the unused port
19d40 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66  ion of <sql> (if
19d50 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54   any). A.** STMT
19d60 20 68 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72   handle is retur
19d70 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
19d80 6e 74 20 74 65 73 74 5f 70 72 65 70 61 72 65 5f  nt test_prepare_
19d90 76 32 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  v2(.  void * cli
19da0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
19db0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
19dc0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
19dd0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
19de0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
19df0 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db;.  const cha
19e00 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 62  r *zSql;.  int b
19e10 79 74 65 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68  ytes;.  const ch
19e20 61 72 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20  ar *zTail = 0;. 
19e30 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
19e40 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  Stmt = 0;.  char
19e50 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 69 6e 74   zBuf[50];.  int
19e60 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
19e70 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34 20 29  !=5 && objc!=4 )
19e80 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
19e90 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
19ea0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
19eb0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
19ec0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
19ed0 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44  ng(objv[0]), " D
19ee0 42 20 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c  B sql bytes tail
19ef0 76 61 72 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  var", 0);.    re
19f00 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
19f10 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
19f20 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
19f30 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
19f40 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
19f50 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
19f60 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74    zSql = Tcl_Get
19f70 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
19f80 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
19f90 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
19fa0 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73   objv[3], &bytes
19fb0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
19fc0 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
19fd0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
19fe0 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73  (db, zSql, bytes
19ff0 2c 20 26 70 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d  , &pStmt, objc>=
1a000 35 20 3f 20 26 7a 54 61 69 6c 20 3a 20 30 29 3b  5 ? &zTail : 0);
1a010 0a 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51  .  assert(rc==SQ
1a020 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74  LITE_OK || pStmt
1a030 3d 3d 30 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65  ==0);.  Tcl_Rese
1a040 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  tResult(interp);
1a050 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
1a060 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
1a070 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
1a080 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1a090 69 66 28 20 7a 54 61 69 6c 20 26 26 20 6f 62 6a  if( zTail && obj
1a0a0 63 3e 3d 35 20 29 7b 0a 20 20 20 20 69 66 28 20  c>=5 ){.    if( 
1a0b0 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20 20 20  bytes>=0 ){.    
1a0c0 20 20 62 79 74 65 73 20 3d 20 62 79 74 65 73 20    bytes = bytes 
1a0d0 2d 20 28 69 6e 74 29 28 7a 54 61 69 6c 2d 7a 53  - (int)(zTail-zS
1a0e0 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  ql);.    }.    T
1a0f0 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e  cl_ObjSetVar2(in
1a100 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30  terp, objv[4], 0
1a110 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
1a120 62 6a 28 7a 54 61 69 6c 2c 20 62 79 74 65 73 29  bj(zTail, bytes)
1a130 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
1a140 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1a150 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
1a160 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 70 72  mt==0 );.    spr
1a170 69 6e 74 66 28 7a 42 75 66 2c 20 22 28 25 64 29  intf(zBuf, "(%d)
1a180 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54 63 6c   ", rc);.    Tcl
1a190 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1a1a0 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69  terp, zBuf, sqli
1a1b0 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20  te3_errmsg(db), 
1a1c0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1a1d0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1a1e0 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20   if( pStmt ){.  
1a1f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
1a200 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28  tMakePointerStr(
1a210 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53  interp, zBuf, pS
1a220 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
1a230 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c  L_ERROR;.    Tcl
1a240 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1a250 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
1a260 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
1a270 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1a280 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65  age: sqlite3_pre
1a290 70 61 72 65 5f 74 6b 74 33 31 33 34 20 44 42 0a  pare_tkt3134 DB.
1a2a0 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  **.** Generate a
1a2b0 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
1a2c0 65 6e 74 20 66 6f 72 20 61 20 7a 65 72 6f 2d 62  ent for a zero-b
1a2d0 79 74 65 20 73 74 72 69 6e 67 20 61 73 20 61 20  yte string as a 
1a2e0 74 65 73 74 0a 2a 2a 20 66 6f 72 20 74 69 63 6b  test.** for tick
1a2f0 65 74 20 23 33 31 33 34 2e 20 20 54 68 65 20 73  et #3134.  The s
1a300 74 72 69 6e 67 20 73 68 6f 75 6c 64 20 62 65 20  tring should be 
1a310 70 72 65 63 65 65 64 65 64 20 62 79 20 61 20 7a  preceeded by a z
1a320 65 72 6f 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61  ero byte..*/.sta
1a330 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65  tic int test_pre
1a340 70 61 72 65 5f 74 6b 74 33 31 33 34 28 0a 20 20  pare_tkt3134(.  
1a350 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1a360 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1a370 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1a380 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1a390 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1a3a0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1a3b0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
1a3c0 61 72 20 7a 53 71 6c 5b 5d 20 3d 20 22 5c 30 30  ar zSql[] = "\00
1a3d0 30 53 45 4c 45 43 54 20 31 22 3b 0a 20 20 73 71  0SELECT 1";.  sq
1a3e0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1a3f0 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42  t = 0;.  char zB
1a400 75 66 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63  uf[50];.  int rc
1a410 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
1a420 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1a430 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1a440 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1a450 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
1a460 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1a470 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
1a480 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 74 61   DB sql bytes ta
1a490 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20 20 20  ilvar", 0);.    
1a4a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1a4b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
1a4c0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
1a4d0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1a4e0 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
1a4f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1a500 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1a510 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
1a520 26 7a 53 71 6c 5b 31 5d 2c 20 30 2c 20 26 70 53  &zSql[1], 0, &pS
1a530 74 6d 74 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  tmt, 0);.  asser
1a540 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  t(rc==SQLITE_OK 
1a550 7c 7c 20 70 53 74 6d 74 3d 3d 30 29 3b 0a 20 20  || pStmt==0);.  
1a560 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
1a570 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
1a580 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
1a590 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
1a5a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a5b0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  {.    assert( pS
1a5c0 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 70  tmt==0 );.    sp
1a5d0 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 28 25 64  rintf(zBuf, "(%d
1a5e0 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54 63  ) ", rc);.    Tc
1a5f0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1a600 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c  nterp, zBuf, sql
1a610 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c  ite3_errmsg(db),
1a620 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1a630 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1a640 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
1a650 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65     if( sqlite3Te
1a660 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  stMakePointerStr
1a670 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70  (interp, zBuf, p
1a680 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
1a690 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63  CL_ERROR;.    Tc
1a6a0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1a6b0 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b  nterp, zBuf, 0);
1a6c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
1a6d0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1a6e0 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72  sage: sqlite3_pr
1a6f0 65 70 61 72 65 31 36 20 44 42 20 73 71 6c 20 62  epare16 DB sql b
1a700 79 74 65 73 20 74 61 69 6c 76 61 72 0a 2a 2a 0a  ytes tailvar.**.
1a710 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f  ** Compile up to
1a720 20 3c 62 79 74 65 73 3e 20 62 79 74 65 73 20 6f   <bytes> bytes o
1a730 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 53  f the supplied S
1a740 51 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20  QL string <sql> 
1a750 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73  using.** databas
1a760 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54  e handle <DB>. T
1a770 68 65 20 70 61 72 61 6d 65 74 65 72 20 3c 74 61  he parameter <ta
1a780 69 6c 76 61 6c 3e 20 69 73 20 74 68 65 20 6e 61  ilval> is the na
1a790 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a  me of a global.*
1a7a0 2a 20 76 61 72 69 61 62 6c 65 20 74 68 61 74 20  * variable that 
1a7b0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 75 6e  is set to the un
1a7c0 75 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20  used portion of 
1a7d0 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20  <sql> (if any). 
1a7e0 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65  A.** STMT handle
1a7f0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
1a800 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1a810 5f 70 72 65 70 61 72 65 31 36 28 0a 20 20 76 6f  _prepare16(.  vo
1a820 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1a830 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1a840 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1a850 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1a860 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69  NST objv[].){.#i
1a870 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1a880 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65  T_UTF16.  sqlite
1a890 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 76  3 *db;.  const v
1a8a0 6f 69 64 20 2a 7a 53 71 6c 3b 0a 20 20 63 6f 6e  oid *zSql;.  con
1a8b0 73 74 20 76 6f 69 64 20 2a 7a 54 61 69 6c 20 3d  st void *zTail =
1a8c0 20 30 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70   0;.  Tcl_Obj *p
1a8d0 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Tail = 0;.  sqli
1a8e0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
1a8f0 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  = 0;.  char zBuf
1a900 5b 35 30 5d 3b 20 0a 20 20 69 6e 74 20 72 63 3b  [50]; .  int rc;
1a910 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 20 20 20  .  int bytes;   
1a920 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a930 54 68 65 20 69 6e 74 65 67 65 72 20 73 70 65 63  The integer spec
1a940 69 66 69 65 64 20 61 73 20 61 72 67 20 33 20 2a  ified as arg 3 *
1a950 2f 0a 20 20 69 6e 74 20 6f 62 6a 6c 65 6e 3b 20  /.  int objlen; 
1a960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a970 20 54 68 65 20 62 79 74 65 2d 61 72 72 61 79 20   The byte-array 
1a980 6c 65 6e 67 74 68 20 6f 66 20 61 72 67 20 32 20  length of arg 2 
1a990 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  */..  if( objc!=
1a9a0 35 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a  5 && objc!=4 ){.
1a9b0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1a9c0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1a9d0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1a9e0 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
1a9f0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
1aa00 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20  (objv[0]), " DB 
1aa10 73 71 6c 20 62 79 74 65 73 20 3f 74 61 69 6c 76  sql bytes ?tailv
1aa20 61 72 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  ar?", 0);.    re
1aa30 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1aa40 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
1aa50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
1aa60 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1aa70 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
1aa80 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1aa90 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74    zSql = Tcl_Get
1aaa0 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
1aab0 28 6f 62 6a 76 5b 32 5d 2c 20 26 6f 62 6a 6c 65  (objv[2], &objle
1aac0 6e 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  n);.  if( Tcl_Ge
1aad0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
1aae0 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79  rp, objv[3], &by
1aaf0 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43  tes) ) return TC
1ab00 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
1ab10 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
1ab20 31 36 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74  16(db, zSql, byt
1ab30 65 73 2c 20 26 70 53 74 6d 74 2c 20 6f 62 6a 63  es, &pStmt, objc
1ab40 3e 3d 35 20 3f 20 26 7a 54 61 69 6c 20 3a 20 30  >=5 ? &zTail : 0
1ab50 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
1ab60 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
1ab70 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65  rp, db, rc) ) re
1ab80 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1ab90 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1aba0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1abb0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f 62 6a  ;.  }..  if( obj
1abc0 63 3e 3d 35 20 29 7b 0a 20 20 20 20 69 66 28 20  c>=5 ){.    if( 
1abd0 7a 54 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 6f  zTail ){.      o
1abe0 62 6a 6c 65 6e 20 3d 20 6f 62 6a 6c 65 6e 20 2d  bjlen = objlen -
1abf0 20 28 69 6e 74 29 28 28 75 38 20 2a 29 7a 54 61   (int)((u8 *)zTa
1ac00 69 6c 2d 28 75 38 20 2a 29 7a 53 71 6c 29 3b 0a  il-(u8 *)zSql);.
1ac10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ac20 20 6f 62 6a 6c 65 6e 20 3d 20 30 3b 0a 20 20 20   objlen = 0;.   
1ac30 20 7d 0a 20 20 20 20 70 54 61 69 6c 20 3d 20 54   }.    pTail = T
1ac40 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
1ac50 62 6a 28 28 75 38 20 2a 29 7a 54 61 69 6c 2c 20  bj((u8 *)zTail, 
1ac60 6f 62 6a 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c  objlen);.    Tcl
1ac70 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 54  _IncrRefCount(pT
1ac80 61 69 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  ail);.    Tcl_Ob
1ac90 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  jSetVar2(interp,
1aca0 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 70 54 61   objv[4], 0, pTa
1acb0 69 6c 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f  il, 0);.    Tcl_
1acc0 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 54 61  DecrRefCount(pTa
1acd0 69 6c 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  il);.  }..  if( 
1ace0 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28  pStmt ){.    if(
1acf0 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65   sqlite3TestMake
1ad00 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72  PointerStr(inter
1ad10 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20  p, zBuf, pStmt) 
1ad20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1ad30 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70  OR;.  }.  Tcl_Ap
1ad40 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1ad50 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 23 65 6e  p, zBuf, 0);.#en
1ad60 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1ad70 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65  IT_UTF16 */.  re
1ad80 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1ad90 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1ada0 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 5f 76  ite3_prepare16_v
1adb0 32 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f  2 DB sql bytes ?
1adc0 74 61 69 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a 20 43  tailvar?.**.** C
1add0 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79  ompile up to <by
1ade0 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68  tes> bytes of th
1adf0 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73  e supplied SQL s
1ae00 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e  tring <sql> usin
1ae10 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61  g.** database ha
1ae20 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20 70  ndle <DB>. The p
1ae30 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76 61  arameter <tailva
1ae40 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  l> is the name o
1ae50 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61  f a global.** va
1ae60 72 69 61 62 6c 65 20 74 68 61 74 20 69 73 20 73  riable that is s
1ae70 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65 64  et to the unused
1ae80 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c   portion of <sql
1ae90 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a  > (if any). A.**
1aea0 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73 20   STMT handle is 
1aeb0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
1aec0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65  tic int test_pre
1aed0 70 61 72 65 31 36 5f 76 32 28 0a 20 20 76 6f 69  pare16_v2(.  voi
1aee0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1aef0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1af00 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1af10 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1af20 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
1af30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1af40 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33  _UTF16.  sqlite3
1af50 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f   *db;.  const vo
1af60 69 64 20 2a 7a 53 71 6c 3b 0a 20 20 63 6f 6e 73  id *zSql;.  cons
1af70 74 20 76 6f 69 64 20 2a 7a 54 61 69 6c 20 3d 20  t void *zTail = 
1af80 30 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 54  0;.  Tcl_Obj *pT
1af90 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ail = 0;.  sqlit
1afa0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
1afb0 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b   0;.  char zBuf[
1afc0 35 30 5d 3b 20 0a 20 20 69 6e 74 20 72 63 3b 0a  50]; .  int rc;.
1afd0 20 20 69 6e 74 20 62 79 74 65 73 3b 20 20 20 20    int bytes;    
1afe0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1aff0 68 65 20 69 6e 74 65 67 65 72 20 73 70 65 63 69  he integer speci
1b000 66 69 65 64 20 61 73 20 61 72 67 20 33 20 2a 2f  fied as arg 3 */
1b010 0a 20 20 69 6e 74 20 6f 62 6a 6c 65 6e 3b 20 20  .  int objlen;  
1b020 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b030 54 68 65 20 62 79 74 65 2d 61 72 72 61 79 20 6c  The byte-array l
1b040 65 6e 67 74 68 20 6f 66 20 61 72 67 20 32 20 2a  ength of arg 2 *
1b050 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35  /..  if( objc!=5
1b060 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20   && objc!=4 ){. 
1b070 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1b080 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1b090 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1b0a0 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
1b0b0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
1b0c0 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73  objv[0]), " DB s
1b0d0 71 6c 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61  ql bytes ?tailva
1b0e0 72 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  r?", 0);.    ret
1b0f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1b100 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
1b110 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1b120 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1b130 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
1b140 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1b150 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 42   zSql = Tcl_GetB
1b160 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
1b170 6f 62 6a 76 5b 32 5d 2c 20 26 6f 62 6a 6c 65 6e  objv[2], &objlen
1b180 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  );.  if( Tcl_Get
1b190 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
1b1a0 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74  p, objv[3], &byt
1b1b0 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  es) ) return TCL
1b1c0 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
1b1d0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31  sqlite3_prepare1
1b1e0 36 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 62  6_v2(db, zSql, b
1b1f0 79 74 65 73 2c 20 26 70 53 74 6d 74 2c 20 6f 62  ytes, &pStmt, ob
1b200 6a 63 3e 3d 35 20 3f 20 26 7a 54 61 69 6c 20 3a  jc>=5 ? &zTail :
1b210 20 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74   0);.  if( sqlit
1b220 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
1b230 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
1b240 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1b250 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
1b260 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1b270 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f  OR;.  }..  if( o
1b280 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20 20 69 66  bjc>=5 ){.    if
1b290 28 20 7a 54 61 69 6c 20 29 7b 0a 20 20 20 20 20  ( zTail ){.     
1b2a0 20 6f 62 6a 6c 65 6e 20 3d 20 6f 62 6a 6c 65 6e   objlen = objlen
1b2b0 20 2d 20 28 69 6e 74 29 28 28 75 38 20 2a 29 7a   - (int)((u8 *)z
1b2c0 54 61 69 6c 2d 28 75 38 20 2a 29 7a 53 71 6c 29  Tail-(u8 *)zSql)
1b2d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1b2e0 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 30 3b 0a 20     objlen = 0;. 
1b2f0 20 20 20 7d 0a 20 20 20 20 70 54 61 69 6c 20 3d     }.    pTail =
1b300 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
1b310 79 4f 62 6a 28 28 75 38 20 2a 29 7a 54 61 69 6c  yObj((u8 *)zTail
1b320 2c 20 6f 62 6a 6c 65 6e 29 3b 0a 20 20 20 20 54  , objlen);.    T
1b330 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
1b340 70 54 61 69 6c 29 3b 0a 20 20 20 20 54 63 6c 5f  pTail);.    Tcl_
1b350 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72  ObjSetVar2(inter
1b360 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 70  p, objv[4], 0, p
1b370 54 61 69 6c 2c 20 30 29 3b 0a 20 20 20 20 54 63  Tail, 0);.    Tc
1b380 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
1b390 54 61 69 6c 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  Tail);.  }..  if
1b3a0 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69  ( pStmt ){.    i
1b3b0 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61  f( sqlite3TestMa
1b3c0 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74  kePointerStr(int
1b3d0 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74  erp, zBuf, pStmt
1b3e0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1b3f0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  RROR;.  }.  Tcl_
1b400 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1b410 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 23  erp, zBuf, 0);.#
1b420 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1b430 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20  OMIT_UTF16 */.  
1b440 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1b450 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1b460 71 6c 69 74 65 33 5f 6f 70 65 6e 20 66 69 6c 65  qlite3_open file
1b470 6e 61 6d 65 20 3f 6f 70 74 69 6f 6e 73 2d 6c 69  name ?options-li
1b480 73 74 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st?.*/.static in
1b490 74 20 74 65 73 74 5f 6f 70 65 6e 28 0a 20 20 76  t test_open(.  v
1b4a0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1b4b0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1b4c0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1b4d0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1b4e0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1b4f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
1b500 6c 65 6e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65  lename;.  sqlite
1b510 33 20 2a 64 62 3b 0a 20 20 63 68 61 72 20 7a 42  3 *db;.  char zB
1b520 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20  uf[100];..  if( 
1b530 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21  objc!=3 && objc!
1b540 3d 32 20 26 26 20 6f 62 6a 63 21 3d 31 20 29 7b  =2 && objc!=1 ){
1b550 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1b560 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1b570 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1b580 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
1b590 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
1b5a0 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 66 69  g(objv[0]), " fi
1b5b0 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e 73 2d 6c  lename options-l
1b5c0 69 73 74 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  ist", 0);.    re
1b5d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1b5e0 20 20 7d 0a 0a 20 20 7a 46 69 6c 65 6e 61 6d 65    }..  zFilename
1b5f0 20 3d 20 6f 62 6a 63 3e 31 20 3f 20 54 63 6c 5f   = objc>1 ? Tcl_
1b600 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1b610 5d 29 20 3a 20 30 3b 0a 20 20 73 71 6c 69 74 65  ]) : 0;.  sqlite
1b620 33 5f 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  3_open(zFilename
1b630 2c 20 26 64 62 29 3b 0a 20 20 0a 20 20 69 66 28  , &db);.  .  if(
1b640 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65   sqlite3TestMake
1b650 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72  PointerStr(inter
1b660 70 2c 20 7a 42 75 66 2c 20 64 62 29 20 29 20 72  p, zBuf, db) ) r
1b670 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1b680 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
1b690 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
1b6a0 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
1b6b0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1b6c0 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6f  Usage: sqlite3_o
1b6d0 70 65 6e 5f 76 32 20 46 49 4c 45 4e 41 4d 45 20  pen_v2 FILENAME 
1b6e0 46 4c 41 47 53 20 56 46 53 0a 2a 2f 0a 73 74 61  FLAGS VFS.*/.sta
1b6f0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6f 70 65  tic int test_ope
1b700 6e 5f 76 32 28 0a 20 20 76 6f 69 64 20 2a 20 63  n_v2(.  void * c
1b710 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1b720 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1b730 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1b740 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1b750 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  jv[].){.  const 
1b760 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
1b770 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1b780 56 66 73 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73  Vfs;.  int flags
1b790 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20   = 0;.  sqlite3 
1b7a0 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *db;.  int rc;. 
1b7b0 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b   char zBuf[100];
1b7c0 0a 0a 20 20 69 6e 74 20 6e 46 6c 61 67 3b 0a 20  ..  int nFlag;. 
1b7d0 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 46 6c 61   Tcl_Obj **apFla
1b7e0 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69  g;.  int i;..  i
1b7f0 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
1b800 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
1b810 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
1b820 6a 76 2c 20 22 46 49 4c 45 4e 41 4d 45 20 46 4c  jv, "FILENAME FL
1b830 41 47 53 20 56 46 53 22 29 3b 0a 20 20 20 20 72  AGS VFS");.    r
1b840 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1b850 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65  .  }.  zFilename
1b860 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
1b870 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 7a 56 66  (objv[1]);.  zVf
1b880 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  s = Tcl_GetStrin
1b890 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 69 66  g(objv[3]);.  if
1b8a0 28 20 7a 56 66 73 5b 30 5d 3d 3d 30 78 30 30 20  ( zVfs[0]==0x00 
1b8b0 29 20 7a 56 66 73 20 3d 20 30 3b 0a 0a 20 20 72  ) zVfs = 0;..  r
1b8c0 63 20 3d 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 47  c = Tcl_ListObjG
1b8d0 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72  etElements(inter
1b8e0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6e 46 6c  p, objv[2], &nFl
1b8f0 61 67 2c 20 26 61 70 46 6c 61 67 29 3b 0a 20 20  ag, &apFlag);.  
1b900 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29  if( rc!=TCL_OK )
1b910 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 66 6f   return rc;.  fo
1b920 72 28 69 3d 30 3b 20 69 3c 6e 46 6c 61 67 3b 20  r(i=0; i<nFlag; 
1b930 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 46  i++){.    int iF
1b940 6c 61 67 3b 0a 20 20 20 20 73 74 72 75 63 74 20  lag;.    struct 
1b950 4f 70 65 6e 46 6c 61 67 20 7b 0a 20 20 20 20 20  OpenFlag {.     
1b960 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6c   const char *zFl
1b970 61 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c  ag;.      int fl
1b980 61 67 3b 0a 20 20 20 20 7d 20 61 46 6c 61 67 5b  ag;.    } aFlag[
1b990 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 53  ] = {.      { "S
1b9a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
1b9b0 4e 4c 59 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  NLY", SQLITE_OPE
1b9c0 4e 5f 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20  N_READONLY },.  
1b9d0 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
1b9e0 45 4e 5f 52 45 41 44 57 52 49 54 45 22 2c 20 53  EN_READWRITE", S
1b9f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
1ba00 52 49 54 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20  RITE },.      { 
1ba10 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  "SQLITE_OPEN_CRE
1ba20 41 54 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  ATE", SQLITE_OPE
1ba30 4e 5f 43 52 45 41 54 45 20 7d 2c 0a 20 20 20 20  N_CREATE },.    
1ba40 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1ba50 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 22 2c  _DELETEONCLOSE",
1ba60 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
1ba70 45 54 45 4f 4e 43 4c 4f 53 45 20 7d 2c 0a 20 20  ETEONCLOSE },.  
1ba80 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
1ba90 45 4e 5f 45 58 43 4c 55 53 49 56 45 22 2c 20 53  EN_EXCLUSIVE", S
1baa0 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
1bab0 53 49 56 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20  SIVE },.      { 
1bac0 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54  "SQLITE_OPEN_AUT
1bad0 4f 50 52 4f 58 59 22 2c 20 53 51 4c 49 54 45 5f  OPROXY", SQLITE_
1bae0 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 20 7d  OPEN_AUTOPROXY }
1baf0 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  ,.      { "SQLIT
1bb00 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 22 2c  E_OPEN_MAIN_DB",
1bb10 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
1bb20 4e 5f 44 42 20 7d 2c 0a 20 20 20 20 20 20 7b 20  N_DB },.      { 
1bb30 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  "SQLITE_OPEN_TEM
1bb40 50 5f 44 42 22 2c 20 53 51 4c 49 54 45 5f 4f 50  P_DB", SQLITE_OP
1bb50 45 4e 5f 54 45 4d 50 5f 44 42 20 7d 2c 0a 20 20  EN_TEMP_DB },.  
1bb60 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
1bb70 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 22  EN_TRANSIENT_DB"
1bb80 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52  , SQLITE_OPEN_TR
1bb90 41 4e 53 49 45 4e 54 5f 44 42 20 7d 2c 0a 20 20  ANSIENT_DB },.  
1bba0 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
1bbb0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 22  EN_MAIN_JOURNAL"
1bbc0 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  , SQLITE_OPEN_MA
1bbd0 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20  IN_JOURNAL },.  
1bbe0 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
1bbf0 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 22  EN_TEMP_JOURNAL"
1bc00 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  , SQLITE_OPEN_TE
1bc10 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20  MP_JOURNAL },.  
1bc20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
1bc30 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 22 2c 20  EN_SUBJOURNAL", 
1bc40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
1bc50 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20 20 20 20  OURNAL },.      
1bc60 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  { "SQLITE_OPEN_M
1bc70 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 22 2c 20  ASTER_JOURNAL", 
1bc80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
1bc90 45 52 5f 4a 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20  ER_JOURNAL },.  
1bca0 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
1bcb0 45 4e 5f 4e 4f 4d 55 54 45 58 22 2c 20 53 51 4c  EN_NOMUTEX", SQL
1bcc0 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58  ITE_OPEN_NOMUTEX
1bcd0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1bce0 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54  ITE_OPEN_FULLMUT
1bcf0 45 58 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  EX", SQLITE_OPEN
1bd00 5f 46 55 4c 4c 4d 55 54 45 58 20 7d 2c 0a 20 20  _FULLMUTEX },.  
1bd10 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
1bd20 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 22 2c  EN_SHAREDCACHE",
1bd30 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41   SQLITE_OPEN_SHA
1bd40 52 45 44 43 41 43 48 45 20 7d 2c 0a 20 20 20 20  REDCACHE },.    
1bd50 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1bd60 5f 50 52 49 56 41 54 45 43 41 43 48 45 22 2c 20  _PRIVATECACHE", 
1bd70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56  SQLITE_OPEN_PRIV
1bd80 41 54 45 43 41 43 48 45 20 7d 2c 0a 20 20 20 20  ATECACHE },.    
1bd90 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1bda0 5f 57 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50  _WAL", SQLITE_OP
1bdb0 45 4e 5f 57 41 4c 20 7d 2c 0a 20 20 20 20 20 20  EN_WAL },.      
1bdc0 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55  { "SQLITE_OPEN_U
1bdd0 52 49 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  RI", SQLITE_OPEN
1bde0 5f 55 52 49 20 7d 2c 0a 20 20 20 20 20 20 7b 20  _URI },.      { 
1bdf0 30 2c 20 30 20 7d 0a 20 20 20 20 7d 3b 0a 20 20  0, 0 }.    };.  
1be00 20 20 72 63 20 3d 20 54 63 6c 5f 47 65 74 49 6e    rc = Tcl_GetIn
1be10 64 65 78 46 72 6f 6d 4f 62 6a 53 74 72 75 63 74  dexFromObjStruct
1be20 28 69 6e 74 65 72 70 2c 20 61 70 46 6c 61 67 5b  (interp, apFlag[
1be30 69 5d 2c 20 61 46 6c 61 67 2c 20 73 69 7a 65 6f  i], aFlag, sizeo
1be40 66 28 61 46 6c 61 67 5b 30 5d 29 2c 20 0a 20 20  f(aFlag[0]), .  
1be50 20 20 20 20 20 20 22 66 6c 61 67 22 2c 20 30 2c        "flag", 0,
1be60 20 26 69 46 6c 61 67 0a 20 20 20 20 29 3b 0a 20   &iFlag.    );. 
1be70 20 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f     if( rc!=TCL_O
1be80 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1be90 20 20 20 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61     flags |= aFla
1bea0 67 5b 69 46 6c 61 67 5d 2e 66 6c 61 67 3b 0a 20  g[iFlag].flag;. 
1beb0 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   }..  rc = sqlit
1bec0 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 46 69 6c 65  e3_open_v2(zFile
1bed0 6e 61 6d 65 2c 20 26 64 62 2c 20 66 6c 61 67 73  name, &db, flags
1bee0 2c 20 7a 56 66 73 29 3b 0a 20 20 69 66 28 20 73  , zVfs);.  if( s
1bef0 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f  qlite3TestMakePo
1bf00 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c  interStr(interp,
1bf10 20 7a 42 75 66 2c 20 64 62 29 20 29 20 72 65 74   zBuf, db) ) ret
1bf20 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1bf30 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1bf40 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
1bf50 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
1bf60 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1bf70 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65  age: sqlite3_ope
1bf80 6e 31 36 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74  n16 filename opt
1bf90 69 6f 6e 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ions.*/.static i
1bfa0 6e 74 20 74 65 73 74 5f 6f 70 65 6e 31 36 28 0a  nt test_open16(.
1bfb0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1bfc0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1bfd0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1bfe0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1bff0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1c000 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
1c010 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 63 6f  _OMIT_UTF16.  co
1c020 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e  nst void *zFilen
1c030 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ame;.  sqlite3 *
1c040 64 62 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b  db;.  char zBuf[
1c050 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  100];..  if( obj
1c060 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
1c070 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1c080 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1c090 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1c0a0 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
1c0b0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
1c0c0 29 2c 20 22 20 66 69 6c 65 6e 61 6d 65 20 6f 70  ), " filename op
1c0d0 74 69 6f 6e 73 2d 6c 69 73 74 22 2c 20 30 29 3b  tions-list", 0);
1c0e0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1c0f0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46  ERROR;.  }..  zF
1c100 69 6c 65 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65  ilename = Tcl_Ge
1c110 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
1c120 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20  j(objv[1], 0);. 
1c130 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
1c140 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 64 62 29 3b  zFilename, &db);
1c150 0a 20 20 0a 20 20 69 66 28 20 73 71 6c 69 74 65  .  .  if( sqlite
1c160 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72  3TestMakePointer
1c170 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  Str(interp, zBuf
1c180 2c 20 64 62 29 20 29 20 72 65 74 75 72 6e 20 54  , db) ) return T
1c190 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
1c1a0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1c1b0 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 23  erp, zBuf, 0);.#
1c1c0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1c1d0 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20  OMIT_UTF16 */.  
1c1e0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1c1f0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1c200 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31  qlite3_complete1
1c210 36 20 3c 55 54 46 2d 31 36 20 73 74 72 69 6e 67  6 <UTF-16 string
1c220 3e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31  >.**.** Return 1
1c230 20 69 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   if the supplied
1c240 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 63   argument is a c
1c250 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61 74  omplete SQL stat
1c260 65 6d 65 6e 74 2c 20 6f 72 20 7a 65 72 6f 0a 2a  ement, or zero.*
1c270 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  * otherwise..*/.
1c280 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1c290 63 6f 6d 70 6c 65 74 65 31 36 28 0a 20 20 76 6f  complete16(.  vo
1c2a0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1c2b0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1c2c0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1c2d0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1c2e0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69  NST objv[].){.#i
1c2f0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
1c300 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 29  E_OMIT_COMPLETE)
1c310 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
1c320 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 29 0a  ITE_OMIT_UTF16).
1c330 20 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 0a 20    char *zBuf;.. 
1c340 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
1c350 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
1c360 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
1c370 6f 62 6a 76 2c 20 22 3c 75 74 66 2d 31 36 20 73  objv, "<utf-16 s
1c380 71 6c 3e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ql>");.    retur
1c390 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1c3a0 0a 0a 20 20 7a 42 75 66 20 3d 20 28 63 68 61 72  ..  zBuf = (char
1c3b0 2a 29 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  *)Tcl_GetByteArr
1c3c0 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31  ayFromObj(objv[1
1c3d0 5d 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74  ], 0);.  Tcl_Set
1c3e0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
1c3f0 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
1c400 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65  sqlite3_complete
1c410 31 36 28 7a 42 75 66 29 29 29 3b 0a 23 65 6e 64  16(zBuf)));.#end
1c420 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1c430 54 5f 43 4f 4d 50 4c 45 54 45 20 26 26 20 53 51  T_COMPLETE && SQ
1c440 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
1c450 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  */.  return TCL_
1c460 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1c470 67 65 3a 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ge: sqlite3_step
1c480 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 41 64 76 61   STMT.**.** Adva
1c490 6e 63 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e  nce the statemen
1c4a0 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f  t to the next ro
1c4b0 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  w..*/.static int
1c4c0 20 74 65 73 74 5f 73 74 65 70 28 0a 20 20 76 6f   test_step(.  vo
1c4d0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1c4e0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1c4f0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1c500 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1c510 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1c520 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1c530 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  tmt;.  int rc;..
1c540 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
1c550 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1c560 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1c570 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1c580 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
1c590 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
1c5a0 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54  g(objv[0]), " ST
1c5b0 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  MT", 0);.    ret
1c5c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1c5d0 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
1c5e0 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
1c5f0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1c600 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
1c610 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1c620 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
1c630 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b  te3_step(pStmt);
1c640 0a 0a 20 20 2f 2a 20 69 66 28 20 72 63 21 3d 53  ..  /* if( rc!=S
1c650 51 4c 49 54 45 5f 44 4f 4e 45 20 26 26 20 72 63  QLITE_DONE && rc
1c660 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 20 72  !=SQLITE_ROW ) r
1c670 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1c680 20 2a 2f 0a 20 20 54 63 6c 5f 53 65 74 52 65 73   */.  Tcl_SetRes
1c690 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
1c6a0 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28  r *)t1ErrorName(
1c6b0 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  rc), 0);.  retur
1c6c0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61  n TCL_OK;.}..sta
1c6d0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 71 6c  tic int test_sql
1c6e0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1c6f0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1c700 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1c710 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1c720 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1c730 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
1c740 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66  mt *pStmt;..  if
1c750 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
1c760 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
1c770 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
1c780 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20  v, "STMT");.    
1c790 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1c7a0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
1c7b0 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
1c7c0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1c7d0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
1c7e0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
1c7f0 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65  _ERROR;.  Tcl_Se
1c800 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
1c810 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
1c820 73 71 6c 28 70 53 74 6d 74 29 2c 20 54 43 4c 5f  sql(pStmt), TCL_
1c830 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 72 65 74  VOLATILE);.  ret
1c840 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1c850 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1c860 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
1c870 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74   STMT .**.** Ret
1c880 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
1c890 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e  f columns return
1c8a0 65 64 20 62 79 20 74 68 65 20 73 71 6c 20 73 74  ed by the sql st
1c8b0 61 74 65 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f  atement STMT..*/
1c8c0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1c8d0 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 0a 20  _column_count(. 
1c8e0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1c8f0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1c900 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1c910 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1c920 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1c930 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1c940 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f  *pStmt;..  if( o
1c950 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
1c960 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1c970 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1c980 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1c990 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
1c9a0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1c9b0 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75  0]), " STMT colu
1c9c0 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  mn", 0);.    ret
1c9d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1c9e0 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
1c9f0 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
1ca00 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1ca10 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
1ca20 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1ca30 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f  ROR;..  Tcl_SetO
1ca40 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
1ca50 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
1ca60 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
1ca70 75 6e 74 28 70 53 74 6d 74 29 29 29 3b 0a 20 20  unt(pStmt)));.  
1ca80 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1ca90 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1caa0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79  qlite3_column_ty
1cab0 70 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  pe STMT column.*
1cac0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1cad0 74 79 70 65 20 6f 66 20 74 68 65 20 64 61 74 61  type of the data
1cae0 20 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75   in column 'colu
1caf0 6d 6e 27 20 6f 66 20 74 68 65 20 63 75 72 72 65  mn' of the curre
1cb00 6e 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69  nt row..*/.stati
1cb10 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d  c int test_colum
1cb20 6e 5f 74 79 70 65 28 0a 20 20 76 6f 69 64 20 2a  n_type(.  void *
1cb30 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1cb40 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1cb50 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1cb60 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1cb70 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
1cb80 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
1cb90 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 6e  .  int col;.  in
1cba0 74 20 74 70 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t tp;..  if( obj
1cbb0 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
1cbc0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1cbd0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1cbe0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1cbf0 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
1cc00 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
1cc10 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  ), " STMT column
1cc20 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1cc30 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1cc40 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
1cc50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
1cc60 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1cc70 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
1cc80 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1cc90 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
1cca0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
1ccb0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c  p, objv[2], &col
1ccc0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1ccd0 52 52 4f 52 3b 0a 0a 20 20 74 70 20 3d 20 73 71  RROR;..  tp = sq
1cce0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70  lite3_column_typ
1ccf0 65 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20  e(pStmt, col);. 
1cd00 20 73 77 69 74 63 68 28 20 74 70 20 29 7b 0a 20   switch( tp ){. 
1cd10 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
1cd20 4e 54 45 47 45 52 3a 20 0a 20 20 20 20 20 20 54  NTEGER: .      T
1cd30 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
1cd40 65 72 70 2c 20 22 49 4e 54 45 47 45 52 22 2c 20  erp, "INTEGER", 
1cd50 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20  TCL_STATIC); .  
1cd60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1cd70 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a  ase SQLITE_NULL:
1cd80 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65  .      Tcl_SetRe
1cd90 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 55  sult(interp, "NU
1cda0 4c 4c 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  LL", TCL_STATIC)
1cdb0 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ; .      break;.
1cdc0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1cdd0 46 4c 4f 41 54 3a 0a 20 20 20 20 20 20 54 63 6c  FLOAT:.      Tcl
1cde0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
1cdf0 70 2c 20 22 46 4c 4f 41 54 22 2c 20 54 43 4c 5f  p, "FLOAT", TCL_
1ce00 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20  STATIC); .      
1ce10 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1ce20 53 51 4c 49 54 45 5f 54 45 58 54 3a 0a 20 20 20  SQLITE_TEXT:.   
1ce30 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
1ce40 28 69 6e 74 65 72 70 2c 20 22 54 45 58 54 22 2c  (interp, "TEXT",
1ce50 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20   TCL_STATIC); . 
1ce60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ce70 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42  case SQLITE_BLOB
1ce80 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52  :.      Tcl_SetR
1ce90 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 42  esult(interp, "B
1cea0 4c 4f 42 22 2c 20 54 43 4c 5f 53 54 41 54 49 43  LOB", TCL_STATIC
1ceb0 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ); .      break;
1cec0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
1ced0 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20      assert(0);. 
1cee0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
1cef0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1cf00 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
1cf10 75 6d 6e 5f 69 6e 74 36 34 20 53 54 4d 54 20 63  umn_int64 STMT c
1cf20 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  olumn.**.** Retu
1cf30 72 6e 20 74 68 65 20 64 61 74 61 20 69 6e 20 63  rn the data in c
1cf40 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f  olumn 'column' o
1cf50 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  f the current ro
1cf60 77 20 63 61 73 74 20 61 73 20 61 6e 0a 2a 2a 20  w cast as an.** 
1cf70 77 69 64 65 20 28 36 34 2d 62 69 74 29 20 69 6e  wide (64-bit) in
1cf80 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  teger..*/.static
1cf90 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e   int test_column
1cfa0 5f 69 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a  _int64(.  void *
1cfb0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1cfc0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1cfd0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1cfe0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1cff0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
1d000 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
1d010 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 36  .  int col;.  i6
1d020 34 20 69 56 61 6c 3b 0a 0a 20 20 69 66 28 20 6f  4 iVal;..  if( o
1d030 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
1d040 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1d050 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1d060 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1d070 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
1d080 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1d090 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75  0]), " STMT colu
1d0a0 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  mn", 0);.    ret
1d0b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1d0c0 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
1d0d0 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
1d0e0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1d0f0 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
1d100 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1d110 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
1d120 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
1d130 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63  erp, objv[2], &c
1d140 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ol) ) return TCL
1d150 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 56 61 6c 20  _ERROR;..  iVal 
1d160 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
1d170 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 63 6f  _int64(pStmt, co
1d180 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  l);.  Tcl_SetObj
1d190 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1d1a0 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
1d1b0 28 69 56 61 6c 29 29 3b 0a 20 20 72 65 74 75 72  (iVal));.  retur
1d1c0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1d1d0 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1d1e0 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20 53 54  3_column_blob ST
1d1f0 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61  MT column.*/.sta
1d200 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c  tic int test_col
1d210 75 6d 6e 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64  umn_blob(.  void
1d220 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1d230 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1d240 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1d250 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1d260 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
1d270 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1d280 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 0a 20  t;.  int col;.. 
1d290 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 63 6f 6e 73   int len;.  cons
1d2a0 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62 3b 0a 0a  t void *pBlob;..
1d2b0 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
1d2c0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1d2d0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1d2e0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1d2f0 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
1d300 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
1d310 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54  g(objv[0]), " ST
1d320 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  MT column", 0);.
1d330 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1d340 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
1d350 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
1d360 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1d370 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1d380 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
1d390 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
1d3a0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
1d3b0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
1d3c0 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74  [2], &col) ) ret
1d3d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
1d3e0 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f    len = sqlite3_
1d3f0 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
1d400 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 70 42 6c 6f  mt, col);.  pBlo
1d410 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  b = sqlite3_colu
1d420 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 63  mn_blob(pStmt, c
1d430 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ol);.  Tcl_SetOb
1d440 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
1d450 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79  Tcl_NewByteArray
1d460 4f 62 6a 28 70 42 6c 6f 62 2c 20 6c 65 6e 29 29  Obj(pBlob, len))
1d470 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1d480 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1d490 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
1d4a0 6e 5f 64 6f 75 62 6c 65 20 53 54 4d 54 20 63 6f  n_double STMT co
1d4b0 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  lumn.**.** Retur
1d4c0 6e 20 74 68 65 20 64 61 74 61 20 69 6e 20 63 6f  n the data in co
1d4d0 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66  lumn 'column' of
1d4e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
1d4f0 20 63 61 73 74 20 61 73 20 61 20 64 6f 75 62 6c   cast as a doubl
1d500 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1d510 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75   test_column_dou
1d520 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ble(.  void * cl
1d530 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1d540 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1d550 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1d560 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1d570 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
1d580 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
1d590 69 6e 74 20 63 6f 6c 3b 0a 20 20 64 6f 75 62 6c  int col;.  doubl
1d5a0 65 20 72 56 61 6c 3b 0a 0a 20 20 69 66 28 20 6f  e rVal;..  if( o
1d5b0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
1d5c0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1d5d0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1d5e0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1d5f0 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
1d600 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1d610 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75  0]), " STMT colu
1d620 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  mn", 0);.    ret
1d630 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1d640 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
1d650 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
1d660 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1d670 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
1d680 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1d690 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
1d6a0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
1d6b0 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63  erp, objv[2], &c
1d6c0 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ol) ) return TCL
1d6d0 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 56 61 6c 20  _ERROR;..  rVal 
1d6e0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
1d6f0 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 63  _double(pStmt, c
1d700 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ol);.  Tcl_SetOb
1d710 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
1d720 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a  Tcl_NewDoubleObj
1d730 28 72 56 61 6c 29 29 3b 0a 20 20 72 65 74 75 72  (rVal));.  retur
1d740 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1d750 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1d760 33 5f 64 61 74 61 5f 63 6f 75 6e 74 20 53 54 4d  3_data_count STM
1d770 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T .**.** Return 
1d780 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
1d790 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62  lumns returned b
1d7a0 79 20 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d  y the sql statem
1d7b0 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61  ent STMT..*/.sta
1d7c0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 64 61 74  tic int test_dat
1d7d0 61 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64 20  a_count(.  void 
1d7e0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1d7f0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1d800 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1d810 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1d820 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
1d830 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1d840 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
1d850 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1d860 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1d870 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1d880 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
1d890 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1d8a0 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
1d8b0 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30   STMT column", 0
1d8c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1d8d0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1d8e0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
1d8f0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1d900 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1d910 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
1d920 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
1d930 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
1d940 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
1d950 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  ewIntObj(sqlite3
1d960 5f 64 61 74 61 5f 63 6f 75 6e 74 28 70 53 74 6d  _data_count(pStm
1d970 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  t)));.  return T
1d980 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1d990 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
1d9a0 6f 6c 75 6d 6e 5f 74 65 78 74 20 53 54 4d 54 20  olumn_text STMT 
1d9b0 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61  column.**.** Usa
1d9c0 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
1d9d0 6d 6e 5f 64 65 63 6c 74 79 70 65 20 53 54 4d 54  mn_decltype STMT
1d9e0 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73   column.**.** Us
1d9f0 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
1da00 75 6d 6e 5f 6e 61 6d 65 20 53 54 4d 54 20 63 6f  umn_name STMT co
1da10 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lumn.*/.static i
1da20 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66  nt test_stmt_utf
1da30 38 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  8(.  void * clie
1da40 6e 74 44 61 74 61 2c 20 20 20 20 20 20 20 20 2f  ntData,        /
1da50 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c  * Pointer to SQL
1da60 69 74 65 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  ite API function
1da70 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 20 2a 2f   to be invoke */
1da80 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1da90 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1daa0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1dab0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1dac0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1dad0 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a  tmt;.  int col;.
1dae0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 28 2a    const char *(*
1daf0 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 73  xFunc)(sqlite3_s
1db00 74 6d 74 2a 2c 20 69 6e 74 29 3b 0a 20 20 63 6f  tmt*, int);.  co
1db10 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a  nst char *zRet;.
1db20 0a 20 20 78 46 75 6e 63 20 3d 20 28 63 6f 6e 73  .  xFunc = (cons
1db30 74 20 63 68 61 72 20 2a 28 2a 29 28 73 71 6c 69  t char *(*)(sqli
1db40 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 29  te3_stmt*, int))
1db50 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 69 66  clientData;.  if
1db60 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
1db70 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1db80 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1db90 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1dba0 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1dbb0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1dbc0 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63  jv[0]), " STMT c
1dbd0 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20  olumn", 0);.    
1dbe0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1dbf0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
1dc00 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
1dc10 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1dc20 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
1dc30 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
1dc40 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
1dc50 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
1dc60 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
1dc70 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20   &col) ) return 
1dc80 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 52 65  TCL_ERROR;.  zRe
1dc90 74 20 3d 20 78 46 75 6e 63 28 70 53 74 6d 74 2c  t = xFunc(pStmt,
1dca0 20 63 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 52 65   col);.  if( zRe
1dcb0 74 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  t ){.    Tcl_Set
1dcc0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
1dcd0 63 68 61 72 20 2a 29 7a 52 65 74 2c 20 30 29 3b  char *)zRet, 0);
1dce0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
1dcf0 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  L_OK;.}..static 
1dd00 69 6e 74 20 74 65 73 74 5f 67 6c 6f 62 61 6c 5f  int test_global_
1dd10 72 65 63 6f 76 65 72 28 0a 20 20 76 6f 69 64 20  recover(.  void 
1dd20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1dd30 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1dd40 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1dd50 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1dd60 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64   objv[].){.#ifnd
1dd70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
1dd80 45 50 52 45 43 41 54 45 44 0a 20 20 69 6e 74 20  EPRECATED.  int 
1dd90 72 63 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  rc;.  if( objc!=
1dda0 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  1 ){.    Tcl_Wro
1ddb0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
1ddc0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a  , 1, objv, "");.
1ddd0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1dde0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  RROR;.  }.  rc =
1ddf0 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f   sqlite3_global_
1de00 72 65 63 6f 76 65 72 28 29 3b 0a 20 20 54 63 6c  recover();.  Tcl
1de10 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
1de20 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
1de30 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  orName(rc), TCL_
1de40 53 54 41 54 49 43 29 3b 0a 23 65 6e 64 69 66 0a  STATIC);.#endif.
1de50 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1de60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1de70 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1de80 74 65 78 74 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  text STMT column
1de90 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  .**.** Usage: sq
1dea0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63  lite3_column_dec
1deb0 6c 74 79 70 65 20 53 54 4d 54 20 63 6f 6c 75 6d  ltype STMT colum
1dec0 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  n.**.** Usage: s
1ded0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61  qlite3_column_na
1dee0 6d 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  me STMT column.*
1def0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1df00 74 5f 73 74 6d 74 5f 75 74 66 31 36 28 0a 20 20  t_stmt_utf16(.  
1df10 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1df20 61 2c 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  a,     /* Pointe
1df30 72 20 74 6f 20 53 51 4c 69 74 65 20 41 50 49 20  r to SQLite API 
1df40 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69  function to be i
1df50 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  nvoked */.  Tcl_
1df60 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1df70 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1df80 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1df90 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53  v[].){.#ifndef S
1dfa0 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
1dfb0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1dfc0 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f  *pStmt;.  int co
1dfd0 6c 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52  l;.  Tcl_Obj *pR
1dfe0 65 74 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  et;.  const void
1dff0 20 2a 7a 4e 61 6d 65 31 36 3b 0a 20 20 63 6f 6e   *zName16;.  con
1e000 73 74 20 76 6f 69 64 20 2a 28 2a 78 46 75 6e 63  st void *(*xFunc
1e010 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c  )(sqlite3_stmt*,
1e020 20 69 6e 74 29 3b 0a 0a 20 20 78 46 75 6e 63 20   int);..  xFunc 
1e030 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 28  = (const void *(
1e040 2a 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  *)(sqlite3_stmt*
1e050 2c 20 69 6e 74 29 29 63 6c 69 65 6e 74 44 61 74  , int))clientDat
1e060 61 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  a;.  if( objc!=3
1e070 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1e080 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1e090 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1e0a0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
1e0b0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1e0c0 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
1e0d0 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30   STMT column", 0
1e0e0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1e0f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1e100 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
1e110 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1e120 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1e130 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
1e140 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1e150 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
1e160 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
1e170 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20  bjv[2], &col) ) 
1e180 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1e190 3b 0a 0a 20 20 7a 4e 61 6d 65 31 36 20 3d 20 78  ;..  zName16 = x
1e1a0 46 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29  Func(pStmt, col)
1e1b0 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 31 36 20  ;.  if( zName16 
1e1c0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ){.    int n;.  
1e1d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
1e1e0 3d 20 7a 4e 61 6d 65 31 36 3b 0a 20 20 20 20 66  = zName16;.    f
1e1f0 6f 72 28 6e 3d 30 3b 20 7a 5b 6e 5d 20 7c 7c 20  or(n=0; z[n] || 
1e200 7a 5b 6e 2b 31 5d 3b 20 6e 2b 3d 32 29 7b 7d 0a  z[n+1]; n+=2){}.
1e210 20 20 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e      pRet = Tcl_N
1e220 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 7a  ewByteArrayObj(z
1e230 4e 61 6d 65 31 36 2c 20 6e 2b 32 29 3b 0a 20 20  Name16, n+2);.  
1e240 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
1e250 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29  lt(interp, pRet)
1e260 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
1e270 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
1e280 36 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20 54  6 */..  return T
1e290 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1e2a0 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
1e2b0 6f 6c 75 6d 6e 5f 69 6e 74 20 53 54 4d 54 20 63  olumn_int STMT c
1e2c0 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67  olumn.**.** Usag
1e2d0 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
1e2e0 6e 5f 62 79 74 65 73 20 53 54 4d 54 20 63 6f 6c  n_bytes STMT col
1e2f0 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a  umn.**.** Usage:
1e300 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1e310 62 79 74 65 73 31 36 20 53 54 4d 54 20 63 6f 6c  bytes16 STMT col
1e320 75 6d 6e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  umn.**.*/.static
1e330 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 69   int test_stmt_i
1e340 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  nt(.  void * cli
1e350 65 6e 74 44 61 74 61 2c 20 20 20 20 2f 2a 20 50  entData,    /* P
1e360 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c 69 74 65  ointer to SQLite
1e370 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f   API function to
1e380 20 62 65 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20   be invoked */. 
1e390 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1e3a0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1e3b0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1e3c0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
1e3d0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1e3e0 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20  t;.  int col;.  
1e3f0 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 73 71 6c  int (*xFunc)(sql
1e400 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29  ite3_stmt*, int)
1e410 3b 0a 0a 20 20 78 46 75 6e 63 20 3d 20 28 69 6e  ;..  xFunc = (in
1e420 74 20 28 2a 29 28 73 71 6c 69 74 65 33 5f 73 74  t (*)(sqlite3_st
1e430 6d 74 2a 2c 20 69 6e 74 29 29 63 6c 69 65 6e 74  mt*, int))client
1e440 44 61 74 61 3b 0a 20 20 69 66 28 20 6f 62 6a 63  Data;.  if( objc
1e450 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
1e460 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1e470 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1e480 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1e490 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1e4a0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1e4b0 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22  , " STMT column"
1e4c0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1e4d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1e4e0 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
1e4f0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1e500 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1e510 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
1e520 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1e530 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
1e540 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
1e550 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29  , objv[2], &col)
1e560 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1e570 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f  ROR;..  Tcl_SetO
1e580 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
1e590 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 78   Tcl_NewIntObj(x
1e5a0 46 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29  Func(pStmt, col)
1e5b0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
1e5c0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1e5d0 61 67 65 3a 20 20 73 71 6c 69 74 65 5f 73 65 74  age:  sqlite_set
1e5e0 5f 6d 61 67 69 63 20 20 44 42 20 20 4d 41 47 49  _magic  DB  MAGI
1e5f0 43 2d 4e 55 4d 42 45 52 0a 2a 2a 0a 2a 2a 20 53  C-NUMBER.**.** S
1e600 65 74 20 74 68 65 20 64 62 2d 3e 6d 61 67 69 63  et the db->magic
1e610 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20 69 73   value.  This is
1e620 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 65 72   used to test er
1e630 72 6f 72 20 72 65 63 6f 76 65 72 79 20 6c 6f 67  ror recovery log
1e640 69 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ic..*/.static in
1e650 74 20 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67  t sqlite_set_mag
1e660 69 63 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ic(.  void * cli
1e670 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1e680 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1e690 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61   int argc,.  cha
1e6a0 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71  r **argv.){.  sq
1e6b0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28  lite3 *db;.  if(
1e6c0 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
1e6d0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1e6e0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1e6f0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1e700 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
1e710 20 20 20 20 20 20 20 20 20 22 20 44 42 20 4d 41           " DB MA
1e720 47 49 43 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  GIC", 0);.    re
1e730 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1e740 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
1e750 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
1e760 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
1e770 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1e780 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72  .  if( strcmp(ar
1e790 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d  gv[2], "SQLITE_M
1e7a0 41 47 49 43 5f 4f 50 45 4e 22 29 3d 3d 30 20 29  AGIC_OPEN")==0 )
1e7b0 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20  {.    db->magic 
1e7c0 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f  = SQLITE_MAGIC_O
1e7d0 50 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  PEN;.  }else if(
1e7e0 20 73 74 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c   strcmp(argv[2],
1e7f0 20 22 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43   "SQLITE_MAGIC_C
1e800 4c 4f 53 45 44 22 29 3d 3d 30 20 29 7b 0a 20 20  LOSED")==0 ){.  
1e810 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
1e820 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45  LITE_MAGIC_CLOSE
1e830 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  D;.  }else if( s
1e840 74 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22  trcmp(argv[2], "
1e850 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53  SQLITE_MAGIC_BUS
1e860 59 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62  Y")==0 ){.    db
1e870 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
1e880 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20 20 7d  _MAGIC_BUSY;.  }
1e890 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
1e8a0 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45  argv[2], "SQLITE
1e8b0 5f 4d 41 47 49 43 5f 45 52 52 4f 52 22 29 3d 3d  _MAGIC_ERROR")==
1e8c0 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67  0 ){.    db->mag
1e8d0 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
1e8e0 43 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65  C_ERROR;.  }else
1e8f0 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28   if( Tcl_GetInt(
1e900 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c  interp, argv[2],
1e910 20 28 69 6e 74 2a 29 26 64 62 2d 3e 6d 61 67 69   (int*)&db->magi
1e920 63 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  c) ){.    return
1e930 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1e940 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1e950 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1e960 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72    sqlite3_interr
1e970 75 70 74 20 20 44 42 20 0a 2a 2a 0a 2a 2a 20 54  upt  DB .**.** T
1e980 72 69 67 67 65 72 20 61 6e 20 69 6e 74 65 72 72  rigger an interr
1e990 75 70 74 20 6f 6e 20 44 42 0a 2a 2f 0a 73 74 61  upt on DB.*/.sta
1e9a0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 69 6e 74  tic int test_int
1e9b0 65 72 72 75 70 74 28 0a 20 20 76 6f 69 64 20 2a  errupt(.  void *
1e9c0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1e9d0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1e9e0 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  p,.  int argc,. 
1e9f0 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a   char **argv.){.
1ea00 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1ea10 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a   if( argc!=2 ){.
1ea20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1ea30 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1ea40 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1ea50 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
1ea60 30 5d 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20  0], " DB", 0);. 
1ea70 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1ea80 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
1ea90 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
1eaa0 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
1eab0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1eac0 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f  RROR;.  sqlite3_
1ead0 69 6e 74 65 72 72 75 70 74 28 64 62 29 3b 0a 20  interrupt(db);. 
1eae0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1eaf0 7d 0a 0a 73 74 61 74 69 63 20 75 38 20 2a 73 71  }..static u8 *sq
1eb00 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62 61 73 65  lite3_stack_base
1eb10 6c 69 6e 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  line = 0;../*.**
1eb20 20 46 69 6c 6c 20 74 68 65 20 73 74 61 63 6b 20   Fill the stack 
1eb30 77 69 74 68 20 61 20 6b 6e 6f 77 6e 20 62 69 74  with a known bit
1eb40 70 61 74 74 65 72 6e 2e 0a 2a 2f 0a 73 74 61 74  pattern..*/.stat
1eb50 69 63 20 76 6f 69 64 20 70 72 65 70 53 74 61 63  ic void prepStac
1eb60 6b 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 69  k(void){.  int i
1eb70 3b 0a 20 20 75 33 32 20 62 69 67 42 75 66 5b 36  ;.  u32 bigBuf[6
1eb80 35 35 33 36 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  5536];.  for(i=0
1eb90 3b 20 69 3c 73 69 7a 65 6f 66 28 62 69 67 42 75  ; i<sizeof(bigBu
1eba0 66 29 2f 73 69 7a 65 6f 66 28 62 69 67 42 75 66  f)/sizeof(bigBuf
1ebb0 5b 30 5d 29 3b 20 69 2b 2b 29 20 62 69 67 42 75  [0]); i++) bigBu
1ebc0 66 5b 69 5d 20 3d 20 30 78 64 65 61 64 62 65 65  f[i] = 0xdeadbee
1ebd0 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 61  f;.  sqlite3_sta
1ebe0 63 6b 5f 62 61 73 65 6c 69 6e 65 20 3d 20 28 75  ck_baseline = (u
1ebf0 38 2a 29 26 62 69 67 42 75 66 5b 36 35 35 33 36  8*)&bigBuf[65536
1ec00 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  ];.}../*.** Get 
1ec10 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 63  the current stac
1ec20 6b 20 64 65 70 74 68 2e 20 20 55 73 65 64 20 66  k depth.  Used f
1ec30 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  or debugging onl
1ec40 79 2e 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65  y..*/.u64 sqlite
1ec50 33 53 74 61 63 6b 44 65 70 74 68 28 76 6f 69 64  3StackDepth(void
1ec60 29 7b 0a 20 20 75 38 20 78 3b 0a 20 20 72 65 74  ){.  u8 x;.  ret
1ec70 75 72 6e 20 28 75 36 34 29 28 73 71 6c 69 74 65  urn (u64)(sqlite
1ec80 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65  3_stack_baseline
1ec90 20 2d 20 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   - &x);.}../*.**
1eca0 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
1ecb0 5f 73 74 61 63 6b 5f 75 73 65 64 20 44 42 20 53  _stack_used DB S
1ecc0 51 4c 0a 2a 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  QL.**.** Try to 
1ecd0 6d 65 61 73 75 72 65 20 74 68 65 20 61 6d 6f 75  measure the amou
1ece0 6e 74 20 6f 66 20 73 74 61 63 6b 20 73 70 61 63  nt of stack spac
1ecf0 65 20 75 73 65 64 20 62 79 20 61 20 63 61 6c 6c  e used by a call
1ed00 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63   to sqlite3_exec
1ed10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1ed20 65 73 74 5f 73 74 61 63 6b 5f 75 73 65 64 28 0a  est_stack_used(.
1ed30 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1ed40 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1ed50 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1ed60 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a   argc,.  char **
1ed70 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65  argv.){.  sqlite
1ed80 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  3 *db;.  int i;.
1ed90 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
1eda0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1edb0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1edc0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1edd0 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
1ede0 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20  [0], .        " 
1edf0 44 42 20 53 51 4c 22 2c 20 30 29 3b 0a 20 20 20  DB SQL", 0);.   
1ee00 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1ee10 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
1ee20 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
1ee30 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
1ee40 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1ee50 4f 52 3b 0a 20 20 70 72 65 70 53 74 61 63 6b 28  OR;.  prepStack(
1ee60 29 3b 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74  );.  (void)sqlit
1ee70 65 33 5f 65 78 65 63 28 64 62 2c 20 61 72 67 76  e3_exec(db, argv
1ee80 5b 32 5d 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  [2], 0, 0, 0);. 
1ee90 20 66 6f 72 28 69 3d 36 35 35 33 35 3b 20 69 3e   for(i=65535; i>
1eea0 3d 30 20 26 26 20 28 28 75 33 32 2a 29 73 71 6c  =0 && ((u32*)sql
1eeb0 69 74 65 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c  ite3_stack_basel
1eec0 69 6e 65 29 5b 2d 69 5d 3d 3d 30 78 64 65 61 64  ine)[-i]==0xdead
1eed0 62 65 65 66 3b 20 69 2d 2d 29 7b 7d 0a 20 20 54  beef; i--){}.  T
1eee0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1eef0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
1ef00 6e 74 4f 62 6a 28 69 2a 34 29 29 3b 0a 20 20 72  ntObj(i*4));.  r
1ef10 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1ef20 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1ef30 6c 69 74 65 5f 64 65 6c 65 74 65 5f 66 75 6e 63  lite_delete_func
1ef40 74 69 6f 6e 20 44 42 20 66 75 6e 63 74 69 6f 6e  tion DB function
1ef50 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 44 65 6c 65  -name.**.** Dele
1ef60 74 65 20 74 68 65 20 75 73 65 72 20 66 75 6e 63  te the user func
1ef70 74 69 6f 6e 20 27 66 75 6e 63 74 69 6f 6e 2d 6e  tion 'function-n
1ef80 61 6d 65 27 20 66 72 6f 6d 20 64 61 74 61 62 61  ame' from databa
1ef90 73 65 20 68 61 6e 64 6c 65 20 44 42 2e 20 49 74  se handle DB. It
1efa0 0a 2a 2a 20 69 73 20 61 73 73 75 6d 65 64 20 74  .** is assumed t
1efb0 68 61 74 20 74 68 65 20 75 73 65 72 20 66 75 6e  hat the user fun
1efc0 63 74 69 6f 6e 20 77 61 73 20 63 72 65 61 74 65  ction was create
1efd0 64 20 61 73 20 55 54 46 38 2c 20 61 6e 79 20 6e  d as UTF8, any n
1efe0 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 61 72 67 75  umber of.** argu
1eff0 6d 65 6e 74 73 20 28 74 68 65 20 77 61 79 20 74  ments (the way t
1f000 68 65 20 54 43 4c 20 69 6e 74 65 72 66 61 63 65  he TCL interface
1f010 20 64 6f 65 73 20 69 74 29 2e 0a 2a 2f 0a 73 74   does it)..*/.st
1f020 61 74 69 63 20 69 6e 74 20 64 65 6c 65 74 65 5f  atic int delete_
1f030 66 75 6e 63 74 69 6f 6e 28 0a 20 20 76 6f 69 64  function(.  void
1f040 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1f050 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1f060 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  erp,.  int argc,
1f070 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29  .  char **argv.)
1f080 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
1f090 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28  lite3 *db;.  if(
1f0a0 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
1f0b0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1f0c0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1f0d0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1f0e0 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
1f0f0 0a 20 20 20 20 20 20 20 20 22 20 44 42 20 66 75  .        " DB fu
1f100 6e 63 74 69 6f 6e 2d 6e 61 6d 65 22 2c 20 30 29  nction-name", 0)
1f110 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1f120 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
1f130 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
1f140 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
1f150 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
1f160 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
1f170 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
1f180 75 6e 63 74 69 6f 6e 28 64 62 2c 20 61 72 67 76  unction(db, argv
1f190 5b 32 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  [2], -1, SQLITE_
1f1a0 55 54 46 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30  UTF8, 0, 0, 0, 0
1f1b0 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  );.  Tcl_SetResu
1f1c0 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
1f1d0 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
1f1e0 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  c), TCL_STATIC);
1f1f0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1f200 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1f210 3a 20 73 71 6c 69 74 65 5f 64 65 6c 65 74 65 5f  : sqlite_delete_
1f220 63 6f 6c 6c 61 74 69 6f 6e 20 44 42 20 63 6f 6c  collation DB col
1f230 6c 61 74 69 6f 6e 2d 6e 61 6d 65 0a 2a 2a 0a 2a  lation-name.**.*
1f240 2a 20 44 65 6c 65 74 65 20 74 68 65 20 63 6f 6c  * Delete the col
1f250 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1f260 27 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 61 6d 65 27  'collation-name'
1f270 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 68   from database h
1f280 61 6e 64 6c 65 20 0a 2a 2a 20 44 42 2e 20 49 74  andle .** DB. It
1f290 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
1f2a0 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
1f2b0 65 71 75 65 6e 63 65 20 77 61 73 20 63 72 65 61  equence was crea
1f2c0 74 65 64 20 61 73 20 55 54 46 38 20 28 74 68 65  ted as UTF8 (the
1f2d0 20 0a 2a 2a 20 77 61 79 20 74 68 65 20 54 43 4c   .** way the TCL
1f2e0 20 69 6e 74 65 72 66 61 63 65 20 64 6f 65 73 20   interface does 
1f2f0 69 74 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  it)..*/.static i
1f300 6e 74 20 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74  nt delete_collat
1f310 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ion(.  void * cl
1f320 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1f330 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1f340 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68    int argc,.  ch
1f350 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69  ar **argv.){.  i
1f360 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
1f370 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63   *db;.  if( argc
1f380 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
1f390 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1f3a0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1f3b0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1f3c0 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
1f3d0 20 20 20 20 22 20 44 42 20 66 75 6e 63 74 69 6f      " DB functio
1f3e0 6e 2d 6e 61 6d 65 22 2c 20 30 29 3b 0a 20 20 20  n-name", 0);.   
1f3f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1f400 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
1f410 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
1f420 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
1f430 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1f440 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
1f450 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
1f460 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c  ion(db, argv[2],
1f470 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
1f480 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65   0);.  Tcl_SetRe
1f490 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
1f4a0 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
1f4b0 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43  (rc), TCL_STATIC
1f4c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1f4d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1f4e0 67 65 3a 20 73 71 6c 69 74 65 33 5f 67 65 74 5f  ge: sqlite3_get_
1f4f0 61 75 74 6f 63 6f 6d 6d 69 74 20 44 42 0a 2a 2a  autocommit DB.**
1f500 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
1f510 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1f520 44 42 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  DB is currently 
1f530 69 6e 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 6d  in auto-commit m
1f540 6f 64 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66  ode..** Return f
1f550 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a  alse if not..*/.
1f560 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 5f 61  static int get_a
1f570 75 74 6f 63 6f 6d 6d 69 74 28 0a 20 20 76 6f 69  utocommit(.  voi
1f580 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1f590 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1f5a0 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63  terp,.  int argc
1f5b0 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a  ,.  char **argv.
1f5c0 29 7b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33  ){.  char zBuf[3
1f5d0 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  0];.  sqlite3 *d
1f5e0 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  b;.  if( argc!=2
1f5f0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1f600 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1f610 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1f620 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
1f630 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
1f640 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
1f650 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1f660 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
1f670 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
1f680 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
1f690 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1f6a0 52 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75  R;.  sprintf(zBu
1f6b0 66 2c 20 22 25 64 22 2c 20 73 71 6c 69 74 65 33  f, "%d", sqlite3
1f6c0 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28  _get_autocommit(
1f6d0 64 62 29 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  db));.  Tcl_Appe
1f6e0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1f6f0 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74   zBuf, 0);.  ret
1f700 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1f710 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1f720 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74  te3_busy_timeout
1f730 20 44 42 20 4d 53 0a 2a 2a 0a 2a 2a 20 53 65 74   DB MS.**.** Set
1f740 20 74 68 65 20 62 75 73 79 20 74 69 6d 65 6f 75   the busy timeou
1f750 74 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65  t.  This is more
1f760 20 65 61 73 69 6c 79 20 64 6f 6e 65 20 75 73 69   easily done usi
1f770 6e 67 20 74 68 65 20 74 69 6d 65 6f 75 74 0a 2a  ng the timeout.*
1f780 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  * method of the 
1f790 54 43 4c 20 69 6e 74 65 72 66 61 63 65 2e 20 20  TCL interface.  
1f7a0 42 75 74 20 77 65 20 6e 65 65 64 20 61 20 77 61  But we need a wa
1f7b0 79 20 74 6f 20 74 65 73 74 20 74 68 65 20 63 61  y to test the ca
1f7c0 73 65 0a 2a 2a 20 77 68 65 72 65 20 69 74 20 72  se.** where it r
1f7d0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4d 49  eturns SQLITE_MI
1f7e0 53 55 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  SUSE..*/.static 
1f7f0 69 6e 74 20 74 65 73 74 5f 62 75 73 79 5f 74 69  int test_busy_ti
1f800 6d 65 6f 75 74 28 0a 20 20 76 6f 69 64 20 2a 20  meout(.  void * 
1f810 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1f820 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1f830 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
1f840 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  char **argv.){. 
1f850 20 69 6e 74 20 72 63 2c 20 6d 73 3b 0a 20 20 73   int rc, ms;.  s
1f860 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66  qlite3 *db;.  if
1f870 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20  ( argc!=3 ){.   
1f880 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1f890 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1f8a0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1f8b0 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
1f8c0 20 0a 20 20 20 20 20 20 20 20 22 20 44 42 22 2c   .        " DB",
1f8d0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1f8e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1f8f0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
1f900 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
1f910 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
1f920 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
1f930 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74  ( Tcl_GetInt(int
1f940 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26 6d  erp, argv[2], &m
1f950 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  s) ) return TCL_
1f960 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
1f970 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f  lite3_busy_timeo
1f980 75 74 28 64 62 2c 20 6d 73 29 3b 0a 20 20 54 63  ut(db, ms);.  Tc
1f990 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1f9a0 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 54 65  nterp, sqlite3Te
1f9b0 73 74 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  stErrorName(rc),
1f9c0 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43   0);.  return TC
1f9d0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1f9e0 73 61 67 65 3a 20 20 74 63 6c 5f 76 61 72 69 61  sage:  tcl_varia
1f9f0 62 6c 65 5f 74 79 70 65 20 56 41 52 49 41 42 4c  ble_type VARIABL
1fa00 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ENAME.**.** Retu
1fa10 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  rn the name of t
1fa20 68 65 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 72  he internal repr
1fa30 65 73 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 74  esentation for t
1fa40 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74  he.** value of t
1fa50 68 65 20 67 69 76 65 6e 20 76 61 72 69 61 62 6c  he given variabl
1fa60 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1fa70 20 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79   tcl_variable_ty
1fa80 70 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  pe(.  void * cli
1fa90 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1faa0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1fab0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1fac0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1fad0 5b 5d 0a 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20  [].){.  Tcl_Obj 
1fae0 2a 70 56 61 72 3b 0a 20 20 69 66 28 20 6f 62 6a  *pVar;.  if( obj
1faf0 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1fb00 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
1fb10 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 56  erp, 1, objv, "V
1fb20 41 52 49 41 42 4c 45 22 29 3b 0a 20 20 20 20 72  ARIABLE");.    r
1fb30 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1fb40 0a 20 20 7d 0a 20 20 70 56 61 72 20 3d 20 54 63  .  }.  pVar = Tc
1fb50 6c 5f 47 65 74 56 61 72 32 45 78 28 69 6e 74 65  l_GetVar2Ex(inte
1fb60 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1fb70 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 30 2c 20 54  g(objv[1]), 0, T
1fb80 43 4c 5f 4c 45 41 56 45 5f 45 52 52 5f 4d 53 47  CL_LEAVE_ERR_MSG
1fb90 29 3b 0a 20 20 69 66 28 20 70 56 61 72 3d 3d 30  );.  if( pVar==0
1fba0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1fbb0 52 4f 52 3b 0a 20 20 69 66 28 20 70 56 61 72 2d  ROR;.  if( pVar-
1fbc0 3e 74 79 70 65 50 74 72 20 29 7b 0a 20 20 20 20  >typePtr ){.    
1fbd0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
1fbe0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
1fbf0 53 74 72 69 6e 67 4f 62 6a 28 70 56 61 72 2d 3e  StringObj(pVar->
1fc00 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65 2c 20 2d  typePtr->name, -
1fc10 31 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  1));.  }.  retur
1fc20 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1fc30 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
1fc40 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  e3_release_memor
1fc50 79 20 3f 4e 3f 0a 2a 2a 0a 2a 2a 20 41 74 74 65  y ?N?.**.** Atte
1fc60 6d 70 74 20 74 6f 20 72 65 6c 65 61 73 65 20 6d  mpt to release m
1fc70 65 6d 6f 72 79 20 63 75 72 72 65 6e 74 6c 79 20  emory currently 
1fc80 68 65 6c 64 20 62 75 74 20 6e 6f 74 20 61 63 74  held but not act
1fc90 75 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 0a  ually required..
1fca0 2a 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20 4e  ** The integer N
1fcb0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1fcc0 66 20 62 79 74 65 73 20 77 65 20 61 72 65 20 74  f bytes we are t
1fcd0 72 79 69 6e 67 20 74 6f 20 72 65 6c 65 61 73 65  rying to release
1fce0 2e 20 20 54 68 65 20 0a 2a 2a 20 72 65 74 75 72  .  The .** retur
1fcf0 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 61  n value is the a
1fd00 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20  mount of memory 
1fd10 61 63 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65  actually release
1fd20 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1fd30 20 74 65 73 74 5f 72 65 6c 65 61 73 65 5f 6d 65   test_release_me
1fd40 6d 6f 72 79 28 0a 20 20 76 6f 69 64 20 2a 20 63  mory(.  void * c
1fd50 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1fd60 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1fd70 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1fd80 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1fd90 6a 76 5b 5d 0a 29 7b 0a 23 69 66 20 64 65 66 69  jv[].){.#if defi
1fda0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
1fdb0 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
1fdc0 45 4e 54 29 20 26 26 20 21 64 65 66 69 6e 65 64  ENT) && !defined
1fdd0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
1fde0 4b 49 4f 29 0a 20 20 69 6e 74 20 4e 3b 0a 20 20  KIO).  int N;.  
1fdf0 69 6e 74 20 61 6d 74 3b 0a 20 20 69 66 28 20 6f  int amt;.  if( o
1fe00 62 6a 63 21 3d 31 20 26 26 20 6f 62 6a 63 21 3d  bjc!=1 && objc!=
1fe10 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
1fe20 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
1fe30 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 4e 3f 22  , 1, objv, "?N?"
1fe40 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1fe50 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1fe60 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20  f( objc==2 ){.  
1fe70 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1fe80 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1fe90 6f 62 6a 76 5b 31 5d 2c 20 26 4e 29 20 29 20 72  objv[1], &N) ) r
1fea0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1feb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4e 20  .  }else{.    N 
1fec0 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 61 6d 74 20  = -1;.  }.  amt 
1fed0 3d 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73  = sqlite3_releas
1fee0 65 5f 6d 65 6d 6f 72 79 28 4e 29 3b 0a 20 20 54  e_memory(N);.  T
1fef0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1ff00 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
1ff10 6e 74 4f 62 6a 28 61 6d 74 29 29 3b 0a 23 65 6e  ntObj(amt));.#en
1ff20 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  dif.  return TCL
1ff30 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55  _OK;.}.../*.** U
1ff40 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 64  sage:  sqlite3_d
1ff50 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  b_release_memory
1ff60 20 44 42 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70   DB.**.** Attemp
1ff70 74 20 74 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d  t to release mem
1ff80 6f 72 79 20 63 75 72 72 65 6e 74 6c 79 20 68 65  ory currently he
1ff90 6c 64 20 62 79 20 64 61 74 61 62 61 73 65 20 44  ld by database D
1ffa0 42 2e 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a  B.  Return the.*
1ffb0 2a 20 72 65 73 75 6c 74 20 63 6f 64 65 20 28 77  * result code (w
1ffc0 68 69 63 68 20 69 6e 20 74 68 65 20 63 75 72 72  hich in the curr
1ffd0 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ent implementati
1ffe0 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 7a 65 72  on is always zer
1fff0 6f 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  o)..*/.static in
20000 74 20 74 65 73 74 5f 64 62 5f 72 65 6c 65 61 73  t test_db_releas
20010 65 5f 6d 65 6d 6f 72 79 28 0a 20 20 76 6f 69 64  e_memory(.  void
20020 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
20030 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
20040 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
20050 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
20060 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
20070 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
20080 20 72 63 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21   rc;.  if( objc!
20090 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
200a0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
200b0 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22  p, 1, objv, "DB"
200c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
200d0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
200e0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
200f0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
20100 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
20110 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
20120 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
20130 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61  sqlite3_db_relea
20140 73 65 5f 6d 65 6d 6f 72 79 28 64 62 29 3b 0a 20  se_memory(db);. 
20150 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
20160 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
20170 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20  wIntObj(rc));.  
20180 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
20190 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
201a0 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e  sqlite3_db_filen
201b0 61 6d 65 20 44 42 20 44 42 4e 41 4d 45 0a 2a 2a  ame DB DBNAME.**
201c0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
201d0 61 6d 65 20 6f 66 20 61 20 66 69 6c 65 20 61 73  ame of a file as
201e0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
201f0 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
20200 74 69 63 20 69 6e 74 20 74 65 73 74 5f 64 62 5f  tic int test_db_
20210 66 69 6c 65 6e 61 6d 65 28 0a 20 20 76 6f 69 64  filename(.  void
20220 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
20230 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
20240 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
20250 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
20260 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
20270 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
20280 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
20290 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ;.  if( objc!=3 
202a0 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
202b0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
202c0 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44 42 4e  1, objv, "DB DBN
202d0 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72  AME");.    retur
202e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
202f0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
20300 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
20310 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
20320 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
20330 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
20340 44 62 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74  DbName = Tcl_Get
20350 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
20360 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
20370 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
20380 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28  te3_db_filename(
20390 64 62 2c 20 7a 44 62 4e 61 6d 65 29 2c 20 28 76  db, zDbName), (v
203a0 6f 69 64 2a 29 30 29 3b 0a 20 20 72 65 74 75 72  oid*)0);.  retur
203b0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
203c0 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
203d0 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 20 44  e3_db_readonly D
203e0 42 20 44 42 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52  B DBNAME.**.** R
203f0 65 74 75 72 6e 20 31 20 6f 72 20 30 20 69 66 20  eturn 1 or 0 if 
20400 44 42 4e 41 4d 45 20 69 73 20 72 65 61 64 6f 6e  DBNAME is readon
20410 6c 79 20 6f 72 20 6e 6f 74 2e 20 20 52 65 74 75  ly or not.  Retu
20420 72 6e 20 2d 31 20 69 66 20 44 42 4e 41 4d 45 20  rn -1 if DBNAME 
20430 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69 73  does.** not exis
20440 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20450 20 74 65 73 74 5f 64 62 5f 72 65 61 64 6f 6e 6c   test_db_readonl
20460 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  y(.  void * clie
20470 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
20480 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
20490 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
204a0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
204b0 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
204c0 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
204d0 20 2a 7a 44 62 4e 61 6d 65 3b 0a 20 20 69 66 28   *zDbName;.  if(
204e0 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
204f0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
20500 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
20510 2c 20 22 44 42 20 44 42 4e 41 4d 45 22 29 3b 0a  , "DB DBNAME");.
20520 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
20530 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
20540 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
20550 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
20560 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
20570 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
20580 52 52 4f 52 3b 0a 20 20 7a 44 62 4e 61 6d 65 20  RROR;.  zDbName 
20590 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
205a0 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f  objv[2]);.  Tcl_
205b0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
205c0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
205d0 62 6a 28 73 71 6c 69 74 65 33 5f 64 62 5f 72 65  bj(sqlite3_db_re
205e0 61 64 6f 6e 6c 79 28 64 62 2c 20 7a 44 62 4e 61  adonly(db, zDbNa
205f0 6d 65 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  me)));.  return 
20600 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
20610 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
20620 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74  _soft_heap_limit
20630 20 3f 4e 3f 0a 2a 2a 0a 2a 2a 20 51 75 65 72 79   ?N?.**.** Query
20640 20 6f 72 20 73 65 74 20 74 68 65 20 73 6f 66 74   or set the soft
20650 20 68 65 61 70 20 6c 69 6d 69 74 20 66 6f 72 20   heap limit for 
20660 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
20670 61 64 2e 20 20 54 68 65 0a 2a 2a 20 6c 69 6d 69  ad.  The.** limi
20680 74 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67 65  t is only change
20690 64 20 69 66 20 74 68 65 20 4e 20 69 73 20 70 72  d if the N is pr
206a0 65 73 65 6e 74 2e 20 20 54 68 65 20 70 72 65 76  esent.  The prev
206b0 69 6f 75 73 20 6c 69 6d 69 74 0a 2a 2a 20 69 73  ious limit.** is
206c0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
206d0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 6f  atic int test_so
206e0 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 28 0a 20  ft_heap_limit(. 
206f0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
20700 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
20710 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
20720 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
20730 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
20740 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
20750 20 61 6d 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f   amt;.  sqlite3_
20760 69 6e 74 36 34 20 4e 20 3d 20 2d 31 3b 0a 20 20  int64 N = -1;.  
20770 69 66 28 20 6f 62 6a 63 21 3d 31 20 26 26 20 6f  if( objc!=1 && o
20780 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
20790 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
207a0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
207b0 22 3f 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74 75  "?N?");.    retu
207c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
207d0 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20  }.  if( objc==2 
207e0 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  ){.    if( Tcl_G
207f0 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a  etWideIntFromObj
20800 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
20810 2c 20 26 4e 29 20 29 20 72 65 74 75 72 6e 20 54  , &N) ) return T
20820 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
20830 61 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f 73 6f  amt = sqlite3_so
20840 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34 28  ft_heap_limit64(
20850 4e 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  N);.  Tcl_SetObj
20860 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
20870 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
20880 28 61 6d 74 29 29 3b 0a 20 20 72 65 74 75 72 6e  (amt));.  return
20890 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
208a0 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
208b0 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75  e3_thread_cleanu
208c0 70 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65  p.**.** Call the
208d0 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f   sqlite3_thread_
208e0 63 6c 65 61 6e 75 70 20 41 50 49 2e 0a 2a 2f 0a  cleanup API..*/.
208f0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
20900 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28 0a  thread_cleanup(.
20910 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
20920 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
20930 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
20940 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
20950 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
20960 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
20970 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
20980 0a 20 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  .  sqlite3_threa
20990 64 5f 63 6c 65 61 6e 75 70 28 29 3b 0a 23 65 6e  d_cleanup();.#en
209a0 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  dif.  return TCL
209b0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
209c0 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 70  age:   sqlite3_p
209d0 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 20 20  ager_refcounts  
209e0 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  DB.**.** Return 
209f0 61 20 6c 69 73 74 20 6f 66 20 6e 75 6d 62 65 72  a list of number
20a00 73 20 77 68 69 63 68 20 61 72 65 20 74 68 65 20  s which are the 
20a10 50 61 67 65 72 52 65 66 63 6f 75 6e 74 20 66 6f  PagerRefcount fo
20a20 72 20 61 6c 6c 0a 2a 2a 20 70 61 67 65 72 73 20  r all.** pagers 
20a30 6f 6e 20 65 61 63 68 20 64 61 74 61 62 61 73 65  on each database
20a40 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
20a50 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
20a60 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 28  pager_refcounts(
20a70 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
20a80 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
20a90 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
20aa0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
20ab0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
20ac0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
20ad0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
20ae0 20 76 2c 20 2a 61 3b 0a 20 20 54 63 6c 5f 4f 62   v, *a;.  Tcl_Ob
20af0 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 0a 20 20 69  j *pResult;..  i
20b00 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
20b10 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
20b20 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
20b30 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
20b40 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
20b50 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
20b60 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
20b70 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20  ), " DB", 0);.  
20b80 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
20b90 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
20ba0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
20bb0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
20bc0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
20bd0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
20be0 4f 52 3b 0a 20 20 70 52 65 73 75 6c 74 20 3d 20  OR;.  pResult = 
20bf0 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20  Tcl_NewObj();.  
20c00 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
20c10 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Db; i++){.    if
20c20 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  ( db->aDb[i].pBt
20c30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20 3d  ==0 ){.      v =
20c40 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   -1;.    }else{.
20c50 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
20c60 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
20c70 74 65 78 29 3b 0a 20 20 20 20 20 20 61 20 3d 20  tex);.      a = 
20c80 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 61 74  sqlite3PagerStat
20c90 73 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  s(sqlite3BtreePa
20ca0 67 65 72 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  ger(db->aDb[i].p
20cb0 42 74 29 29 3b 0a 20 20 20 20 20 20 76 20 3d 20  Bt));.      v = 
20cc0 61 5b 30 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  a[0];.      sqli
20cd0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
20ce0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
20cf0 7d 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  }.    Tcl_ListOb
20d00 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
20d10 2c 20 70 52 65 73 75 6c 74 2c 20 54 63 6c 5f 4e  , pResult, Tcl_N
20d20 65 77 49 6e 74 4f 62 6a 28 76 29 29 3b 0a 20 20  ewIntObj(v));.  
20d30 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  }.  Tcl_SetObjRe
20d40 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65  sult(interp, pRe
20d50 73 75 6c 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  sult);.  return 
20d60 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TCL_OK;.}.../*.*
20d70 2a 20 74 63 6c 63 6d 64 3a 20 20 20 77 6f 72 6b  * tclcmd:   work
20d80 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 0a 2a 2a  ing_64bit_int.**
20d90 0a 2a 2a 20 53 6f 6d 65 20 54 43 4c 20 62 75 69  .** Some TCL bui
20da0 6c 64 73 20 28 65 78 3a 20 63 79 67 77 69 6e 29  lds (ex: cygwin)
20db0 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20   do not support 
20dc0 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 73 2e  64-bit integers.
20dd0 20 20 54 68 69 73 0a 2a 2a 20 6c 65 61 64 73 20    This.** leads 
20de0 74 6f 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 74  to a number of t
20df0 65 73 74 20 66 61 69 6c 75 72 65 73 2e 20 20 54  est failures.  T
20e00 68 65 20 70 72 65 73 65 6e 74 20 63 6f 6d 6d 61  he present comma
20e10 6e 64 20 63 68 65 63 6b 73 20 74 68 65 0a 2a 2a  nd checks the.**
20e20 20 54 43 4c 20 62 75 69 6c 64 20 74 6f 20 73 65   TCL build to se
20e30 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
20e40 20 69 74 20 73 75 70 70 6f 72 74 73 20 36 34 2d   it supports 64-
20e50 62 69 74 20 69 6e 74 65 67 65 72 73 2e 20 20 49  bit integers.  I
20e60 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 54 52 55  t.** returns TRU
20e70 45 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64  E if it does and
20e80 20 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 0a 2a   FALSE if not..*
20e90 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e  *.** This comman
20ea0 64 20 69 73 20 75 73 65 64 20 74 6f 20 77 61 72  d is used to war
20eb0 6e 20 75 73 65 72 73 20 74 68 61 74 20 74 68 65  n users that the
20ec0 69 72 20 54 43 4c 20 62 75 69 6c 64 20 69 73 20  ir TCL build is 
20ed0 64 65 66 65 63 74 69 76 65 0a 2a 2a 20 61 6e 64  defective.** and
20ee0 20 74 68 61 74 20 74 68 65 20 65 72 72 6f 72 73   that the errors
20ef0 20 74 68 65 79 20 61 72 65 20 73 65 65 69 6e 67   they are seeing
20f00 20 69 6e 20 74 68 65 20 74 65 73 74 20 73 63 72   in the test scr
20f10 69 70 74 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a  ipts might be.**
20f20 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
20f30 69 72 20 64 65 66 65 63 74 69 76 65 20 54 43 4c  ir defective TCL
20f40 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 72 6f   rather than pro
20f50 62 6c 65 6d 73 20 69 6e 20 53 51 4c 69 74 65 2e  blems in SQLite.
20f60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
20f70 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74  orking_64bit_int
20f80 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
20f90 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
20fa0 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
20fb0 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
20fc0 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
20fd0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
20fe0 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
20ff0 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
21000 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
21010 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
21020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21030 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
21040 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
21050 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
21060 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
21070 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63  ments */.){.  Tc
21080 6c 5f 4f 62 6a 20 2a 70 54 65 73 74 4f 62 6a 3b  l_Obj *pTestObj;
21090 0a 20 20 69 6e 74 20 77 6f 72 6b 69 6e 67 20 3d  .  int working =
210a0 20 30 3b 0a 0a 20 20 70 54 65 73 74 4f 62 6a 20   0;..  pTestObj 
210b0 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  = Tcl_NewWideInt
210c0 4f 62 6a 28 31 30 30 30 30 30 30 2a 28 69 36 34  Obj(1000000*(i64
210d0 29 31 32 33 34 35 36 37 38 39 30 29 3b 0a 20 20  )1234567890);.  
210e0 77 6f 72 6b 69 6e 67 20 3d 20 73 74 72 63 6d 70  working = strcmp
210f0 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70  (Tcl_GetString(p
21100 54 65 73 74 4f 62 6a 29 2c 20 22 31 32 33 34 35  TestObj), "12345
21110 36 37 38 39 30 30 30 30 30 30 30 22 29 3d 3d 30  67890000000")==0
21120 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
21130 6f 75 6e 74 28 70 54 65 73 74 4f 62 6a 29 3b 0a  ount(pTestObj);.
21140 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
21150 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
21160 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 77 6f 72  ewBooleanObj(wor
21170 6b 69 6e 67 29 29 3b 0a 20 20 72 65 74 75 72 6e  king));.  return
21180 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
21190 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76 66 73  ** tclcmd:   vfs
211a0 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74 0a 2a 2a 0a  _unlink_test.**.
211b0 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d  ** This TCL comm
211c0 61 6e 64 20 75 6e 72 65 67 69 73 74 65 72 73 20  and unregisters 
211d0 74 68 65 20 70 72 69 6d 61 72 79 20 56 46 53 20  the primary VFS 
211e0 61 6e 64 20 74 68 65 6e 20 72 65 67 69 73 74 65  and then registe
211f0 72 73 0a 2a 2a 20 69 74 20 62 61 63 6b 20 61 67  rs.** it back ag
21200 61 69 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73  ain.  This is us
21210 65 64 20 74 6f 20 74 65 73 74 20 74 68 65 20 61  ed to test the a
21220 62 69 6c 69 74 79 20 74 6f 20 72 65 67 69 73 74  bility to regist
21230 65 72 20 61 0a 2a 2a 20 56 46 53 20 77 68 65 6e  er a.** VFS when
21240 20 6e 6f 6e 65 20 61 72 65 20 70 72 65 76 69 6f   none are previo
21250 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 2c  usly registered,
21260 20 61 6e 64 20 74 68 65 20 61 62 69 6c 69 74 79   and the ability
21270 20 74 6f 20 0a 2a 2a 20 75 6e 72 65 67 69 73 74   to .** unregist
21280 65 72 20 74 68 65 20 6f 6e 6c 79 20 61 76 61 69  er the only avai
21290 6c 61 62 6c 65 20 56 46 53 2e 20 20 54 69 63 6b  lable VFS.  Tick
212a0 65 74 20 23 32 37 33 38 0a 2a 2f 0a 73 74 61 74  et #2738.*/.stat
212b0 69 63 20 69 6e 74 20 76 66 73 5f 75 6e 6c 69 6e  ic int vfs_unlin
212c0 6b 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74  k_test(.  Client
212d0 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
212e0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
212f0 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
21300 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
21310 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
21320 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
21330 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
21340 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
21350 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
21360 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
21370 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
21380 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
21390 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
213a0 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
213b0 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
213c0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c  {.  int i;.  sql
213d0 69 74 65 33 5f 76 66 73 20 2a 70 4d 61 69 6e 3b  ite3_vfs *pMain;
213e0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
213f0 61 70 56 66 73 5b 32 30 5d 3b 0a 20 20 73 71 6c  apVfs[20];.  sql
21400 69 74 65 33 5f 76 66 73 20 6f 6e 65 2c 20 74 77  ite3_vfs one, tw
21410 6f 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  o;..  sqlite3_vf
21420 73 5f 75 6e 72 65 67 69 73 74 65 72 28 30 29 3b  s_unregister(0);
21430 20 20 20 2f 2a 20 55 6e 72 65 67 69 73 74 65 72     /* Unregister
21440 20 6f 66 20 4e 55 4c 4c 20 69 73 20 68 61 72 6d   of NULL is harm
21450 6c 65 73 73 20 2a 2f 0a 20 20 6f 6e 65 2e 7a 4e  less */.  one.zN
21460 61 6d 65 20 3d 20 22 5f 5f 6f 6e 65 22 3b 0a 20  ame = "__one";. 
21470 20 74 77 6f 2e 7a 4e 61 6d 65 20 3d 20 22 5f 5f   two.zName = "__
21480 74 77 6f 22 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c  two";..  /* Call
21490 69 6e 67 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  ing sqlite3_vfs_
214a0 72 65 67 69 73 74 65 72 20 77 69 74 68 20 32 6e  register with 2n
214b0 64 20 61 72 67 75 6d 65 6e 74 20 6f 66 20 30 20  d argument of 0 
214c0 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 63 68  does not.  ** ch
214d0 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c 74  ange the default
214e0 20 56 46 53 0a 20 20 2a 2f 0a 20 20 70 4d 61 69   VFS.  */.  pMai
214f0 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  n = sqlite3_vfs_
21500 66 69 6e 64 28 30 29 3b 0a 20 20 73 71 6c 69 74  find(0);.  sqlit
21510 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
21520 26 6f 6e 65 2c 20 30 29 3b 0a 20 20 61 73 73 65  &one, 0);.  asse
21530 72 74 28 20 70 4d 61 69 6e 3d 3d 30 20 7c 7c 20  rt( pMain==0 || 
21540 70 4d 61 69 6e 3d 3d 73 71 6c 69 74 65 33 5f 76  pMain==sqlite3_v
21550 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20 20  fs_find(0) );.  
21560 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
21570 73 74 65 72 28 26 74 77 6f 2c 20 30 29 3b 0a 20  ster(&two, 0);. 
21580 20 61 73 73 65 72 74 28 20 70 4d 61 69 6e 3d 3d   assert( pMain==
21590 30 20 7c 7c 20 70 4d 61 69 6e 3d 3d 73 71 6c 69  0 || pMain==sqli
215a0 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20  te3_vfs_find(0) 
215b0 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 63 61 6e 20  );..  /* We can 
215c0 66 69 6e 64 20 61 20 56 46 53 20 62 79 20 69 74  find a VFS by it
215d0 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 73 73 65  s name */.  asse
215e0 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
215f0 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26  find("__one")==&
21600 6f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  one );.  assert(
21610 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
21620 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f  d("__two")==&two
21630 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c 69 6e   );..  /* Callin
21640 67 20 73 71 6c 69 74 65 5f 76 66 73 5f 72 65 67  g sqlite_vfs_reg
21650 69 73 74 65 72 20 77 69 74 68 20 6e 6f 6e 2d 7a  ister with non-z
21660 65 72 6f 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  ero second param
21670 65 74 65 72 20 63 68 61 6e 67 65 73 20 74 68 65  eter changes the
21680 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 56 46  .  ** default VF
21690 53 2c 20 65 76 65 6e 20 69 66 20 74 68 65 20 31  S, even if the 1
216a0 73 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  st parameter is 
216b0 61 6e 20 65 78 69 73 74 69 67 20 56 46 53 20 74  an existig VFS t
216c0 68 61 74 20 69 73 0a 20 20 2a 2a 20 70 72 65 76  hat is.  ** prev
216d0 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65  iously registere
216e0 64 20 61 73 20 74 68 65 20 6e 6f 6e 2d 64 65 66  d as the non-def
216f0 61 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ault..  */.  sql
21700 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
21710 72 28 26 6f 6e 65 2c 20 31 29 3b 0a 20 20 61 73  r(&one, 1);.  as
21720 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66  sert( sqlite3_vf
21730 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d  s_find("__one")=
21740 3d 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72  =&one );.  asser
21750 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
21760 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74  ind("__two")==&t
21770 77 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  wo );.  assert( 
21780 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
21790 28 30 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 73  (0)==&one );.  s
217a0 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
217b0 74 65 72 28 26 74 77 6f 2c 20 31 29 3b 0a 20 20  ter(&two, 1);.  
217c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
217d0 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22  vfs_find("__one"
217e0 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73  )==&one );.  ass
217f0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
21800 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d  _find("__two")==
21810 26 74 77 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  &two );.  assert
21820 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
21830 6e 64 28 30 29 3d 3d 26 74 77 6f 20 29 3b 0a 20  nd(0)==&two );. 
21840 20 69 66 28 20 70 4d 61 69 6e 20 29 7b 0a 20 20   if( pMain ){.  
21850 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65    sqlite3_vfs_re
21860 67 69 73 74 65 72 28 70 4d 61 69 6e 2c 20 31 29  gister(pMain, 1)
21870 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
21880 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22  lite3_vfs_find("
21890 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20 29 3b  __one")==&one );
218a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
218b0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f  ite3_vfs_find("_
218c0 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b 0a  _two")==&two );.
218d0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
218e0 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d  te3_vfs_find(0)=
218f0 3d 70 4d 61 69 6e 20 29 3b 0a 20 20 7d 0a 20 20  =pMain );.  }.  
21900 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65  .  /* Unlink the
21910 20 64 65 66 61 75 6c 74 20 56 46 53 2e 20 20 52   default VFS.  R
21920 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65 72  epeat until ther
21930 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 56 46  e are no more VF
21940 53 65 73 0a 20 20 2a 2a 20 72 65 67 69 73 74 65  Ses.  ** registe
21950 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  red..  */.  for(
21960 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 70  i=0; i<sizeof(ap
21970 56 66 73 29 2f 73 69 7a 65 6f 66 28 61 70 56 66  Vfs)/sizeof(apVf
21980 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  s[0]); i++){.   
21990 20 61 70 56 66 73 5b 69 5d 20 3d 20 73 71 6c 69   apVfs[i] = sqli
219a0 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b  te3_vfs_find(0);
219b0 0a 20 20 20 20 69 66 28 20 61 70 56 66 73 5b 69  .    if( apVfs[i
219c0 5d 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ] ){.      asser
219d0 74 28 20 61 70 56 66 73 5b 69 5d 3d 3d 73 71 6c  t( apVfs[i]==sql
219e0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 61 70  ite3_vfs_find(ap
219f0 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29  Vfs[i]->zName) )
21a00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
21a10 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 61  vfs_unregister(a
21a20 70 56 66 73 5b 69 5d 29 3b 0a 20 20 20 20 20 20  pVfs[i]);.      
21a30 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74  assert( 0==sqlit
21a40 65 33 5f 76 66 73 5f 66 69 6e 64 28 61 70 56 66  e3_vfs_find(apVf
21a50 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a  s[i]->zName) );.
21a60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
21a70 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 76  rt( 0==sqlite3_v
21a80 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20 20  fs_find(0) );.  
21a90 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74  .  /* Register t
21aa0 68 65 20 6d 61 69 6e 20 56 46 53 20 61 73 20 6e  he main VFS as n
21ab0 6f 6e 2d 64 65 66 61 75 6c 74 20 28 77 69 6c 6c  on-default (will
21ac0 20 62 65 20 6d 61 64 65 20 64 65 66 61 75 6c 74   be made default
21ad0 2c 20 73 69 6e 63 65 0a 20 20 2a 2a 20 69 74 27  , since.  ** it'
21ae0 6c 6c 20 62 65 20 74 68 65 20 6f 6e 6c 79 20 6f  ll be the only o
21af0 6e 65 20 69 6e 20 65 78 69 73 74 65 6e 63 65 29  ne in existence)
21b00 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
21b10 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 70 4d  _vfs_register(pM
21b20 61 69 6e 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  ain, 0);.  asser
21b30 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
21b40 69 6e 64 28 30 29 3d 3d 70 4d 61 69 6e 20 29 3b  ind(0)==pMain );
21b50 0a 20 20 0a 20 20 2f 2a 20 55 6e 2d 72 65 67 69  .  .  /* Un-regi
21b60 73 74 65 72 20 74 68 65 20 6d 61 69 6e 20 56 46  ster the main VF
21b70 53 20 61 67 61 69 6e 20 74 6f 20 72 65 73 74 6f  S again to resto
21b80 72 65 20 61 6e 20 65 6d 70 74 79 20 56 46 53 20  re an empty VFS 
21b90 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  list */.  sqlite
21ba0 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72  3_vfs_unregister
21bb0 28 70 4d 61 69 6e 29 3b 0a 20 20 61 73 73 65 72  (pMain);.  asser
21bc0 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 76 66  t( 0==sqlite3_vf
21bd0 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 0a 20 20  s_find(0) );..  
21be0 2f 2a 20 52 65 6c 69 6e 6b 20 61 6c 6c 20 56 46  /* Relink all VF
21bf0 53 65 73 20 69 6e 20 72 65 76 65 72 73 65 20 6f  Ses in reverse o
21c00 72 64 65 72 2e 20 2a 2f 20 20 0a 20 20 66 6f 72  rder. */  .  for
21c10 28 69 3d 73 69 7a 65 6f 66 28 61 70 56 66 73 29  (i=sizeof(apVfs)
21c20 2f 73 69 7a 65 6f 66 28 61 70 56 66 73 5b 30 5d  /sizeof(apVfs[0]
21c30 29 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  )-1; i>=0; i--){
21c40 0a 20 20 20 20 69 66 28 20 61 70 56 66 73 5b 69  .    if( apVfs[i
21c50 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ] ){.      sqlit
21c60 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
21c70 61 70 56 66 73 5b 69 5d 2c 20 31 29 3b 0a 20 20  apVfs[i], 1);.  
21c80 20 20 20 20 61 73 73 65 72 74 28 20 61 70 56 66      assert( apVf
21c90 73 5b 69 5d 3d 3d 73 71 6c 69 74 65 33 5f 76 66  s[i]==sqlite3_vf
21ca0 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20 20 20  s_find(0) );.   
21cb0 20 20 20 61 73 73 65 72 74 28 20 61 70 56 66 73     assert( apVfs
21cc0 5b 69 5d 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73  [i]==sqlite3_vfs
21cd0 5f 66 69 6e 64 28 61 70 56 66 73 5b 69 5d 2d 3e  _find(apVfs[i]->
21ce0 7a 4e 61 6d 65 29 20 29 3b 0a 20 20 20 20 7d 0a  zName) );.    }.
21cf0 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 72 65 67 69    }..  /* Unregi
21d00 73 74 65 72 20 6f 75 74 20 73 61 6d 70 6c 65 20  ster out sample 
21d10 56 46 53 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69  VFSes. */.  sqli
21d20 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74  te3_vfs_unregist
21d30 65 72 28 26 6f 6e 65 29 3b 0a 20 20 73 71 6c 69  er(&one);.  sqli
21d40 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74  te3_vfs_unregist
21d50 65 72 28 26 74 77 6f 29 3b 0a 0a 20 20 2f 2a 20  er(&two);..  /* 
21d60 55 6e 72 65 67 69 73 74 65 72 69 6e 67 20 61 20  Unregistering a 
21d70 56 46 53 20 74 68 61 74 20 69 73 20 6e 6f 74 20  VFS that is not 
21d80 63 75 72 72 65 6e 74 6c 79 20 72 65 67 69 73 74  currently regist
21d90 65 72 65 64 20 69 73 20 68 61 72 6d 6c 65 73 73  ered is harmless
21da0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   */.  sqlite3_vf
21db0 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26 6f 6e  s_unregister(&on
21dc0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  e);.  sqlite3_vf
21dd0 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26 74 77  s_unregister(&tw
21de0 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  o);.  assert( sq
21df0 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22  lite3_vfs_find("
21e00 5f 5f 6f 6e 65 22 29 3d 3d 30 20 29 3b 0a 20 20  __one")==0 );.  
21e10 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
21e20 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22  vfs_find("__two"
21e30 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 65  )==0 );..  /* We
21e40 20 73 68 6f 75 6c 64 20 62 65 20 6c 65 66 74 20   should be left 
21e50 77 69 74 68 20 74 68 65 20 6f 72 69 67 69 6e 61  with the origina
21e60 6c 20 64 65 66 61 75 6c 74 20 56 46 53 20 62 61  l default VFS ba
21e70 63 6b 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 6f  ck as the.  ** o
21e80 72 69 67 69 6e 61 6c 20 2a 2f 0a 20 20 61 73 73  riginal */.  ass
21e90 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
21ea0 5f 66 69 6e 64 28 30 29 3d 3d 70 4d 61 69 6e 20  _find(0)==pMain 
21eb0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  );..  return TCL
21ec0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63  _OK;.}../*.** tc
21ed0 6c 63 6d 64 3a 20 20 20 76 66 73 5f 69 6e 69 74  lcmd:   vfs_init
21ee0 66 61 69 6c 5f 74 65 73 74 0a 2a 2a 0a 2a 2a 20  fail_test.**.** 
21ef0 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  This TCL command
21f00 20 61 74 74 65 6d 70 74 73 20 74 6f 20 76 66 73   attempts to vfs
21f10 5f 66 69 6e 64 20 61 6e 64 20 76 66 73 5f 72 65  _find and vfs_re
21f20 67 69 73 74 65 72 20 77 68 65 6e 20 74 68 65 0a  gister when the.
21f30 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69  ** sqlite3_initi
21f40 61 6c 69 7a 65 28 29 20 69 6e 74 65 72 66 61 63  alize() interfac
21f50 65 20 69 73 20 66 61 69 6c 69 6e 67 2e 20 20 41  e is failing.  A
21f60 6c 6c 20 63 61 6c 6c 73 20 73 68 6f 75 6c 64 20  ll calls should 
21f70 66 61 69 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  fail..*/.static 
21f80 69 6e 74 20 76 66 73 5f 69 6e 69 74 66 61 69 6c  int vfs_initfail
21f90 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44  _test(.  ClientD
21fa0 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
21fb0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
21fc0 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
21fd0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
21fe0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
21ff0 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
22000 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
22010 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
22020 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
22030 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
22040 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
22050 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
22060 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
22070 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
22080 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
22090 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f  .  sqlite3_vfs o
220a0 6e 65 3b 0a 20 20 6f 6e 65 2e 7a 4e 61 6d 65 20  ne;.  one.zName 
220b0 3d 20 22 5f 5f 6f 6e 65 22 3b 0a 0a 20 20 69 66  = "__one";..  if
220c0 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
220d0 6e 64 28 30 29 20 29 20 72 65 74 75 72 6e 20 54  nd(0) ) return T
220e0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69  CL_ERROR;.  sqli
220f0 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
22100 28 26 6f 6e 65 2c 20 30 29 3b 0a 20 20 69 66 28  (&one, 0);.  if(
22110 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
22120 64 28 30 29 20 29 20 72 65 74 75 72 6e 20 54 43  d(0) ) return TC
22130 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74  L_ERROR;.  sqlit
22140 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
22150 26 6f 6e 65 2c 20 31 29 3b 0a 20 20 69 66 28 20  &one, 1);.  if( 
22160 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
22170 28 30 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  (0) ) return TCL
22180 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e  _ERROR;.  return
22190 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
221a0 2a 20 53 61 76 65 64 20 56 46 53 65 73 0a 2a 2f  * Saved VFSes.*/
221b0 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
221c0 76 66 73 20 2a 61 70 56 66 73 5b 32 30 5d 3b 0a  vfs *apVfs[20];.
221d0 73 74 61 74 69 63 20 69 6e 74 20 6e 56 66 73 20  static int nVfs 
221e0 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  = 0;../*.** tclc
221f0 6d 64 3a 20 20 20 76 66 73 5f 75 6e 72 65 67 69  md:   vfs_unregi
22200 73 74 65 72 5f 61 6c 6c 0a 2a 2a 0a 2a 2a 20 55  ster_all.**.** U
22210 6e 72 65 67 69 73 74 65 72 20 61 6c 6c 20 56 46  nregister all VF
22220 53 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Ses..*/.static i
22230 6e 74 20 76 66 73 5f 75 6e 72 65 67 69 73 74 65  nt vfs_unregiste
22240 72 5f 61 6c 6c 28 0a 20 20 43 6c 69 65 6e 74 44  r_all(.  ClientD
22250 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
22260 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
22270 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
22280 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
22290 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
222a0 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
222b0 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
222c0 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
222d0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
222e0 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
222f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
22300 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
22310 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
22320 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
22330 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
22340 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
22350 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
22360 28 61 70 56 66 73 29 3b 20 69 2b 2b 29 7b 0a 20  (apVfs); i++){. 
22370 20 20 20 61 70 56 66 73 5b 69 5d 20 3d 20 73 71     apVfs[i] = sq
22380 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
22390 29 3b 0a 20 20 20 20 69 66 28 20 61 70 56 66 73  );.    if( apVfs
223a0 5b 69 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  [i]==0 ) break;.
223b0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f      sqlite3_vfs_
223c0 75 6e 72 65 67 69 73 74 65 72 28 61 70 56 66 73  unregister(apVfs
223d0 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 6e 56 66 73  [i]);.  }.  nVfs
223e0 20 3d 20 69 3b 0a 20 20 72 65 74 75 72 6e 20 54   = i;.  return T
223f0 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74  CL_OK;.}./*.** t
22400 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f 72 65 72  clcmd:   vfs_rer
22410 65 67 69 73 74 65 72 5f 61 6c 6c 0a 2a 2a 0a 2a  egister_all.**.*
22420 2a 20 52 65 73 74 6f 72 65 20 61 6c 6c 20 56 46  * Restore all VF
22430 53 65 73 20 74 68 61 74 20 77 65 72 65 20 72 65  Ses that were re
22440 6d 6f 76 65 64 20 75 73 69 6e 67 20 76 66 73 5f  moved using vfs_
22450 75 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c 0a 2a  unregister_all.*
22460 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73  /.static int vfs
22470 5f 72 65 72 65 67 69 73 74 65 72 5f 61 6c 6c 28  _reregister_all(
22480 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
22490 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
224a0 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
224b0 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
224c0 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
224d0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
224e0 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
224f0 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
22500 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
22510 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
22520 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22530 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
22540 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
22550 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
22560 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
22570 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ents */.){.  int
22580 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
22590 3c 6e 56 66 73 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nVfs; i++){.   
225a0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
225b0 69 73 74 65 72 28 61 70 56 66 73 5b 69 5d 2c 20  ister(apVfs[i], 
225c0 69 3d 3d 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  i==0);.  }.  ret
225d0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
225e0 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
225f0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73  file_control_tes
22600 74 20 44 42 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  t DB.**.** This 
22610 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73  TCL command runs
22620 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
22630 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66  e_control interf
22640 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66  ace and.** verif
22650 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72  ies correct oper
22660 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d  ation of the sam
22670 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
22680 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65   file_control_te
22690 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  st(.  ClientData
226a0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
226b0 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
226c0 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
226d0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
226e0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
226f0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
22700 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
22710 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
22720 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
22730 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
22740 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
22750 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
22760 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
22770 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
22780 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
22790 69 6e 74 20 69 41 72 67 20 3d 20 30 3b 0a 20 20  int iArg = 0;.  
227a0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
227b0 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
227c0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
227d0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
227e0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
227f0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
22800 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
22810 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
22820 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
22830 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
22840 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
22850 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
22860 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
22870 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
22880 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
22890 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
228a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
228b0 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 30  le_control(db, 0
228c0 2c 20 30 2c 20 26 69 41 72 67 29 3b 0a 20 20 61  , 0, &iArg);.  a
228d0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
228e0 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 3b 0a 20 20  E_NOTFOUND );.  
228f0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
22900 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6e  e_control(db, "n
22910 6f 74 61 64 61 74 61 62 61 73 65 22 2c 20 53 51  otadatabase", SQ
22920 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53  LITE_FCNTL_LOCKS
22930 54 41 54 45 2c 20 26 69 41 72 67 29 3b 0a 20 20  TATE, &iArg);.  
22940 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
22950 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 72 63  TE_ERROR );.  rc
22960 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
22970 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6d 61 69  control(db, "mai
22980 6e 22 2c 20 2d 31 2c 20 26 69 41 72 67 29 3b 0a  n", -1, &iArg);.
22990 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
229a0 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 3b  LITE_NOTFOUND );
229b0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
229c0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
229d0 20 22 74 65 6d 70 22 2c 20 2d 31 2c 20 26 69 41   "temp", -1, &iA
229e0 72 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  rg);.  assert( r
229f0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  c==SQLITE_NOTFOU
22a00 4e 44 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  ND || rc==SQLITE
22a10 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20 72 65 74  _ERROR );..  ret
22a20 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
22a30 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
22a40 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73  file_control_las
22a50 74 65 72 72 6e 6f 5f 74 65 73 74 20 44 42 0a 2a  terrno_test DB.*
22a60 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f  *.** This TCL co
22a70 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73  mmand runs the s
22a80 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
22a90 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 61 6e  rol interface an
22aa0 64 0a 2a 2a 20 76 65 72 69 66 69 65 73 20 63 6f  d.** verifies co
22ab0 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20  rrect operation 
22ac0 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 41  of the SQLITE_LA
22ad0 53 54 5f 45 52 52 4e 4f 20 76 65 72 62 2e 0a 2a  ST_ERRNO verb..*
22ae0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
22af0 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72  e_control_laster
22b00 72 6e 6f 5f 74 65 73 74 28 0a 20 20 43 6c 69 65  rno_test(.  Clie
22b10 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
22b20 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
22b30 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
22b40 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
22b50 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
22b60 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
22b70 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
22b80 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
22b90 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
22ba0 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
22bb0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
22bc0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
22bd0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
22be0 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
22bf0 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
22c00 0a 29 7b 0a 20 20 69 6e 74 20 69 41 72 67 20 3d  .){.  int iArg =
22c10 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   0;.  sqlite3 *d
22c20 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  b;.  int rc;..  
22c30 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
22c40 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
22c50 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
22c60 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
22c70 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
22c80 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
22c90 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
22ca0 30 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20  0), " DB", 0);. 
22cb0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
22cc0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
22cd0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
22ce0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
22cf0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
22d00 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
22d10 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
22d20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
22d30 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55  e_control(db, NU
22d40 4c 4c 2c 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f  LL, SQLITE_LAST_
22d50 45 52 52 4e 4f 2c 20 26 69 41 72 67 29 3b 0a 20  ERRNO, &iArg);. 
22d60 20 69 66 28 20 72 63 20 29 7b 20 0a 20 20 20 20   if( rc ){ .    
22d70 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
22d80 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
22d90 49 6e 74 4f 62 6a 28 72 63 29 29 3b 20 0a 20 20  IntObj(rc)); .  
22da0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
22db0 4f 52 3b 20 0a 20 20 7d 0a 20 20 69 66 28 20 69  OR; .  }.  if( i
22dc0 41 72 67 21 3d 30 20 29 20 7b 0a 20 20 20 20 54  Arg!=0 ) {.    T
22dd0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
22de0 69 6e 74 65 72 70 2c 20 22 55 6e 65 78 70 65 63  interp, "Unexpec
22df0 74 65 64 20 6e 6f 6e 2d 7a 65 72 6f 20 65 72 72  ted non-zero err
22e00 6e 6f 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20  no: ",.         
22e10 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
22e20 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
22e30 28 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 69  (Tcl_NewIntObj(i
22e40 41 72 67 29 2c 20 30 29 2c 20 22 20 22 2c 20 30  Arg), 0), " ", 0
22e50 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
22e60 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
22e70 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a  eturn TCL_OK;  .
22e80 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c  }..#ifdef __APPL
22e90 45 5f 5f 0a 2f 2a 20 46 72 6f 6d 20 73 71 6c 69  E__./* From sqli
22ea0 74 65 33 5f 70 72 69 61 76 65 74 2e 68 20 2a 2f  te3_priavet.h */
22eb0 0a 23 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45  .# ifndef SQLITE
22ec0 5f 54 52 55 4e 43 41 54 45 5f 44 41 54 41 42 41  _TRUNCATE_DATABA
22ed0 53 45 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  SE.# define SQLI
22ee0 54 45 5f 54 52 55 4e 43 41 54 45 5f 44 41 54 41  TE_TRUNCATE_DATA
22ef0 42 41 53 45 20 20 20 20 20 20 31 30 31 0a 23 20  BASE      101.# 
22f00 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 52  define SQLITE_TR
22f10 55 4e 43 41 54 45 5f 4a 4f 55 52 4e 41 4c 4d 4f  UNCATE_JOURNALMO
22f20 44 45 5f 57 41 4c 20 20 20 20 20 20 20 20 20 20  DE_WAL          
22f30 20 28 30 78 31 3c 3c 30 29 0a 23 20 64 65 66 69   (0x1<<0).# defi
22f40 6e 65 20 53 51 4c 49 54 45 5f 54 52 55 4e 43 41  ne SQLITE_TRUNCA
22f50 54 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4d 41  TE_AUTOVACUUM_MA
22f60 53 4b 20 20 20 20 20 20 20 20 20 20 20 28 30 78  SK           (0x
22f70 33 3c 3c 32 29 0a 23 20 64 65 66 69 6e 65 20 53  3<<2).# define S
22f80 51 4c 49 54 45 5f 54 52 55 4e 43 41 54 45 5f 41  QLITE_TRUNCATE_A
22f90 55 54 4f 56 41 43 55 55 4d 5f 4f 46 46 20 20 20  UTOVACUUM_OFF   
22fa0 20 20 20 20 20 20 20 20 20 28 30 78 31 3c 3c 32           (0x1<<2
22fb0 29 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  ).# define SQLIT
22fc0 45 5f 54 52 55 4e 43 41 54 45 5f 41 55 54 4f 56  E_TRUNCATE_AUTOV
22fd0 41 43 55 55 4d 5f 46 55 4c 4c 20 20 20 20 20 20  ACUUM_FULL      
22fe0 20 20 20 20 20 28 30 78 32 3c 3c 32 29 0a 23 20       (0x2<<2).# 
22ff0 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 52  define SQLITE_TR
23000 55 4e 43 41 54 45 5f 41 55 54 4f 56 41 43 55 55  UNCATE_AUTOVACUU
23010 4d 5f 49 4e 43 52 45 4d 45 4e 54 41 4c 20 20 20  M_INCREMENTAL   
23020 20 28 30 78 33 3c 3c 32 29 0a 23 20 64 65 66 69   (0x3<<2).# defi
23030 6e 65 20 53 51 4c 49 54 45 5f 54 52 55 4e 43 41  ne SQLITE_TRUNCA
23040 54 45 5f 50 41 47 45 53 49 5a 45 5f 4d 41 53 4b  TE_PAGESIZE_MASK
23050 20 20 20 20 20 20 20 20 20 20 20 20 20 28 30 78               (0x
23060 37 3c 3c 34 29 0a 23 20 64 65 66 69 6e 65 20 53  7<<4).# define S
23070 51 4c 49 54 45 5f 54 52 55 4e 43 41 54 45 5f 50  QLITE_TRUNCATE_P
23080 41 47 45 53 49 5a 45 5f 31 30 32 34 20 20 20 20  AGESIZE_1024    
23090 20 20 20 20 20 20 20 20 20 28 30 78 31 3c 3c 34           (0x1<<4
230a0 29 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  ).# define SQLIT
230b0 45 5f 54 52 55 4e 43 41 54 45 5f 50 41 47 45 53  E_TRUNCATE_PAGES
230c0 49 5a 45 5f 32 30 34 38 20 20 20 20 20 20 20 20  IZE_2048        
230d0 20 20 20 20 20 28 30 78 32 3c 3c 34 29 0a 23 20       (0x2<<4).# 
230e0 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 52  define SQLITE_TR
230f0 55 4e 43 41 54 45 5f 50 41 47 45 53 49 5a 45 5f  UNCATE_PAGESIZE_
23100 34 30 39 36 20 20 20 20 20 20 20 20 20 20 20 20  4096            
23110 20 28 30 78 33 3c 3c 34 29 0a 23 20 64 65 66 69   (0x3<<4).# defi
23120 6e 65 20 53 51 4c 49 54 45 5f 54 52 55 4e 43 41  ne SQLITE_TRUNCA
23130 54 45 5f 50 41 47 45 53 49 5a 45 5f 38 31 39 32  TE_PAGESIZE_8192
23140 20 20 20 20 20 20 20 20 20 20 20 20 20 28 30 78               (0x
23150 34 3c 3c 34 29 0a 23 20 65 6e 64 69 66 0a 23 20  4<<4).# endif.# 
23160 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 52 45  ifndef SQLITE_RE
23170 50 4c 41 43 45 5f 44 41 54 41 42 41 53 45 0a 23  PLACE_DATABASE.#
23180 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 52   define SQLITE_R
23190 45 50 4c 41 43 45 5f 44 41 54 41 42 41 53 45 20  EPLACE_DATABASE 
231a0 20 20 20 20 20 20 31 30 32 0a 23 20 65 6e 64 69        102.# endi
231b0 66 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  f../*.** tclcmd:
231c0 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
231d0 74 72 75 6e 63 61 74 65 5f 74 65 73 74 20 44 42  truncate_test DB
231e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20  .**.** This TCL 
231f0 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65  command runs the
23200 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
23210 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20  ntrol interface 
23220 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73 20  and.** verifies 
23230 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f  correct operatio
23240 6e 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f  n of the SQLITE_
23250 54 52 55 4e 43 41 54 45 5f 44 41 54 41 42 41 53  TRUNCATE_DATABAS
23260 45 20 76 65 72 62 2e 0a 2a 2f 0a 73 74 61 74 69  E verb..*/.stati
23270 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72  c int file_contr
23280 6f 6c 5f 74 72 75 6e 63 61 74 65 5f 74 65 73 74  ol_truncate_test
23290 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
232a0 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
232b0 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
232c0 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
232d0 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
232e0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
232f0 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
23300 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
23310 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
23320 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
23330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23340 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
23350 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
23360 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
23370 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
23380 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
23390 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
233a0 20 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20 72 63   flags;.  int rc
233b0 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21  ;.  .  if( objc!
233c0 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
233d0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
233e0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
233f0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
23400 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23410 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
23420 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
23430 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 46 4c 41  0], 0), " DB FLA
23440 47 53 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  GS", 0);.    ret
23450 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
23460 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
23470 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
23480 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
23490 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20  [1]), &db) ){.  
234a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
234b0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63  OR;.  }.  if( Tc
234c0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
234d0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
234e0 20 26 66 6c 61 67 73 29 20 29 7b 0a 20 20 20 20   &flags) ){.    
234f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
23500 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
23510 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
23520 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49  l(db, NULL, SQLI
23530 54 45 5f 54 52 55 4e 43 41 54 45 5f 44 41 54 41  TE_TRUNCATE_DATA
23540 42 41 53 45 2c 20 26 66 6c 61 67 73 29 3b 0a 20  BASE, &flags);. 
23550 20 69 66 28 20 72 63 20 29 7b 20 0a 20 20 20 20   if( rc ){ .    
23560 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
23570 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
23580 49 6e 74 4f 62 6a 28 72 63 29 29 3b 20 0a 20 20  IntObj(rc)); .  
23590 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
235a0 4f 52 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  OR; .  }.  retur
235b0 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f  n TCL_OK;  .}../
235c0 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66  *.** tclcmd:   f
235d0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 72 65 70 6c  ile_control_repl
235e0 61 63 65 5f 74 65 73 74 20 44 42 0a 2a 2a 0a 2a  ace_test DB.**.*
235f0 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61  * This TCL comma
23600 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69  nd runs the sqli
23610 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
23620 20 69 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a   interface and.*
23630 2a 20 76 65 72 69 66 69 65 73 20 63 6f 72 72 65  * verifies corre
23640 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  ct operation of 
23650 74 68 65 20 53 51 4c 49 54 45 5f 52 45 50 4c 41  the SQLITE_REPLA
23660 43 45 5f 44 41 54 41 42 41 53 45 20 76 65 72 62  CE_DATABASE verb
23670 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23680 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 72 65 70  file_control_rep
23690 6c 61 63 65 5f 74 65 73 74 28 0a 20 20 43 6c 69  lace_test(.  Cli
236a0 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
236b0 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
236c0 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
236d0 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
236e0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
236f0 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
23700 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
23710 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
23720 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
23730 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
23740 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
23750 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
23760 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
23770 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
23780 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
23790 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 41 72 67 20  /.){.  int iArg 
237a0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  = 0;.  sqlite3 *
237b0 73 72 63 5f 64 62 3b 0a 20 20 73 71 6c 69 74 65  src_db;.  sqlite
237c0 33 20 2a 64 73 74 5f 64 62 3b 0a 20 20 69 6e 74  3 *dst_db;.  int
237d0 20 72 63 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62   rc;.  .  if( ob
237e0 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
237f0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
23800 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
23810 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
23820 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  "",.            
23830 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74           Tcl_Get
23840 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
23850 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 53 54  jv[0], 0), " DST
23860 5f 44 42 20 53 52 43 5f 44 42 22 2c 20 30 29 3b  _DB SRC_DB", 0);
23870 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
23880 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
23890 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
238a0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
238b0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
238c0 73 74 5f 64 62 29 20 29 7b 0a 20 20 20 20 72 65  st_db) ){.    re
238d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
238e0 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
238f0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
23900 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
23910 76 5b 32 5d 29 2c 20 26 73 72 63 5f 64 62 29 20  v[2]), &src_db) 
23920 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
23930 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
23940 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
23950 5f 63 6f 6e 74 72 6f 6c 28 64 73 74 5f 64 62 2c  _control(dst_db,
23960 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 52 45   NULL, SQLITE_RE
23970 50 4c 41 43 45 5f 44 41 54 41 42 41 53 45 2c 20  PLACE_DATABASE, 
23980 73 72 63 5f 64 62 29 3b 0a 20 20 69 66 28 20 72  src_db);.  if( r
23990 63 20 29 7b 20 0a 20 20 20 20 54 63 6c 5f 53 65  c ){ .    Tcl_Se
239a0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
239b0 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
239c0 28 72 63 29 29 3b 20 0a 20 20 20 20 72 65 74 75  (rc)); .    retu
239d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 20 0a 20  rn TCL_ERROR; . 
239e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
239f0 4f 4b 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f  OK;  .}.#endif /
23a00 2a 20 5f 5f 41 50 50 4c 45 5f 5f 20 2a 2f 0a 0a  * __APPLE__ */..
23a10 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
23a20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75  file_control_chu
23a30 6e 6b 73 69 7a 65 5f 74 65 73 74 20 44 42 20 44  nksize_test DB D
23a40 42 4e 41 4d 45 20 53 49 5a 45 0a 2a 2a 0a 2a 2a  BNAME SIZE.**.**
23a50 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e   This TCL comman
23a60 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74  d runs the sqlit
23a70 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20  e3_file_control 
23a80 69 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a  interface and.**
23a90 20 76 65 72 69 66 69 65 73 20 63 6f 72 72 65 63   verifies correc
23aa0 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74  t operation of t
23ab0 68 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f  he SQLITE_GET_LO
23ac0 43 4b 50 52 4f 58 59 46 49 4c 45 20 61 6e 64 0a  CKPROXYFILE and.
23ad0 2a 2a 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f  ** SQLITE_SET_LO
23ae0 43 4b 50 52 4f 58 59 46 49 4c 45 20 76 65 72 62  CKPROXYFILE verb
23af0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
23b00 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68   file_control_ch
23b10 75 6e 6b 73 69 7a 65 5f 74 65 73 74 28 0a 20 20  unksize_test(.  
23b20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
23b30 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
23b40 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
23b50 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
23b60 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
23b70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
23b80 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
23b90 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
23ba0 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
23bb0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
23bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
23bd0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
23be0 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
23bf0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
23c00 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
23c10 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 53  s */.){.  int nS
23c20 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
23c30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
23c40 20 63 68 75 6e 6b 20 73 69 7a 65 20 2a 2f 0a 20   chunk size */. 
23c50 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20   char *zDb;     
23c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c70 20 2f 2a 20 44 62 20 6e 61 6d 65 20 28 22 6d 61   /* Db name ("ma
23c80 69 6e 22 2c 20 22 74 65 6d 70 22 20 65 74 63 2e  in", "temp" etc.
23c90 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  ) */.  sqlite3 *
23ca0 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
23cb0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
23cc0 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  se handle */.  i
23cd0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
23ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23cf0 2a 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29  * file_control()
23d00 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
23d10 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29  .  if( objc!=4 )
23d20 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
23d30 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
23d40 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44 42 4e 41  , objv, "DB DBNA
23d50 4d 45 20 53 49 5a 45 22 29 3b 0a 20 20 20 20 72  ME SIZE");.    r
23d60 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
23d70 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
23d80 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
23d90 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
23da0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 0a 20 20  jv[1]), &db) .  
23db0 20 7c 7c 20 54 63 6c 5f 47 65 74 49 6e 74 46 72   || Tcl_GetIntFr
23dc0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
23dd0 6a 76 5b 33 5d 2c 20 26 6e 53 69 7a 65 29 0a 20  jv[3], &nSize). 
23de0 20 29 7b 0a 20 20 20 72 65 74 75 72 6e 20 54 43   ){.   return TC
23df0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
23e00 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  Db = Tcl_GetStri
23e10 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69  ng(objv[2]);.  i
23e20 66 28 20 7a 44 62 5b 30 5d 3d 3d 27 5c 30 27 20  f( zDb[0]=='\0' 
23e30 29 20 7a 44 62 20 3d 20 4e 55 4c 4c 3b 0a 0a 20  ) zDb = NULL;.. 
23e40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
23e50 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a  le_control(db, z
23e60 44 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  Db, SQLITE_FCNTL
23e70 5f 43 48 55 4e 4b 5f 53 49 5a 45 2c 20 28 76 6f  _CHUNK_SIZE, (vo
23e80 69 64 20 2a 29 26 6e 53 69 7a 65 29 3b 0a 20 20  id *)&nSize);.  
23e90 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 54 63  if( rc ){.    Tc
23ea0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
23eb0 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69  rp, (char *)sqli
23ec0 74 65 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65  te3TestErrorName
23ed0 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43  (rc), TCL_STATIC
23ee0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
23ef0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
23f00 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
23f10 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
23f20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69   file_control_si
23f30 7a 65 68 69 6e 74 5f 74 65 73 74 20 44 42 20 44  zehint_test DB D
23f40 42 4e 41 4d 45 20 53 49 5a 45 0a 2a 2a 0a 2a 2a  BNAME SIZE.**.**
23f50 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e   This TCL comman
23f60 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74  d runs the sqlit
23f70 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20  e3_file_control 
23f80 69 6e 74 65 72 66 61 63 65 20 0a 2a 2a 20 77 69  interface .** wi
23f90 74 68 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  th SQLITE_FCNTL_
23fa0 53 49 5a 45 5f 48 49 4e 54 0a 2a 2f 0a 73 74 61  SIZE_HINT.*/.sta
23fb0 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e  tic int file_con
23fc0 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74 65  trol_sizehint_te
23fd0 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  st(.  ClientData
23fe0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
23ff0 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
24000 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
24010 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
24020 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
24030 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
24040 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
24050 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
24060 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
24070 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
24080 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
24090 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
240a0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
240b0 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
240c0 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
240d0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 53  sqlite3_int64 nS
240e0 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
240f0 2f 2a 20 48 69 6e 74 65 64 20 73 69 7a 65 20 2a  /* Hinted size *
24100 2f 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 20 20  /.  char *zDb;  
24110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24120 20 20 20 20 2f 2a 20 44 62 20 6e 61 6d 65 20 28      /* Db name (
24130 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20 65  "main", "temp" e
24140 74 63 2e 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tc.) */.  sqlite
24150 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
24160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
24170 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
24180 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
24190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241a0 20 20 2f 2a 20 66 69 6c 65 5f 63 6f 6e 74 72 6f    /* file_contro
241b0 6c 28 29 20 72 65 74 75 72 6e 20 63 6f 64 65 20  l() return code 
241c0 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  */..  if( objc!=
241d0 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  4 ){.    Tcl_Wro
241e0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
241f0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44  , 1, objv, "DB D
24200 42 4e 41 4d 45 20 53 49 5a 45 22 29 3b 0a 20 20  BNAME SIZE");.  
24210 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
24220 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
24230 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
24240 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
24250 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
24260 0a 20 20 20 7c 7c 20 54 63 6c 5f 47 65 74 57 69  .   || Tcl_GetWi
24270 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  deIntFromObj(int
24280 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e  erp, objv[3], &n
24290 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20 72 65  Size).  ){.   re
242a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
242b0 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f    }.  zDb = Tcl_
242c0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
242d0 5d 29 3b 0a 20 20 69 66 28 20 7a 44 62 5b 30 5d  ]);.  if( zDb[0]
242e0 3d 3d 27 5c 30 27 20 29 20 7a 44 62 20 3d 20 4e  =='\0' ) zDb = N
242f0 55 4c 4c 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ULL;..  rc = sql
24300 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
24310 6c 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54  l(db, zDb, SQLIT
24320 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  E_FCNTL_SIZE_HIN
24330 54 2c 20 28 76 6f 69 64 20 2a 29 26 6e 53 69 7a  T, (void *)&nSiz
24340 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  e);.  if( rc ){.
24350 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
24360 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
24370 2a 29 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  *)sqlite3TestErr
24380 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  orName(rc), TCL_
24390 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74  STATIC);.    ret
243a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
243b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
243c0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  OK;.}../*.** tcl
243d0 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74  cmd:   file_cont
243e0 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74 65  rol_lockproxy_te
243f0 73 74 20 44 42 20 50 57 44 0a 2a 2a 0a 2a 2a 20  st DB PWD.**.** 
24400 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  This TCL command
24410 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65   runs the sqlite
24420 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69  3_file_control i
24430 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20  nterface and.** 
24440 76 65 72 69 66 69 65 73 20 63 6f 72 72 65 63 74  verifies correct
24450 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   operation of th
24460 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43  e SQLITE_GET_LOC
24470 4b 50 52 4f 58 59 46 49 4c 45 20 61 6e 64 0a 2a  KPROXYFILE and.*
24480 2a 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  * SQLITE_SET_LOC
24490 4b 50 52 4f 58 59 46 49 4c 45 20 76 65 72 62 73  KPROXYFILE verbs
244a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
244b0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f 63  file_control_loc
244c0 6b 70 72 6f 78 79 5f 74 65 73 74 28 0a 20 20 43  kproxy_test(.  C
244d0 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
244e0 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
244f0 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
24500 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
24510 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
24520 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
24530 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
24540 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
24550 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
24560 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
24570 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
24580 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
24590 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
245a0 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
245b0 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
245c0 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
245d0 20 2a 64 62 3b 0a 20 20 0a 20 20 69 66 28 20 6f   *db;.  .  if( o
245e0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
245f0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
24600 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
24610 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
24620 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \"",.           
24630 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65            Tcl_Ge
24640 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
24650 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42  bjv[0], 0), " DB
24660 20 50 57 44 22 2c 20 30 29 3b 0a 20 20 20 20 72   PWD", 0);.    r
24670 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
24680 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
24690 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
246a0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
246b0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a  jv[1]), &db) ){.
246c0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
246d0 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 23 69 66 20  ROR;.  }.  .#if 
246e0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
246f0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
24700 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65 66 69  TYLE).#  if defi
24710 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23  ned(__APPLE__).#
24720 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54      define SQLIT
24730 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
24740 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c 73 65  _STYLE 1.#  else
24750 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c  .#    define SQL
24760 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
24770 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20 65 6e  NG_STYLE 0.#  en
24780 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  dif.#endif.#if S
24790 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
247a0 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
247b0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
247c0 0a 20 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 74  .  {.    char *t
247d0 65 73 74 50 61 74 68 3b 0a 20 20 20 20 69 6e 74  estPath;.    int
247e0 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 6e 50 77   rc;.    int nPw
247f0 64 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  d;.    const cha
24800 72 20 2a 7a 50 77 64 3b 0a 20 20 20 20 63 68 61  r *zPwd;.    cha
24810 72 20 70 72 6f 78 79 50 61 74 68 5b 34 30 30 5d  r proxyPath[400]
24820 3b 0a 20 20 20 20 0a 20 20 20 20 7a 50 77 64 20  ;.    .    zPwd 
24830 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
24840 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
24850 26 6e 50 77 64 29 3b 0a 20 20 20 20 69 66 28 20  &nPwd);.    if( 
24860 73 69 7a 65 6f 66 28 70 72 6f 78 79 50 61 74 68  sizeof(proxyPath
24870 29 3c 6e 50 77 64 2b 32 30 20 29 7b 0a 20 20 20  )<nPwd+20 ){.   
24880 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
24890 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 50 57 44  ult(interp, "PWD
248a0 20 74 6f 6f 20 62 69 67 22 2c 20 28 76 6f 69 64   too big", (void
248b0 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  *)0);.      retu
248c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
248d0 20 20 7d 0a 20 20 20 20 73 70 72 69 6e 74 66 28    }.    sprintf(
248e0 70 72 6f 78 79 50 61 74 68 2c 20 22 25 73 2f 74  proxyPath, "%s/t
248f0 65 73 74 2e 70 72 6f 78 79 22 2c 20 7a 50 77 64  est.proxy", zPwd
24900 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
24910 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
24920 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54  (db, NULL, SQLIT
24930 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_SET_LOCKPROXYF
24940 49 4c 45 2c 20 70 72 6f 78 79 50 61 74 68 29 3b  ILE, proxyPath);
24950 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
24960 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
24970 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
24980 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29  l_NewIntObj(rc))
24990 3b 20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ; .      return 
249a0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
249b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
249c0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
249d0 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f  b, NULL, SQLITE_
249e0 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  GET_LOCKPROXYFIL
249f0 45 2c 20 26 74 65 73 74 50 61 74 68 29 3b 0a 20  E, &testPath);. 
24a00 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 70     if( strncmp(p
24a10 72 6f 78 79 50 61 74 68 2c 74 65 73 74 50 61 74  roxyPath,testPat
24a20 68 2c 31 31 29 20 29 7b 0a 20 20 20 20 20 20 54  h,11) ){.      T
24a30 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
24a40 69 6e 74 65 72 70 2c 20 22 4c 6f 63 6b 20 70 72  interp, "Lock pr
24a50 6f 78 79 20 66 69 6c 65 20 64 69 64 20 6e 6f 74  oxy file did not
24a60 20 6d 61 74 63 68 20 74 68 65 20 22 0a 20 20 20   match the ".   
24a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a80 20 20 20 20 20 20 20 20 20 20 20 20 22 70 72 65              "pre
24a90 76 69 6f 75 73 6c 79 20 61 73 73 69 67 6e 65 64  viously assigned
24aa0 20 76 61 6c 75 65 22 2c 20 30 29 3b 0a 20 20 20   value", 0);.   
24ab0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
24ac0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
24ad0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54  f( rc ){.      T
24ae0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
24af0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
24b00 6e 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20 20 20  ntObj(rc));.    
24b10 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
24b20 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  OR;.    }.    rc
24b30 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
24b40 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c  control(db, NULL
24b50 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  , SQLITE_SET_LOC
24b60 4b 50 52 4f 58 59 46 49 4c 45 2c 20 70 72 6f 78  KPROXYFILE, prox
24b70 79 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20  yPath);.    if( 
24b80 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  rc ){.      Tcl_
24b90 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
24ba0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
24bb0 62 6a 28 72 63 29 29 3b 0a 20 20 20 20 20 20 72  bj(rc));.      r
24bc0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
24bd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
24be0 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  f.  return TCL_O
24bf0 4b 3b 20 20 0a 7d 0a 0a 23 69 66 64 65 66 20 5f  K;  .}..#ifdef _
24c00 5f 41 50 50 4c 45 5f 5f 0a 23 69 6e 63 6c 75 64  _APPLE__.#includ
24c10 65 20 3c 73 79 73 2f 70 61 72 61 6d 2e 68 3e 0a  e <sys/param.h>.
24c20 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6f  #include <sys/mo
24c30 75 6e 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  unt.h>.#include 
24c40 3c 73 79 73 2f 65 72 72 6e 6f 2e 68 3e 0a 23 65  <sys/errno.h>.#e
24c50 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 2a 20 74 63 6c  ndif../*. ** tcl
24c60 63 6d 64 3a 20 20 20 70 61 74 68 5f 69 73 5f 6c  cmd:   path_is_l
24c70 6f 63 61 6c 20 50 57 44 0a 20 2a 2f 0a 73 74 61  ocal PWD. */.sta
24c80 74 69 63 20 69 6e 74 20 70 61 74 68 5f 69 73 5f  tic int path_is_
24c90 6c 6f 63 61 6c 28 0a 20 20 43 6c 69 65 6e 74 44  local(.  ClientD
24ca0 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
24cb0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
24cc0 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
24cd0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
24ce0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
24cf0 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
24d00 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
24d10 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
24d20 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
24d30 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
24d40 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
24d50 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
24d60 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
24d70 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
24d80 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
24d90 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
24da0 50 61 74 68 3b 0a 20 20 69 6e 74 20 6e 50 61 74  Path;.  int nPat
24db0 68 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63  h;.  .  if( objc
24dc0 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
24dd0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
24de0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
24df0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
24e00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24e10 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
24e20 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
24e30 5b 30 5d 2c 20 30 29 2c 20 22 20 50 41 54 48 22  [0], 0), " PATH"
24e40 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
24e50 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
24e60 20 20 7a 50 61 74 68 20 3d 20 54 63 6c 5f 47 65    zPath = Tcl_Ge
24e70 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
24e80 62 6a 76 5b 31 5d 2c 20 26 6e 50 61 74 68 29 3b  bjv[1], &nPath);
24e90 0a 20 20 0a 23 69 66 64 65 66 20 5f 5f 41 50 50  .  .#ifdef __APP
24ea0 4c 45 5f 5f 0a 20 20 7b 0a 20 20 20 20 73 74 72  LE__.  {.    str
24eb0 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e 66  uct statfs fsInf
24ec0 6f 3b 0a 20 20 20 20 69 66 28 20 73 74 61 74 66  o;.    if( statf
24ed0 73 28 7a 50 61 74 68 2c 20 26 66 73 49 6e 66 6f  s(zPath, &fsInfo
24ee0 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20  ) == -1 ){.     
24ef0 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e 6f   int err = errno
24f00 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  ;.      Tcl_Appe
24f10 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
24f20 20 22 45 72 72 6f 72 20 63 61 6c 6c 69 6e 67 20   "Error calling 
24f30 73 74 61 74 66 73 20 6f 6e 20 70 61 74 68 22 2c  statfs on path",
24f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24f50 20 20 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 49          Tcl_NewI
24f60 6e 74 4f 62 6a 28 65 72 72 29 2c 20 30 29 3b 0a  ntObj(err), 0);.
24f70 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
24f80 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
24f90 20 20 69 66 28 20 66 73 49 6e 66 6f 2e 66 5f 66    if( fsInfo.f_f
24fa0 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c 20 29  lags&MNT_LOCAL )
24fb0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f  {.      Tcl_SetO
24fc0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
24fd0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 31   Tcl_NewIntObj(1
24fe0 29 29 3b 20 0a 20 20 20 20 7d 20 65 6c 73 65 20  )); .    } else 
24ff0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f  {.      Tcl_SetO
25000 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
25010 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 30   Tcl_NewIntObj(0
25020 29 29 3b 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  )); .    }.  }.#
25030 65 6c 73 65 0a 20 20 54 63 6c 5f 53 65 74 4f 62  else.  Tcl_SetOb
25040 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
25050 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 31 29  Tcl_NewIntObj(1)
25060 29 3b 20 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20  ); .#endif.  .  
25070 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20  return TCL_OK;  
25080 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 74 63 6c 63 6d  .}../*. ** tclcm
25090 64 3a 20 20 20 70 61 74 68 5f 69 73 5f 64 6f 73  d:   path_is_dos
250a0 20 50 57 44 0a 20 2a 2f 0a 73 74 61 74 69 63 20   PWD. */.static 
250b0 69 6e 74 20 70 61 74 68 5f 69 73 5f 64 6f 73 28  int path_is_dos(
250c0 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
250d0 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
250e0 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
250f0 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
25100 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
25110 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
25120 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
25130 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
25140 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
25150 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
25160 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25170 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
25180 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
25190 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
251a0 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
251b0 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ents */.){.  con
251c0 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b 0a  st char *zPath;.
251d0 20 20 69 6e 74 20 6e 50 61 74 68 3b 0a 20 20 0a    int nPath;.  .
251e0 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
251f0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
25200 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
25210 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
25220 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
25230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25240 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
25250 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
25260 29 2c 20 22 20 50 41 54 48 22 2c 20 30 29 3b 0a  ), " PATH", 0);.
25270 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
25280 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 50 61 74  RROR;.  }.  zPat
25290 68 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  h = Tcl_GetStrin
252a0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d  gFromObj(objv[1]
252b0 2c 20 26 6e 50 61 74 68 29 3b 0a 20 20 0a 23 69  , &nPath);.  .#i
252c0 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20  fdef __APPLE__. 
252d0 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74   {.    struct st
252e0 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20  atfs fsInfo;.   
252f0 20 69 66 28 20 73 74 61 74 66 73 28 7a 50 61 74   if( statfs(zPat
25300 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d  h, &fsInfo) == -
25310 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  1 ){.      int e
25320 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  rr = errno;.    
25330 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
25340 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
25350 72 20 63 61 6c 6c 69 6e 67 20 73 74 61 74 66 73  r calling statfs
25360 20 6f 6e 20 70 61 74 68 22 2c 0a 20 20 20 20 20   on path",.     
25370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25380 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28    Tcl_NewIntObj(
25390 65 72 72 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  err), 0);.      
253a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
253b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
253c0 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22 6d 73  0 == strncmp("ms
253d0 64 6f 73 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66  dos", fsInfo.f_f
253e0 73 74 79 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b  stypename, 5)) {
253f0 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  .      Tcl_SetOb
25400 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
25410 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 31 29  Tcl_NewIntObj(1)
25420 29 3b 20 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  ); .    } else i
25430 66 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28  f (0 == strncmp(
25440 22 65 78 66 61 74 22 2c 20 66 73 49 6e 66 6f 2e  "exfat", fsInfo.
25450 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 35 29  f_fstypename, 5)
25460 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  ) {.      Tcl_Se
25470 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
25480 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
25490 28 31 29 29 3b 20 0a 20 20 20 20 7d 20 65 6c 73  (1)); .    } els
254a0 65 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  e {.      Tcl_Se
254b0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
254c0 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
254d0 28 30 29 29 3b 20 0a 20 20 20 20 7d 0a 20 20 7d  (0)); .    }.  }
254e0 0a 23 65 6c 73 65 0a 20 20 54 63 6c 5f 53 65 74  .#else.  Tcl_Set
254f0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
25500 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
25510 30 29 29 3b 20 0a 23 65 6e 64 69 66 0a 20 20 0a  0)); .#endif.  .
25520 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
25530 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63    .}../*.** tclc
25540 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72  md:   file_contr
25550 6f 6c 5f 77 69 6e 33 32 5f 61 76 5f 72 65 74 72  ol_win32_av_retr
25560 79 20 44 42 20 20 4e 52 45 54 52 59 20 20 44 45  y DB  NRETRY  DE
25570 4c 41 59 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54  LAY.**.** This T
25580 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20  CL command runs 
25590 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
255a0 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61  _control interfa
255b0 63 65 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 53  ce with.** the S
255c0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33  QLITE_FCNTL_WIN3
255d0 32 5f 41 56 5f 52 45 54 52 59 20 6f 70 63 6f 64  2_AV_RETRY opcod
255e0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
255f0 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69   file_control_wi
25600 6e 33 32 5f 61 76 5f 72 65 74 72 79 28 0a 20 20  n32_av_retry(.  
25610 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
25620 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
25630 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
25640 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
25650 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
25660 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
25670 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
25680 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
25690 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
256a0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
256b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
256c0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
256d0 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
256e0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
256f0 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
25700 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
25710 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
25720 0a 20 20 69 6e 74 20 61 5b 32 5d 3b 0a 20 20 63  .  int a[2];.  c
25730 68 61 72 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69  har z[100];..  i
25740 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
25750 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
25760 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
25770 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
25780 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
25790 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
257a0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
257b0 29 2c 20 22 20 44 42 20 4e 52 45 54 52 59 20 44  ), " DB NRETRY D
257c0 45 4c 41 59 22 2c 20 30 29 3b 0a 20 20 20 20 72  ELAY", 0);.    r
257d0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
257e0 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
257f0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
25800 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
25810 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a  jv[1]), &db) ){.
25820 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
25830 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
25840 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
25850 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
25860 5d 2c 20 26 61 5b 30 5d 29 20 29 20 72 65 74 75  ], &a[0]) ) retu
25870 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
25880 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
25890 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
258a0 6a 76 5b 33 5d 2c 20 26 61 5b 31 5d 29 20 29 20  jv[3], &a[1]) ) 
258b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
258c0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
258d0 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
258e0 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 46  , NULL, SQLITE_F
258f0 43 4e 54 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45  CNTL_WIN32_AV_RE
25900 54 52 59 2c 20 28 76 6f 69 64 2a 29 61 29 3b 0a  TRY, (void*)a);.
25910 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
25920 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c  tf(sizeof(z), z,
25930 20 22 25 64 20 25 64 20 25 64 22 2c 20 72 63 2c   "%d %d %d", rc,
25940 20 61 5b 30 5d 2c 20 61 5b 31 5d 29 3b 0a 20 20   a[0], a[1]);.  
25950 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
25960 28 69 6e 74 65 72 70 2c 20 7a 2c 20 28 63 68 61  (interp, z, (cha
25970 72 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  r*)0);.  return 
25980 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a  TCL_OK;  .}../*.
25990 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c  ** tclcmd:   fil
259a0 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72 73 69 73  e_control_persis
259b0 74 5f 77 61 6c 20 44 42 20 50 45 52 53 49 53 54  t_wal DB PERSIST
259c0 2d 46 4c 41 47 0a 2a 2a 0a 2a 2a 20 54 68 69 73  -FLAG.**.** This
259d0 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e   TCL command run
259e0 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  s the sqlite3_fi
259f0 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72  le_control inter
25a00 66 61 63 65 20 77 69 74 68 0a 2a 2a 20 74 68 65  face with.** the
25a10 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45   SQLITE_FCNTL_PE
25a20 52 53 49 53 54 5f 57 41 4c 20 6f 70 63 6f 64 65  RSIST_WAL opcode
25a30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25a40 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72  file_control_per
25a50 73 69 73 74 5f 77 61 6c 28 0a 20 20 43 6c 69 65  sist_wal(.  Clie
25a60 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
25a70 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
25a80 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
25a90 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
25aa0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
25ab0 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
25ac0 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
25ad0 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
25ae0 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
25af0 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
25b00 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
25b10 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
25b20 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
25b30 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
25b40 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
25b50 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
25b60 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  b;.  int rc;.  i
25b70 6e 74 20 62 50 65 72 73 69 73 74 3b 0a 20 20 63  nt bPersist;.  c
25b80 68 61 72 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69  har z[100];..  i
25b90 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
25ba0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
25bb0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
25bc0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
25bd0 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
25be0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
25bf0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
25c00 29 2c 20 22 20 44 42 20 46 4c 41 47 22 2c 20 30  ), " DB FLAG", 0
25c10 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
25c20 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
25c30 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
25c40 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
25c50 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
25c60 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  &db) ){.    retu
25c70 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
25c80 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  }.  if( Tcl_GetI
25c90 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
25ca0 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 62 50 65 72  , objv[2], &bPer
25cb0 73 69 73 74 29 20 29 20 72 65 74 75 72 6e 20 54  sist) ) return T
25cc0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
25cd0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
25ce0 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20  ntrol(db, NULL, 
25cf0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52  SQLITE_FCNTL_PER
25d00 53 49 53 54 5f 57 41 4c 2c 20 28 76 6f 69 64 2a  SIST_WAL, (void*
25d10 29 26 62 50 65 72 73 69 73 74 29 3b 0a 20 20 73  )&bPersist);.  s
25d20 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
25d30 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25  sizeof(z), z, "%
25d40 64 20 25 64 22 2c 20 72 63 2c 20 62 50 65 72 73  d %d", rc, bPers
25d50 69 73 74 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  ist);.  Tcl_Appe
25d60 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
25d70 20 7a 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20   z, (char*)0);. 
25d80 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
25d90 20 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64   .}./*.** tclcmd
25da0 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  :   file_control
25db0 5f 70 6f 77 65 72 73 61 66 65 5f 6f 76 65 72 77  _powersafe_overw
25dc0 72 69 74 65 20 44 42 20 50 53 4f 57 2d 46 4c 41  rite DB PSOW-FLA
25dd0 47 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c  G.**.** This TCL
25de0 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68   command runs th
25df0 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  e sqlite3_file_c
25e00 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65  ontrol interface
25e10 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 53 51 4c   with.** the SQL
25e20 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53  ITE_FCNTL_POWERS
25e30 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 6f 70  AFE_OVERWRITE op
25e40 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
25e50 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  int file_control
25e60 5f 70 6f 77 65 72 73 61 66 65 5f 6f 76 65 72 77  _powersafe_overw
25e70 72 69 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61  rite(.  ClientDa
25e80 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
25e90 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
25ea0 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
25eb0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
25ec0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
25ed0 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
25ee0 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
25ef0 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
25f00 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
25f10 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
25f20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
25f30 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
25f40 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
25f50 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
25f60 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
25f70 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
25f80 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62   int rc;.  int b
25f90 3b 0a 20 20 63 68 61 72 20 7a 5b 31 30 30 5d 3b  ;.  char z[100];
25fa0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
25fb0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
25fc0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
25fd0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
25fe0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
25ff0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
26000 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
26010 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 46 4c 41  0], 0), " DB FLA
26020 47 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  G", 0);.    retu
26030 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
26040 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
26050 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
26060 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
26070 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20  1]), &db) ){.   
26080 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
26090 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c  R;.  }.  if( Tcl
260a0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
260b0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
260c0 26 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &b) ) return TCL
260d0 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
260e0 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
260f0 72 6f 6c 28 64 62 2c 4e 55 4c 4c 2c 53 51 4c 49  rol(db,NULL,SQLI
26100 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41  TE_FCNTL_POWERSA
26110 46 45 5f 4f 56 45 52 57 52 49 54 45 2c 28 76 6f  FE_OVERWRITE,(vo
26120 69 64 2a 29 26 62 29 3b 0a 20 20 73 71 6c 69 74  id*)&b);.  sqlit
26130 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
26140 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 64 20 25 64  of(z), z, "%d %d
26150 22 2c 20 72 63 2c 20 62 29 3b 0a 20 20 54 63 6c  ", rc, b);.  Tcl
26160 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
26170 74 65 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29  terp, z, (char*)
26180 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
26190 5f 4f 4b 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  _OK;  .}.../*.**
261a0 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f   tclcmd:   file_
261b0 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d 65 20  control_vfsname 
261c0 44 42 20 3f 41 55 58 44 42 3f 0a 2a 2a 0a 2a 2a  DB ?AUXDB?.**.**
261d0 20 52 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67   Return a string
261e0 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
261f0 74 68 65 20 73 74 61 63 6b 20 6f 66 20 56 46 53  the stack of VFS
26200 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
26210 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76  t file_control_v
26220 66 73 6e 61 6d 65 28 0a 20 20 43 6c 69 65 6e 74  fsname(.  Client
26230 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
26240 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
26250 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
26260 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
26270 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
26280 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
26290 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
262a0 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
262b0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
262c0 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
262d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
262e0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
262f0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
26300 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
26310 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
26320 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
26330 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
26340 44 62 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b  DbName = "main";
26350 0a 20 20 63 68 61 72 20 2a 7a 56 66 73 4e 61 6d  .  char *zVfsNam
26360 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62  e = 0;..  if( ob
26370 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33  jc!=2 && objc!=3
26380 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
26390 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
263a0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
263b0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
263c0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
263d0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
263e0 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 3f 41  [0], 0), " DB ?A
263f0 55 58 44 42 3f 22 2c 20 30 29 3b 0a 20 20 20 20  UXDB?", 0);.    
26400 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
26410 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
26420 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
26430 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
26440 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b  bjv[1]), &db) ){
26450 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
26460 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
26470 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20   objc==3 ){.    
26480 7a 44 62 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65  zDbName = Tcl_Ge
26490 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
264a0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
264b0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
264c0 20 7a 44 62 4e 61 6d 65 2c 20 53 51 4c 49 54 45   zDbName, SQLITE
264d0 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 2c 28  _FCNTL_VFSNAME,(
264e0 76 6f 69 64 2a 29 26 7a 56 66 73 4e 61 6d 65 29  void*)&zVfsName)
264f0 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
26500 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 56 66  sult(interp, zVf
26510 73 4e 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29  sName, (char*)0)
26520 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
26530 28 7a 56 66 73 4e 61 6d 65 29 3b 0a 20 20 72 65  (zVfsName);.  re
26540 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d  turn TCL_OK;  .}
26550 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  .../*.** tclcmd:
26560 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 6c     sqlite3_vfs_l
26570 69 73 74 0a 2a 2a 0a 2a 2a 20 20 20 52 65 74 75  ist.**.**   Retu
26580 72 6e 20 61 20 74 63 6c 20 6c 69 73 74 20 63 6f  rn a tcl list co
26590 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d  ntaining the nam
265a0 65 73 20 6f 66 20 61 6c 6c 20 72 65 67 69 73 74  es of all regist
265b0 65 72 65 64 20 76 66 73 27 73 2e 0a 2a 2f 0a 73  ered vfs's..*/.s
265c0 74 61 74 69 63 20 69 6e 74 20 76 66 73 5f 6c 69  tatic int vfs_li
265d0 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  st(.  ClientData
265e0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
265f0 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
26600 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
26610 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
26620 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
26630 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
26640 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
26650 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
26660 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
26670 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
26680 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
26690 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
266a0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
266b0 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
266c0 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
266d0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
266e0 73 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52  s;.  Tcl_Obj *pR
266f0 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  et = Tcl_NewObj(
26700 29 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31  );.  if( objc!=1
26710 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
26720 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
26730 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20   1, objv, "");. 
26740 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
26750 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70  ROR;.  }.  for(p
26760 56 66 73 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f  Vfs=sqlite3_vfs_
26770 66 69 6e 64 28 30 29 3b 20 70 56 66 73 3b 20 70  find(0); pVfs; p
26780 56 66 73 3d 70 56 66 73 2d 3e 70 4e 65 78 74 29  Vfs=pVfs->pNext)
26790 7b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  {.    Tcl_ListOb
267a0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
267b0 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c  nterp, pRet, Tcl
267c0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 56  _NewStringObj(pV
267d0 66 73 2d 3e 7a 4e 61 6d 65 2c 20 2d 31 29 29 3b  fs->zName, -1));
267e0 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62  .  }.  Tcl_SetOb
267f0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
26800 70 52 65 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  pRet);.  return 
26810 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a  TCL_OK;  .}../*.
26820 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 73 71 6c  ** tclcmd:   sql
26830 69 74 65 33 5f 6c 69 6d 69 74 20 44 42 20 49 44  ite3_limit DB ID
26840 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 68 69   VALUE.**.** Thi
26850 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75  s TCL command ru
26860 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6c  ns the sqlite3_l
26870 69 6d 69 74 20 69 6e 74 65 72 66 61 63 65 20 61  imit interface a
26880 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73 20 63  nd.** verifies c
26890 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e  orrect operation
268a0 20 6f 66 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2f   of the same..*/
268b0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
268c0 5f 6c 69 6d 69 74 28 0a 20 20 43 6c 69 65 6e 74  _limit(.  Client
268d0 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
268e0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
268f0 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
26900 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
26910 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
26920 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
26930 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
26940 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
26950 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
26960 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
26970 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
26980 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
26990 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
269a0 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
269b0 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
269c0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
269d0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 61  .  int rc;.  sta
269e0 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
269f0 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e   {.     char *zN
26a00 61 6d 65 3b 0a 20 20 20 20 20 69 6e 74 20 69 64  ame;.     int id
26a10 3b 0a 20 20 7d 20 61 49 64 5b 5d 20 3d 20 7b 0a  ;.  } aId[] = {.
26a20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49      { "SQLITE_LI
26a30 4d 49 54 5f 4c 45 4e 47 54 48 22 2c 20 20 20 20  MIT_LENGTH",    
26a40 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
26a50 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 20 20 20  _LIMIT_LENGTH   
26a60 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
26a70 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d     { "SQLITE_LIM
26a80 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 22 2c 20  IT_SQL_LENGTH", 
26a90 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
26aa0 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48  LIMIT_SQL_LENGTH
26ab0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
26ac0 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49    { "SQLITE_LIMI
26ad0 54 5f 43 4f 4c 55 4d 4e 22 2c 20 20 20 20 20 20  T_COLUMN",      
26ae0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
26af0 49 4d 49 54 5f 43 4f 4c 55 4d 4e 20 20 20 20 20  IMIT_COLUMN     
26b00 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
26b10 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54   { "SQLITE_LIMIT
26b20 5f 45 58 50 52 5f 44 45 50 54 48 22 2c 20 20 20  _EXPR_DEPTH",   
26b30 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
26b40 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 20 20  MIT_EXPR_DEPTH  
26b50 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
26b60 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  { "SQLITE_LIMIT_
26b70 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 22  COMPOUND_SELECT"
26b80 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d  ,     SQLITE_LIM
26b90 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
26ba0 43 54 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b  CT      },.    {
26bb0 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56   "SQLITE_LIMIT_V
26bc0 44 42 45 5f 4f 50 22 2c 20 20 20 20 20 20 20 20  DBE_OP",        
26bd0 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
26be0 54 5f 56 44 42 45 5f 4f 50 20 20 20 20 20 20 20  T_VDBE_OP       
26bf0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
26c00 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55  "SQLITE_LIMIT_FU
26c10 4e 43 54 49 4f 4e 5f 41 52 47 22 2c 20 20 20 20  NCTION_ARG",    
26c20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
26c30 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 20 20  _FUNCTION_ARG   
26c40 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
26c50 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54  SQLITE_LIMIT_ATT
26c60 41 43 48 45 44 22 2c 20 20 20 20 20 20 20 20 20  ACHED",         
26c70 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
26c80 41 54 54 41 43 48 45 44 20 20 20 20 20 20 20 20  ATTACHED        
26c90 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53       },.    { "S
26ca0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45  QLITE_LIMIT_LIKE
26cb0 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 22  _PATTERN_LENGTH"
26cc0 2c 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  , SQLITE_LIMIT_L
26cd0 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
26ce0 54 48 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51  TH  },.    { "SQ
26cf0 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
26d00 42 4c 45 5f 4e 55 4d 42 45 52 22 2c 20 20 20 20  BLE_NUMBER",    
26d10 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41   SQLITE_LIMIT_VA
26d20 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 20 20 20  RIABLE_NUMBER   
26d30 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c     },.    { "SQL
26d40 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45  ITE_LIMIT_TRIGGE
26d50 52 5f 44 45 50 54 48 22 2c 20 20 20 20 20 20 20  R_DEPTH",       
26d60 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49  SQLITE_LIMIT_TRI
26d70 47 47 45 52 5f 44 45 50 54 48 20 20 20 20 20 20  GGER_DEPTH      
26d80 20 20 7d 2c 0a 20 20 20 20 0a 20 20 20 20 2f 2a    },.    .    /*
26d90 20 4f 75 74 20 6f 66 20 72 61 6e 67 65 20 74 65   Out of range te
26da0 73 74 20 63 61 73 65 73 20 2a 2f 0a 20 20 20 20  st cases */.    
26db0 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  { "SQLITE_LIMIT_
26dc0 54 4f 4f 53 4d 41 4c 4c 22 2c 20 20 20 20 20 20  TOOSMALL",      
26dd0 20 20 20 20 20 20 2d 31 2c 20 20 20 20 20 20 20        -1,       
26de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26df0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
26e00 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54   "SQLITE_LIMIT_T
26e10 4f 4f 42 49 47 22 2c 20 20 20 20 20 20 20 20 20  OOBIG",         
26e20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
26e30 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 2b  T_TRIGGER_DEPTH+
26e40 31 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20  1      },.  };. 
26e50 20 69 6e 74 20 69 2c 20 69 64 3b 0a 20 20 69 6e   int i, id;.  in
26e60 74 20 76 61 6c 3b 0a 20 20 63 6f 6e 73 74 20 63  t val;.  const c
26e70 68 61 72 20 2a 7a 49 64 3b 0a 0a 20 20 69 66 28  har *zId;..  if(
26e80 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
26e90 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
26ea0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
26eb0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
26ec0 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
26ed0 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
26ee0 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
26ef0 20 22 20 44 42 20 49 44 20 56 41 4c 55 45 22 2c   " DB ID VALUE",
26f00 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
26f10 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
26f20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
26f30 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
26f40 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
26f50 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
26f60 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 49 64  TCL_ERROR;.  zId
26f70 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
26f80 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 66 6f 72  (objv[2]);.  for
26f90 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
26fa0 49 64 29 2f 73 69 7a 65 6f 66 28 61 49 64 5b 30  Id)/sizeof(aId[0
26fb0 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ]); i++){.    if
26fc0 28 20 73 74 72 63 6d 70 28 7a 49 64 2c 20 61 49  ( strcmp(zId, aI
26fd0 64 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  d[i].zName)==0 )
26fe0 7b 0a 20 20 20 20 20 20 69 64 20 3d 20 61 49 64  {.      id = aId
26ff0 5b 69 5d 2e 69 64 3b 0a 20 20 20 20 20 20 62 72  [i].id;.      br
27000 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
27010 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28 61   if( i>=sizeof(a
27020 49 64 29 2f 73 69 7a 65 6f 66 28 61 49 64 5b 30  Id)/sizeof(aId[0
27030 5d 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  ]) ){.    Tcl_Ap
27040 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
27050 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6c 69 6d 69  p, "unknown limi
27060 74 20 74 79 70 65 3a 20 22 2c 20 7a 49 64 2c 20  t type: ", zId, 
27070 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72  (char*)0);.    r
27080 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
27090 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
270a0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
270b0 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76  erp, objv[3], &v
270c0 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  al) ) return TCL
270d0 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
270e0 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 64 62 2c  qlite3_limit(db,
270f0 20 69 64 2c 20 76 61 6c 29 3b 0a 20 20 54 63 6c   id, val);.  Tcl
27100 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
27110 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
27120 4f 62 6a 28 72 63 29 29 3b 0a 20 20 72 65 74 75  Obj(rc));.  retu
27130 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a  rn TCL_OK;  .}..
27140 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73  /*.** tclcmd:  s
27150 61 76 65 5f 70 72 6e 67 5f 73 74 61 74 65 0a 2a  ave_prng_state.*
27160 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 73 74  *.** Save the st
27170 61 74 65 20 6f 66 20 74 68 65 20 70 73 65 75 64  ate of the pseud
27180 6f 2d 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  o-random number 
27190 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2a 20 41 74  generator..** At
271a0 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20   the same time, 
271b0 76 65 72 69 66 79 20 74 68 61 74 20 73 71 6c 69  verify that sqli
271c0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
271d0 20 77 6f 72 6b 73 20 65 76 65 6e 20 77 68 65 6e   works even when
271e0 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20  .** called with 
271f0 61 6e 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20  an out-of-range 
27200 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  opcode..*/.stati
27210 63 20 69 6e 74 20 73 61 76 65 5f 70 72 6e 67 5f  c int save_prng_
27220 73 74 61 74 65 28 0a 20 20 43 6c 69 65 6e 74 44  state(.  ClientD
27230 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
27240 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
27250 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
27260 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
27270 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
27280 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
27290 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
272a0 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
272b0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
272c0 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
272d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
272e0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
272f0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
27300 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
27310 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
27320 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
27330 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
27340 28 39 39 39 39 29 3b 0a 20 20 61 73 73 65 72 74  (9999);.  assert
27350 28 20 72 63 3d 3d 30 20 29 3b 0a 20 20 72 63 20  ( rc==0 );.  rc 
27360 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  = sqlite3_test_c
27370 6f 6e 74 72 6f 6c 28 2d 31 29 3b 0a 20 20 61 73  ontrol(-1);.  as
27380 73 65 72 74 28 20 72 63 3d 3d 30 20 29 3b 0a 20  sert( rc==0 );. 
27390 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
273a0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
273b0 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45 29  TCTRL_PRNG_SAVE)
273c0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
273d0 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  K;.}./*.** tclcm
273e0 64 3a 20 20 72 65 73 74 6f 72 65 5f 70 72 6e 67  d:  restore_prng
273f0 5f 73 74 61 74 65 0a 2a 2f 0a 73 74 61 74 69 63  _state.*/.static
27400 20 69 6e 74 20 72 65 73 74 6f 72 65 5f 70 72 6e   int restore_prn
27410 67 5f 73 74 61 74 65 28 0a 20 20 43 6c 69 65 6e  g_state(.  Clien
27420 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
27430 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
27440 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
27450 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
27460 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
27470 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
27480 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
27490 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
274a0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
274b0 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
274c0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
274d0 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
274e0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
274f0 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
27500 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
27510 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73  ){.  sqlite3_tes
27520 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
27530 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52  _TESTCTRL_PRNG_R
27540 45 53 54 4f 52 45 29 3b 0a 20 20 72 65 74 75 72  ESTORE);.  retur
27550 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a  n TCL_OK;.}./*.*
27560 2a 20 74 63 6c 63 6d 64 3a 20 20 72 65 73 65 74  * tclcmd:  reset
27570 5f 70 72 6e 67 5f 73 74 61 74 65 0a 2a 2f 0a 73  _prng_state.*/.s
27580 74 61 74 69 63 20 69 6e 74 20 72 65 73 65 74 5f  tatic int reset_
27590 70 72 6e 67 5f 73 74 61 74 65 28 0a 20 20 43 6c  prng_state(.  Cl
275a0 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
275b0 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
275c0 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
275d0 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
275e0 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
275f0 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
27600 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
27610 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
27620 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
27630 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
27640 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
27650 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
27660 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
27670 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
27680 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
27690 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
276a0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
276b0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
276c0 47 5f 52 45 53 45 54 29 3b 0a 20 20 72 65 74 75  G_RESET);.  retu
276d0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
276e0 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 70 63 61  .** tclcmd:  pca
276f0 63 68 65 5f 73 74 61 74 73 0a 2a 2f 0a 73 74 61  che_stats.*/.sta
27700 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 63 61  tic int test_pca
27710 63 68 65 5f 73 74 61 74 73 28 0a 20 20 43 6c 69  che_stats(.  Cli
27720 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
27730 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
27740 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
27750 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
27760 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
27770 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
27780 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
27790 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
277a0 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
277b0 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
277c0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
277d0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
277e0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
277f0 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
27800 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
27810 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 4d 69 6e 3b  /.){.  int nMin;
27820 0a 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 69  .  int nMax;.  i
27830 6e 74 20 6e 43 75 72 72 65 6e 74 3b 0a 20 20 69  nt nCurrent;.  i
27840 6e 74 20 6e 52 65 63 79 63 6c 61 62 6c 65 3b 0a  nt nRecyclable;.
27850 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b    Tcl_Obj *pRet;
27860 0a 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ..  sqlite3Pcach
27870 65 53 74 61 74 73 28 26 6e 43 75 72 72 65 6e 74  eStats(&nCurrent
27880 2c 20 26 6e 4d 61 78 2c 20 26 6e 4d 69 6e 2c 20  , &nMax, &nMin, 
27890 26 6e 52 65 63 79 63 6c 61 62 6c 65 29 3b 0a 0a  &nRecyclable);..
278a0 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77    pRet = Tcl_New
278b0 4f 62 6a 28 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  Obj();.  Tcl_Lis
278c0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
278d0 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
278e0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
278f0 28 22 63 75 72 72 65 6e 74 22 2c 20 2d 31 29 29  ("current", -1))
27900 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
27910 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
27920 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  erp, pRet, Tcl_N
27930 65 77 49 6e 74 4f 62 6a 28 6e 43 75 72 72 65 6e  ewIntObj(nCurren
27940 74 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  t));.  Tcl_ListO
27950 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
27960 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63  interp, pRet, Tc
27970 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
27980 6d 61 78 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63  max", -1));.  Tc
27990 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
279a0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
279b0 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  Ret, Tcl_NewIntO
279c0 62 6a 28 6e 4d 61 78 29 29 3b 0a 20 20 54 63 6c  bj(nMax));.  Tcl
279d0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
279e0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
279f0 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  et, Tcl_NewStrin
27a00 67 4f 62 6a 28 22 6d 69 6e 22 2c 20 2d 31 29 29  gObj("min", -1))
27a10 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
27a20 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
27a30 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  erp, pRet, Tcl_N
27a40 65 77 49 6e 74 4f 62 6a 28 6e 4d 69 6e 29 29 3b  ewIntObj(nMin));
27a50 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
27a60 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
27a70 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  rp, pRet, Tcl_Ne
27a80 77 53 74 72 69 6e 67 4f 62 6a 28 22 72 65 63 79  wStringObj("recy
27a90 63 6c 61 62 6c 65 22 2c 20 2d 31 29 29 3b 0a 20  clable", -1));. 
27aa0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
27ab0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
27ac0 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49  , pRet, Tcl_NewI
27ad0 6e 74 4f 62 6a 28 6e 52 65 63 79 63 6c 61 62 6c  ntObj(nRecyclabl
27ae0 65 29 29 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f  e));..  Tcl_SetO
27af0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
27b00 20 70 52 65 74 29 3b 0a 0a 20 20 72 65 74 75 72   pRet);..  retur
27b10 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  n TCL_OK;.}..#if
27b20 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
27b30 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a  E_UNLOCK_NOTIFY.
27b40 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74  static void test
27b50 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f 63  _unlock_notify_c
27b60 62 28 76 6f 69 64 20 2a 2a 61 41 72 67 2c 20 69  b(void **aArg, i
27b70 6e 74 20 6e 41 72 67 29 7b 0a 20 20 69 6e 74 20  nt nArg){.  int 
27b80 69 69 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20  ii;.  for(ii=0; 
27b90 69 69 3c 6e 41 72 67 3b 20 69 69 2b 2b 29 7b 0a  ii<nArg; ii++){.
27ba0 20 20 20 20 54 63 6c 5f 45 76 61 6c 45 78 28 28      Tcl_EvalEx((
27bb0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 61 41 72  Tcl_Interp *)aAr
27bc0 67 5b 69 69 5d 2c 20 22 75 6e 6c 6f 63 6b 5f 6e  g[ii], "unlock_n
27bd0 6f 74 69 66 79 22 2c 20 2d 31 2c 20 54 43 4c 5f  otify", -1, TCL_
27be0 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20  EVAL_GLOBAL);.  
27bf0 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
27c00 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f  LITE_ENABLE_UNLO
27c10 43 4b 5f 4e 4f 54 49 46 59 20 2a 2f 0a 0a 2f 2a  CK_NOTIFY */../*
27c20 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c  .** tclcmd:  sql
27c30 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69  ite3_unlock_noti
27c40 66 79 20 64 62 0a 2a 2f 0a 23 69 66 64 65 66 20  fy db.*/.#ifdef 
27c50 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e  SQLITE_ENABLE_UN
27c60 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73 74 61 74  LOCK_NOTIFY.stat
27c70 69 63 20 69 6e 74 20 74 65 73 74 5f 75 6e 6c 6f  ic int test_unlo
27c80 63 6b 5f 6e 6f 74 69 66 79 28 0a 20 20 43 6c 69  ck_notify(.  Cli
27c90 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
27ca0 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f  ta, /* Unused */
27cb0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
27cc0 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
27cd0 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
27ce0 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
27cf0 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
27d00 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
27d10 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
27d20 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
27d30 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
27d40 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
27d50 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
27d60 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
27d70 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  db;.  int rc;.. 
27d80 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
27d90 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
27da0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
27db0 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 20  objv, "DB");.   
27dc0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
27dd0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
27de0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
27df0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
27e00 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
27e10 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
27e20 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
27e30 63 20 3d 20 73 71 6c 69 74 65 33 5f 75 6e 6c 6f  c = sqlite3_unlo
27e40 63 6b 5f 6e 6f 74 69 66 79 28 64 62 2c 20 74 65  ck_notify(db, te
27e50 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  st_unlock_notify
27e60 5f 63 62 2c 20 28 76 6f 69 64 20 2a 29 69 6e 74  _cb, (void *)int
27e70 65 72 70 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52  erp);.  Tcl_SetR
27e80 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
27e90 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
27ea0 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
27eb0 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  C);.  return TCL
27ec0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
27ed0 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71  *.** tclcmd:  sq
27ee0 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
27ef0 6f 69 6e 74 20 64 62 20 3f 4e 41 4d 45 3f 0a 2a  oint db ?NAME?.*
27f00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
27f10 74 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  t_wal_checkpoint
27f20 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
27f30 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e  lientData, /* Un
27f40 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  used */.  Tcl_In
27f50 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
27f60 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
27f70 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
27f80 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
27f90 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
27fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27fb0 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
27fc0 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
27fd0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
27fe0 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
27ff0 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 68  ments */.){.  ch
28000 61 72 20 2a 7a 44 62 20 3d 20 30 3b 0a 20 20 73  ar *zDb = 0;.  s
28010 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
28020 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
28030 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 32 20  c!=3 && objc!=2 
28040 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
28050 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
28060 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 3f 4e 41  1, objv, "DB ?NA
28070 4d 45 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ME?");.    retur
28080 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
28090 0a 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  ..  if( getDbPoi
280a0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
280b0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
280c0 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20  1]), &db) ){.   
280d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
280e0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a  R;.  }.  if( obj
280f0 63 3d 3d 33 20 29 7b 0a 20 20 20 20 7a 44 62 20  c==3 ){.    zDb 
28100 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
28110 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7d 0a 20 20  objv[2]);.  }.  
28120 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77 61 6c  rc = sqlite3_wal
28130 5f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20  _checkpoint(db, 
28140 7a 44 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52  zDb);.  Tcl_SetR
28150 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
28160 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
28170 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
28180 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  C);.  return TCL
28190 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63  _OK;.}../*.** tc
281a0 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 77  lcmd:  sqlite3_w
281b0 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32  al_checkpoint_v2
281c0 20 64 62 20 4d 4f 44 45 20 3f 4e 41 4d 45 3f 0a   db MODE ?NAME?.
281d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61  **.** This comma
281e0 6e 64 20 63 61 6c 6c 73 20 74 68 65 20 77 61 6c  nd calls the wal
281f0 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 29  _checkpoint_v2()
28200 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74   function with t
28210 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
28220 6d 6f 64 65 20 61 72 67 75 6d 65 6e 74 20 28 70  mode argument (p
28230 61 73 73 69 76 65 2c 20 66 75 6c 6c 20 6f 72 20  assive, full or 
28240 72 65 73 74 61 72 74 29 2e 20 49 66 20 70 72 65  restart). If pre
28250 73 65 6e 74 2c 20 74 68 65 20 64 61 74 61 62 61  sent, the databa
28260 73 65 20 6e 61 6d 65 0a 2a 2a 20 4e 41 4d 45 20  se name.** NAME 
28270 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  is passed as the
28280 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
28290 20 74 6f 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69   to wal_checkpoi
282a0 6e 74 5f 76 32 28 29 2e 20 49 66 20 69 74 20 74  nt_v2(). If it t
282b0 68 65 0a 2a 2a 20 4e 41 4d 45 20 61 72 67 75 6d  he.** NAME argum
282c0 65 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65  ent is not prese
282d0 6e 74 2c 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74  nt, a NULL point
282e0 65 72 20 69 73 20 70 61 73 73 65 64 20 69 6e 73  er is passed ins
282f0 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77  tead..**.** If w
28300 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32  al_checkpoint_v2
28310 28 29 20 72 65 74 75 72 6e 73 20 61 6e 79 20 76  () returns any v
28320 61 6c 75 65 20 6f 74 68 65 72 20 74 68 61 6e 20  alue other than 
28330 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 0a 2a  SQLITE_BUSY or.*
28340 2a 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 74 68 65  * SQLITE_OK, the
28350 6e 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 72  n this command r
28360 65 74 75 72 6e 73 20 54 43 4c 5f 45 52 52 4f 52  eturns TCL_ERROR
28370 2e 20 54 68 65 20 54 63 6c 20 72 65 73 75 6c 74  . The Tcl result
28380 20 69 73 20 73 65 74 0a 2a 2a 20 74 6f 20 74 68   is set.** to th
28390 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
283a0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
283b0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29 2e 0a  lite3_errmsg()..
283c0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
283d0 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 72 65   this command re
283e0 74 75 72 6e 73 20 61 20 6c 69 73 74 20 6f 66 20  turns a list of 
283f0 74 68 72 65 65 20 69 6e 74 65 67 65 72 73 2e 20  three integers. 
28400 54 68 65 20 66 69 72 73 74 20 69 6e 74 65 67 65  The first intege
28410 72 0a 2a 2a 20 69 73 20 31 20 69 66 20 53 51 4c  r.** is 1 if SQL
28420 49 54 45 5f 42 55 53 59 20 77 61 73 20 72 65 74  ITE_BUSY was ret
28430 75 72 6e 65 64 2c 20 6f 72 20 30 20 6f 74 68 65  urned, or 0 othe
28440 72 77 69 73 65 2e 20 54 68 65 20 66 6f 6c 6c 6f  rwise. The follo
28450 77 69 6e 67 20 74 77 6f 20 69 6e 74 65 67 65 72  wing two integer
28460 73 0a 2a 2a 20 61 72 65 20 74 68 65 20 76 61 6c  s.** are the val
28470 75 65 73 20 72 65 74 75 72 6e 65 64 20 76 69 61  ues returned via
28480 20 74 68 65 20 6f 75 74 70 75 74 20 70 61 72 61   the output para
28490 6d 61 74 65 72 73 20 62 79 20 77 61 6c 5f 63 68  maters by wal_ch
284a0 65 63 6b 70 6f 69 6e 74 5f 76 32 28 29 20 2d 0a  eckpoint_v2() -.
284b0 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
284c0 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c   frames in the l
284d0 6f 67 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  og and the numbe
284e0 72 20 6f 66 20 66 72 61 6d 65 73 20 69 6e 20 74  r of frames in t
284f0 68 65 20 6c 6f 67 0a 2a 2a 20 74 68 61 74 20 68  he log.** that h
28500 61 76 65 20 62 65 65 6e 20 63 68 65 63 6b 70 6f  ave been checkpo
28510 69 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  inted..*/.static
28520 20 69 6e 74 20 74 65 73 74 5f 77 61 6c 5f 63 68   int test_wal_ch
28530 65 63 6b 70 6f 69 6e 74 5f 76 32 28 0a 20 20 43  eckpoint_v2(.  C
28540 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
28550 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20  Data, /* Unused 
28560 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
28570 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
28580 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
28590 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
285a0 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
285b0 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
285c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
285d0 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
285e0 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
285f0 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
28600 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
28610 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
28620 44 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  Db = 0;.  sqlite
28630 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
28640 0a 0a 20 20 69 6e 74 20 65 4d 6f 64 65 3b 0a 20  ..  int eMode;. 
28650 20 69 6e 74 20 6e 4c 6f 67 20 3d 20 2d 35 35 35   int nLog = -555
28660 3b 0a 20 20 69 6e 74 20 6e 43 6b 70 74 20 3d 20  ;.  int nCkpt = 
28670 2d 35 35 35 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  -555;.  Tcl_Obj 
28680 2a 70 52 65 74 3b 0a 0a 20 20 63 6f 6e 73 74 20  *pRet;..  const 
28690 63 68 61 72 20 2a 20 61 4d 6f 64 65 5b 5d 20 3d  char * aMode[] =
286a0 20 7b 20 22 70 61 73 73 69 76 65 22 2c 20 22 66   { "passive", "f
286b0 75 6c 6c 22 2c 20 22 72 65 73 74 61 72 74 22 2c  ull", "restart",
286c0 20 30 20 7d 3b 0a 20 20 61 73 73 65 72 74 28 20   0 };.  assert( 
286d0 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
286e0 54 5f 50 41 53 53 49 56 45 3d 3d 30 20 29 3b 0a  T_PASSIVE==0 );.
286f0 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
28700 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c  _CHECKPOINT_FULL
28710 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
28720 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
28730 4e 54 5f 52 45 53 54 41 52 54 3d 3d 32 20 29 3b  NT_RESTART==2 );
28740 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
28750 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  && objc!=4 ){.  
28760 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
28770 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
28780 6a 76 2c 20 22 44 42 20 4d 4f 44 45 20 3f 4e 41  jv, "DB MODE ?NA
28790 4d 45 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ME?");.    retur
287a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
287b0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20  ..  if( objc==4 
287c0 29 7b 0a 20 20 20 20 7a 44 62 20 3d 20 54 63 6c  ){.    zDb = Tcl
287d0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
287e0 33 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  3]);.  }.  if( g
287f0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
28800 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
28810 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
28820 0a 20 20 20 7c 7c 20 54 63 6c 5f 47 65 74 49 6e  .   || Tcl_GetIn
28830 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  dexFromObj(inter
28840 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 61 4d 6f 64  p, objv[2], aMod
28850 65 2c 20 22 6d 6f 64 65 22 2c 20 30 2c 20 26 65  e, "mode", 0, &e
28860 4d 6f 64 65 29 20 0a 20 20 29 7b 0a 20 20 20 20  Mode) .  ){.    
28870 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
28880 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71  ;.  }..  rc = sq
28890 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
288a0 6f 69 6e 74 5f 76 32 28 64 62 2c 20 7a 44 62 2c  oint_v2(db, zDb,
288b0 20 65 4d 6f 64 65 2c 20 26 6e 4c 6f 67 2c 20 26   eMode, &nLog, &
288c0 6e 43 6b 70 74 29 3b 0a 20 20 69 66 28 20 72 63  nCkpt);.  if( rc
288d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
288e0 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c!=SQLITE_BUSY )
288f0 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  {.    Tcl_SetRes
28900 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
28910 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d  r *)sqlite3_errm
28920 73 67 28 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41  sg(db), TCL_VOLA
28930 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 75 72  TILE);.    retur
28940 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
28950 0a 0a 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e  ..  pRet = Tcl_N
28960 65 77 4f 62 6a 28 29 3b 0a 20 20 54 63 6c 5f 4c  ewObj();.  Tcl_L
28970 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
28980 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ent(interp, pRet
28990 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
289a0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 3f  rc==SQLITE_BUSY?
289b0 31 3a 30 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  1:0));.  Tcl_Lis
289c0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
289d0 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
289e0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 4c  Tcl_NewIntObj(nL
289f0 6f 67 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  og));.  Tcl_List
28a00 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
28a10 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54  (interp, pRet, T
28a20 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 43 6b  cl_NewIntObj(nCk
28a30 70 74 29 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  pt));.  Tcl_SetO
28a40 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
28a50 20 70 52 65 74 29 3b 0a 0a 20 20 72 65 74 75 72   pRet);..  retur
28a60 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
28a70 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 74 65 73 74  ** tclcmd:  test
28a80 5f 73 71 6c 69 74 65 33 5f 6c 6f 67 20 3f 53 43  _sqlite3_log ?SC
28a90 52 49 50 54 3f 0a 2a 2f 0a 73 74 61 74 69 63 20  RIPT?.*/.static 
28aa0 73 74 72 75 63 74 20 4c 6f 67 43 61 6c 6c 62 61  struct LogCallba
28ab0 63 6b 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ck {.  Tcl_Inter
28ac0 70 20 2a 70 49 6e 74 65 72 70 3b 0a 20 20 54 63  p *pInterp;.  Tc
28ad0 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 3b 0a 7d 20 6c  l_Obj *pObj;.} l
28ae0 6f 67 63 61 6c 6c 62 61 63 6b 20 3d 20 7b 30 2c  ogcallback = {0,
28af0 20 30 7d 3b 0a 73 74 61 74 69 63 20 76 6f 69 64   0};.static void
28b00 20 78 4c 6f 67 63 61 6c 6c 62 61 63 6b 28 76 6f   xLogcallback(vo
28b10 69 64 20 2a 75 6e 75 73 65 64 2c 20 69 6e 74 20  id *unused, int 
28b20 65 72 72 2c 20 63 68 61 72 20 2a 7a 4d 73 67 29  err, char *zMsg)
28b30 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4e 65  {.  Tcl_Obj *pNe
28b40 77 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  w = Tcl_Duplicat
28b50 65 4f 62 6a 28 6c 6f 67 63 61 6c 6c 62 61 63 6b  eObj(logcallback
28b60 2e 70 4f 62 6a 29 3b 0a 20 20 54 63 6c 5f 49 6e  .pObj);.  Tcl_In
28b70 63 72 52 65 66 43 6f 75 6e 74 28 70 4e 65 77 29  crRefCount(pNew)
28b80 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
28b90 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 0a 20 20  ppendElement(.  
28ba0 20 20 20 20 30 2c 20 70 4e 65 77 2c 20 54 63 6c      0, pNew, Tcl
28bb0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71  _NewStringObj(sq
28bc0 6c 69 74 65 33 54 65 73 74 45 72 72 6f 72 4e 61  lite3TestErrorNa
28bd0 6d 65 28 65 72 72 29 2c 20 2d 31 29 0a 20 20 29  me(err), -1).  )
28be0 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
28bf0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
28c00 70 4e 65 77 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pNew, Tcl_NewStr
28c10 69 6e 67 4f 62 6a 28 7a 4d 73 67 2c 20 2d 31 29  ingObj(zMsg, -1)
28c20 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  );.  Tcl_EvalObj
28c30 45 78 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70  Ex(logcallback.p
28c40 49 6e 74 65 72 70 2c 20 70 4e 65 77 2c 20 54 43  Interp, pNew, TC
28c50 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 7c 54 43  L_EVAL_GLOBAL|TC
28c60 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a  L_EVAL_DIRECT);.
28c70 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
28c80 6e 74 28 70 4e 65 77 29 3b 0a 7d 0a 73 74 61 74  nt(pNew);.}.stat
28c90 69 63 20 69 6e 74 20 74 65 73 74 5f 73 71 6c 69  ic int test_sqli
28ca0 74 65 33 5f 6c 6f 67 28 0a 20 20 43 6c 69 65 6e  te3_log(.  Clien
28cb0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
28cc0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
28cd0 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
28ce0 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
28cf0 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
28d00 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
28d10 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
28d20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
28d30 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
28d40 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
28d50 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
28d60 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
28d70 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63  */.){.  if( objc
28d80 3e 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  >2 ){.    Tcl_Wr
28d90 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
28da0 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 43 52  p, 1, objv, "SCR
28db0 49 50 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72  IPT");.    retur
28dc0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
28dd0 0a 20 20 69 66 28 20 6c 6f 67 63 61 6c 6c 62 61  .  if( logcallba
28de0 63 6b 2e 70 4f 62 6a 20 29 7b 0a 20 20 20 20 54  ck.pObj ){.    T
28df0 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
28e00 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a  logcallback.pObj
28e10 29 3b 0a 20 20 20 20 6c 6f 67 63 61 6c 6c 62 61  );.    logcallba
28e20 63 6b 2e 70 4f 62 6a 20 3d 20 30 3b 0a 20 20 20  ck.pObj = 0;.   
28e30 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 49 6e   logcallback.pIn
28e40 74 65 72 70 20 3d 20 30 3b 0a 20 20 20 20 73 71  terp = 0;.    sq
28e50 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c  lite3_config(SQL
28e60 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 2c 20  ITE_CONFIG_LOG, 
28e70 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  0, 0);.  }.  if(
28e80 20 6f 62 6a 63 3e 31 20 29 7b 0a 20 20 20 20 6c   objc>1 ){.    l
28e90 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 20  ogcallback.pObj 
28ea0 3d 20 6f 62 6a 76 5b 31 5d 3b 0a 20 20 20 20 54  = objv[1];.    T
28eb0 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
28ec0 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a  logcallback.pObj
28ed0 29 3b 0a 20 20 20 20 6c 6f 67 63 61 6c 6c 62 61  );.    logcallba
28ee0 63 6b 2e 70 49 6e 74 65 72 70 20 3d 20 69 6e 74  ck.pInterp = int
28ef0 65 72 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  erp;.    sqlite3
28f00 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43  _config(SQLITE_C
28f10 4f 4e 46 49 47 5f 4c 4f 47 2c 20 78 4c 6f 67 63  ONFIG_LOG, xLogc
28f20 61 6c 6c 62 61 63 6b 2c 20 30 29 3b 0a 20 20 7d  allback, 0);.  }
28f30 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
28f40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 74  ;.}../*.**     t
28f50 63 6c 5f 6f 62 6a 70 72 6f 63 20 43 4f 4d 4d 41  cl_objproc COMMA
28f60 4e 44 4e 41 4d 45 20 41 52 47 53 2e 2e 2e 0a 2a  NDNAME ARGS....*
28f70 2a 0a 2a 2a 20 52 75 6e 20 61 20 54 43 4c 20 63  *.** Run a TCL c
28f80 6f 6d 6d 61 6e 64 20 75 73 69 6e 67 20 69 74 73  ommand using its
28f90 20 6f 62 6a 50 72 6f 63 20 69 6e 74 65 72 66 61   objProc interfa
28fa0 63 65 2e 20 20 54 68 72 6f 77 20 61 6e 20 65 72  ce.  Throw an er
28fb0 72 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f  ror if.** the co
28fc0 6d 6d 61 6e 64 20 68 61 73 20 6e 6f 20 6f 62 6a  mmand has no obj
28fd0 50 72 6f 63 20 69 6e 74 65 72 66 61 63 65 2e 0a  Proc interface..
28fe0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 75  */.static int ru
28ff0 6e 41 73 4f 62 6a 50 72 6f 63 28 0a 20 20 76 6f  nAsObjProc(.  vo
29000 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
29010 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
29020 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
29030 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
29040 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
29050 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49  Tcl_CmdInfo cmdI
29060 6e 66 6f 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3c  nfo;.  if( objc<
29070 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
29080 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
29090 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 43 4f 4d 4d  , 1, objv, "COMM
290a0 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72  AND ...");.    r
290b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
290c0 0a 20 20 7d 0a 20 20 69 66 28 20 21 54 63 6c 5f  .  }.  if( !Tcl_
290d0 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69  GetCommandInfo(i
290e0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
290f0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
29100 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  cmdInfo) ){.    
29110 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
29120 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e  (interp, "comman
29130 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 0a  d not found: ",.
29140 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47             Tcl_G
29150 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
29160 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
29170 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
29180 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6d  OR;.  }.  if( cm
29190 64 49 6e 66 6f 2e 6f 62 6a 50 72 6f 63 3d 3d 30  dInfo.objProc==0
291a0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
291b0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
291c0 20 22 63 6f 6d 6d 61 6e 64 20 68 61 73 20 6e 6f   "command has no
291d0 20 6f 62 6a 50 72 6f 63 3a 20 22 2c 0a 20 20 20   objProc: ",.   
291e0 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
291f0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
29200 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72  (char*)0);.    r
29210 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
29220 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6d  .  }.  return cm
29230 64 49 6e 66 6f 2e 6f 62 6a 50 72 6f 63 28 63 6d  dInfo.objProc(cm
29240 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44  dInfo.objClientD
29250 61 74 61 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a  ata, interp, obj
29260 63 2d 31 2c 20 6f 62 6a 76 2b 31 29 3b 0a 7d 0a  c-1, objv+1);.}.
29270 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
29280 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a  OMIT_EXPLAIN./*.
29290 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 54 68 65 20  ** WARNING: The 
292a0 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
292b0 6f 6e 2c 20 70 72 69 6e 74 45 78 70 6c 61 69 6e  on, printExplain
292c0 51 75 65 72 79 50 6c 61 6e 28 29 20 69 73 20 61  QueryPlan() is a
292d0 6e 20 65 78 61 63 74 0a 2a 2a 20 63 6f 70 79 20  n exact.** copy 
292e0 6f 66 20 65 78 61 6d 70 6c 65 20 63 6f 64 65 20  of example code 
292f0 66 72 6f 6d 20 65 71 70 2e 69 6e 20 28 65 71 70  from eqp.in (eqp
29300 2e 68 74 6d 6c 29 2e 20 49 66 20 74 68 69 73 20  .html). If this 
29310 63 6f 64 65 20 69 73 20 6d 6f 64 69 66 69 65 64  code is modified
29320 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 64 6f  ,.** then the do
29330 63 75 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 70 79  cumentation copy
29340 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6d 6f 64   needs to be mod
29350 69 66 69 65 64 20 61 73 20 77 65 6c 6c 2e 0a 2a  ified as well..*
29360 2f 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  /./*.** Argument
29370 20 70 53 74 6d 74 20 69 73 20 61 20 70 72 65 70   pStmt is a prep
29380 61 72 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65  ared SQL stateme
29390 6e 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  nt. This functio
293a0 6e 20 63 6f 6d 70 69 6c 65 73 0a 2a 2a 20 61 6e  n compiles.** an
293b0 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
293c0 4c 41 4e 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 72  LAN command to r
293d0 65 70 6f 72 74 20 6f 6e 20 74 68 65 20 70 72 65  eport on the pre
293e0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2c  pared statement,
293f0 0a 2a 2a 20 61 6e 64 20 70 72 69 6e 74 73 20 74  .** and prints t
29400 68 65 20 72 65 70 6f 72 74 20 74 6f 20 73 74 64  he report to std
29410 6f 75 74 20 75 73 69 6e 67 20 70 72 69 6e 74 66  out using printf
29420 28 29 2e 0a 2a 2f 0a 69 6e 74 20 70 72 69 6e 74  ()..*/.int print
29430 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
29440 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70  (sqlite3_stmt *p
29450 53 74 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63  Stmt){.  const c
29460 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20  har *zSql;      
29470 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75           /* Inpu
29480 74 20 53 51 4c 20 2a 2f 0a 20 20 63 68 61 72 20  t SQL */.  char 
29490 2a 7a 45 78 70 6c 61 69 6e 3b 20 20 20 20 20 20  *zExplain;      
294a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
294b0 4c 20 77 69 74 68 20 45 58 50 4c 41 49 4e 20 51  L with EXPLAIN Q
294c0 55 45 52 59 20 50 4c 41 4e 20 70 72 65 70 65 6e  UERY PLAN prepen
294d0 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ded */.  sqlite3
294e0 5f 73 74 6d 74 20 2a 70 45 78 70 6c 61 69 6e 3b  _stmt *pExplain;
294f0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
29500 69 6c 65 64 20 45 58 50 4c 41 49 4e 20 51 55 45  iled EXPLAIN QUE
29510 52 59 20 50 4c 41 4e 20 63 6f 6d 6d 61 6e 64 20  RY PLAN command 
29520 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
29530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29540 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
29550 6f 64 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ode from sqlite3
29560 5f 70 72 65 70 61 72 65 5f 76 32 28 29 20 2a 2f  _prepare_v2() */
29570 0a 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ..  zSql = sqlit
29580 65 33 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20  e3_sql(pStmt);. 
29590 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72   if( zSql==0 ) r
295a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
295b0 4f 52 3b 0a 0a 20 20 7a 45 78 70 6c 61 69 6e 20  OR;..  zExplain 
295c0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
295d0 66 28 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59  f("EXPLAIN QUERY
295e0 20 50 4c 41 4e 20 25 73 22 2c 20 7a 53 71 6c 29   PLAN %s", zSql)
295f0 3b 0a 20 20 69 66 28 20 7a 45 78 70 6c 61 69 6e  ;.  if( zExplain
29600 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
29610 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 72 63  ITE_NOMEM;..  rc
29620 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
29630 72 65 5f 76 32 28 73 71 6c 69 74 65 33 5f 64 62  re_v2(sqlite3_db
29640 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 2c 20  _handle(pStmt), 
29650 7a 45 78 70 6c 61 69 6e 2c 20 2d 31 2c 20 26 70  zExplain, -1, &p
29660 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 73  Explain, 0);.  s
29670 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 78 70  qlite3_free(zExp
29680 6c 61 69 6e 29 3b 0a 20 20 69 66 28 20 72 63 21  lain);.  if( rc!
29690 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
296a0 75 72 6e 20 72 63 3b 0a 0a 20 20 77 68 69 6c 65  urn rc;..  while
296b0 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
296c0 6c 69 74 65 33 5f 73 74 65 70 28 70 45 78 70 6c  lite3_step(pExpl
296d0 61 69 6e 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  ain) ){.    int 
296e0 69 53 65 6c 65 63 74 69 64 20 3d 20 73 71 6c 69  iSelectid = sqli
296f0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
29700 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20  Explain, 0);.   
29710 20 69 6e 74 20 69 4f 72 64 65 72 20 3d 20 73 71   int iOrder = sq
29720 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
29730 28 70 45 78 70 6c 61 69 6e 2c 20 31 29 3b 0a 20  (pExplain, 1);. 
29740 20 20 20 69 6e 74 20 69 46 72 6f 6d 20 3d 20 73     int iFrom = s
29750 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
29760 74 28 70 45 78 70 6c 61 69 6e 2c 20 32 29 3b 0a  t(pExplain, 2);.
29770 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
29780 7a 44 65 74 61 69 6c 20 3d 20 28 63 6f 6e 73 74  zDetail = (const
29790 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f   char *)sqlite3_
297a0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 45 78 70  column_text(pExp
297b0 6c 61 69 6e 2c 20 33 29 3b 0a 0a 20 20 20 20 70  lain, 3);..    p
297c0 72 69 6e 74 66 28 22 25 64 20 25 64 20 25 64 20  rintf("%d %d %d 
297d0 25 73 5c 6e 22 2c 20 69 53 65 6c 65 63 74 69 64  %s\n", iSelectid
297e0 2c 20 69 4f 72 64 65 72 2c 20 69 46 72 6f 6d 2c  , iOrder, iFrom,
297f0 20 7a 44 65 74 61 69 6c 29 3b 0a 20 20 7d 0a 0a   zDetail);.  }..
29800 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
29810 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c 61  _finalize(pExpla
29820 69 6e 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  in);.}..static i
29830 6e 74 20 74 65 73 74 5f 70 72 69 6e 74 5f 65 71  nt test_print_eq
29840 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  p(.  void * clie
29850 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
29860 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
29870 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
29880 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
29890 5d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ].){.  int rc;. 
298a0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
298b0 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  Stmt;..  if( obj
298c0 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
298d0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
298e0 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
298f0 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72  TMT");.    retur
29900 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
29910 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
29920 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
29930 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
29940 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
29950 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
29960 3b 0a 20 20 72 63 20 3d 20 70 72 69 6e 74 45 78  ;.  rc = printEx
29970 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 70  plainQueryPlan(p
29980 53 74 6d 74 29 3b 0a 20 20 2f 2a 20 54 68 69 73  Stmt);.  /* This
29990 20 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 57 69   is needed on Wi
299a0 6e 64 6f 77 73 20 73 6f 20 74 68 61 74 20 61 20  ndows so that a 
299b0 74 65 73 74 20 63 61 73 65 20 75 73 69 6e 67 20  test case using 
299c0 74 68 69 73 20 0a 20 20 2a 2a 20 66 75 6e 63 74  this .  ** funct
299d0 69 6f 6e 20 63 61 6e 20 6f 70 65 6e 20 61 20 72  ion can open a r
299e0 65 61 64 20 70 69 70 65 20 61 6e 64 20 67 65 74  ead pipe and get
299f0 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 0a 20   the output of. 
29a00 20 2a 2a 20 70 72 69 6e 74 45 78 70 6c 61 69 6e   ** printExplain
29a10 51 75 65 72 79 50 6c 61 6e 28 29 20 69 6d 6d 65  QueryPlan() imme
29a20 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  diately..  */.  
29a30 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a  fflush(stdout);.
29a40 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
29a50 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
29a60 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  t1ErrorName(rc),
29a70 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43   0);.  return TC
29a80 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  L_OK;.}.#endif /
29a90 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  * SQLITE_OMIT_EX
29aa0 50 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  PLAIN */../*.** 
29ab0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
29ac0 74 72 6f 6c 20 56 45 52 42 20 41 52 47 53 2e 2e  trol VERB ARGS..
29ad0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29ae0 74 65 73 74 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  test_test_contro
29af0 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  l(.  void * clie
29b00 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
29b10 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
29b20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
29b30 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
29b40 5d 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 56 65  ].){.  struct Ve
29b50 72 62 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  rb {.    const c
29b60 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
29b70 69 6e 74 20 69 3b 0a 20 20 7d 20 61 56 65 72 62  int i;.  } aVerb
29b80 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 53 51  [] = {.    { "SQ
29b90 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f  LITE_TESTCTRL_LO
29ba0 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 22 2c 20  CALTIME_FAULT", 
29bb0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
29bc0 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 20  LOCALTIME_FAULT 
29bd0 7d 2c 20 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69  }, .  };.  int i
29be0 56 65 72 62 3b 0a 20 20 69 6e 74 20 69 46 6c 61  Verb;.  int iFla
29bf0 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  g;.  int rc;..  
29c00 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20  if( objc<2 ){.  
29c10 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
29c20 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
29c30 6a 76 2c 20 22 56 45 52 42 20 41 52 47 53 2e 2e  jv, "VERB ARGS..
29c40 2e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  .");.    return 
29c50 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
29c60 20 20 72 63 20 3d 20 54 63 6c 5f 47 65 74 49 6e    rc = Tcl_GetIn
29c70 64 65 78 46 72 6f 6d 4f 62 6a 53 74 72 75 63 74  dexFromObjStruct
29c80 28 0a 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20  (.      interp, 
29c90 6f 62 6a 76 5b 31 5d 2c 20 61 56 65 72 62 2c 20  objv[1], aVerb, 
29ca0 73 69 7a 65 6f 66 28 61 56 65 72 62 5b 30 5d 29  sizeof(aVerb[0])
29cb0 2c 20 22 56 45 52 42 22 2c 20 30 2c 20 26 69 56  , "VERB", 0, &iV
29cc0 65 72 62 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  erb.  );.  if( r
29cd0 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72 65 74 75  c!=TCL_OK ) retu
29ce0 72 6e 20 72 63 3b 0a 0a 20 20 69 46 6c 61 67 20  rn rc;..  iFlag 
29cf0 3d 20 61 56 65 72 62 5b 69 56 65 72 62 5d 2e 69  = aVerb[iVerb].i
29d00 3b 0a 20 20 73 77 69 74 63 68 28 20 69 46 6c 61  ;.  switch( iFla
29d10 67 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  g ){.    case SQ
29d20 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f  LITE_TESTCTRL_LO
29d30 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 3a 20 7b  CALTIME_FAULT: {
29d40 0a 20 20 20 20 20 20 69 6e 74 20 76 61 6c 3b 0a  .      int val;.
29d50 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d        if( objc!=
29d60 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  3 ){.        Tcl
29d70 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
29d80 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
29d90 4f 4e 4f 46 46 22 29 3b 0a 20 20 20 20 20 20 20  ONOFF");.       
29da0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
29db0 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
29dc0 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c   if( Tcl_GetBool
29dd0 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
29de0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61 6c  p, objv[2], &val
29df0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
29e00 52 52 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c 69  RROR;.      sqli
29e10 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
29e20 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
29e30 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54  _LOCALTIME_FAULT
29e40 2c 20 76 61 6c 29 3b 0a 20 20 20 20 20 20 62 72  , val);.      br
29e50 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
29e60 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
29e70 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65 74  t(interp);.  ret
29e80 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23  urn TCL_OK;.}..#
29e90 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
29ea0 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69  ./*.** Informati
29eb0 6f 6e 20 70 61 73 73 65 64 20 66 72 6f 6d 20 74  on passed from t
29ec0 68 65 20 6d 61 69 6e 20 74 68 72 65 61 64 20 69  he main thread i
29ed0 6e 74 6f 20 74 68 65 20 77 69 6e 64 6f 77 73 20  nto the windows 
29ee0 66 69 6c 65 20 6c 6f 63 6b 65 72 0a 2a 2a 20 62  file locker.** b
29ef0 61 63 6b 67 72 6f 75 6e 64 20 74 68 72 65 61 64  ackground thread
29f00 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 33  ..*/.struct win3
29f10 32 46 69 6c 65 4c 6f 63 6b 65 72 20 7b 0a 20 20  2FileLocker {.  
29f20 63 68 61 72 20 2a 65 76 4e 61 6d 65 3b 20 20 20  char *evName;   
29f30 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 65      /* Name of e
29f40 76 65 6e 74 20 74 6f 20 73 69 67 6e 61 6c 20 74  vent to signal t
29f50 68 72 65 61 64 20 73 74 61 72 74 75 70 20 2a 2f  hread startup */
29f60 0a 20 20 48 41 4e 44 4c 45 20 68 3b 20 20 20 20  .  HANDLE h;    
29f70 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
29f80 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20   of the file to 
29f90 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 69  be locked */.  i
29fa0 6e 74 20 64 65 6c 61 79 31 3b 20 20 20 20 20 20  nt delay1;      
29fb0 20 20 20 2f 2a 20 44 65 6c 61 79 20 62 65 66 6f     /* Delay befo
29fc0 72 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20  re locking */.  
29fd0 69 6e 74 20 64 65 6c 61 79 32 3b 20 20 20 20 20  int delay2;     
29fe0 20 20 20 20 2f 2a 20 44 65 6c 61 79 20 62 65 66      /* Delay bef
29ff0 6f 72 65 20 75 6e 6c 6f 63 6b 69 6e 67 20 2a 2f  ore unlocking */
2a000 0a 20 20 69 6e 74 20 6f 6b 3b 20 20 20 20 20 20  .  int ok;      
2a010 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 69 73 68         /* Finish
2a020 65 64 20 6f 6b 20 2a 2f 0a 20 20 69 6e 74 20 65  ed ok */.  int e
2a030 72 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  rr;            /
2a040 2a 20 54 72 75 65 20 69 66 20 61 6e 20 65 72 72  * True if an err
2a050 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a 7d 3b 0a  or occurs */.};.
2a060 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20 53 51 4c  #endif...#if SQL
2a070 49 54 45 5f 4f 53 5f 57 49 4e 0a 23 69 6e 63 6c  ITE_OS_WIN.#incl
2a080 75 64 65 20 3c 70 72 6f 63 65 73 73 2e 68 3e 0a  ude <process.h>.
2a090 2f 2a 0a 2a 2a 20 54 68 65 20 62 61 63 6b 67 72  /*.** The backgr
2a0a0 6f 75 6e 64 20 74 68 72 65 61 64 20 74 68 61 74  ound thread that
2a0b0 20 64 6f 65 73 20 66 69 6c 65 20 6c 6f 63 6b 69   does file locki
2a0c0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
2a0d0 69 64 20 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f  id win32_file_lo
2a0e0 63 6b 65 72 28 76 6f 69 64 20 2a 70 41 70 70 44  cker(void *pAppD
2a0f0 61 74 61 29 7b 0a 20 20 73 74 72 75 63 74 20 77  ata){.  struct w
2a100 69 6e 33 32 46 69 6c 65 4c 6f 63 6b 65 72 20 2a  in32FileLocker *
2a110 70 20 3d 20 28 73 74 72 75 63 74 20 77 69 6e 33  p = (struct win3
2a120 32 46 69 6c 65 4c 6f 63 6b 65 72 2a 29 70 41 70  2FileLocker*)pAp
2a130 70 44 61 74 61 3b 0a 20 20 69 66 28 20 70 2d 3e  pData;.  if( p->
2a140 65 76 4e 61 6d 65 20 29 7b 0a 20 20 20 20 48 41  evName ){.    HA
2a150 4e 44 4c 45 20 65 76 20 3d 20 4f 70 65 6e 45 76  NDLE ev = OpenEv
2a160 65 6e 74 28 45 56 45 4e 54 5f 4d 4f 44 49 46 59  ent(EVENT_MODIFY
2a170 5f 53 54 41 54 45 2c 20 46 41 4c 53 45 2c 20 70  _STATE, FALSE, p
2a180 2d 3e 65 76 4e 61 6d 65 29 3b 0a 20 20 20 20 69  ->evName);.    i
2a190 66 20 28 20 65 76 20 29 7b 0a 20 20 20 20 20 20  f ( ev ){.      
2a1a0 53 65 74 45 76 65 6e 74 28 65 76 29 3b 0a 20 20  SetEvent(ev);.  
2a1b0 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28      CloseHandle(
2a1c0 65 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ev);.    }.  }. 
2a1d0 20 69 66 28 20 70 2d 3e 64 65 6c 61 79 31 20 29   if( p->delay1 )
2a1e0 20 53 6c 65 65 70 28 70 2d 3e 64 65 6c 61 79 31   Sleep(p->delay1
2a1f0 29 3b 0a 20 20 69 66 28 20 4c 6f 63 6b 46 69 6c  );.  if( LockFil
2a200 65 28 70 2d 3e 68 2c 20 30 2c 20 30 2c 20 31 30  e(p->h, 0, 0, 10
2a210 30 30 30 30 30 30 30 2c 20 30 29 20 29 7b 0a 20  0000000, 0) ){. 
2a220 20 20 20 53 6c 65 65 70 28 70 2d 3e 64 65 6c 61     Sleep(p->dela
2a230 79 32 29 3b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46  y2);.    UnlockF
2a240 69 6c 65 28 70 2d 3e 68 2c 20 30 2c 20 30 2c 20  ile(p->h, 0, 0, 
2a250 31 30 30 30 30 30 30 30 30 2c 20 30 29 3b 0a 20  100000000, 0);. 
2a260 20 20 20 70 2d 3e 6f 6b 20 3d 20 31 3b 0a 20 20     p->ok = 1;.  
2a270 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 65 72  }else{.    p->er
2a280 72 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 43 6c 6f  r = 1;.  }.  Clo
2a290 73 65 48 61 6e 64 6c 65 28 70 2d 3e 68 29 3b 0a  seHandle(p->h);.
2a2a0 20 20 70 2d 3e 68 20 3d 20 30 3b 0a 20 20 70 2d    p->h = 0;.  p-
2a2b0 3e 64 65 6c 61 79 31 20 3d 20 30 3b 0a 20 20 70  >delay1 = 0;.  p
2a2c0 2d 3e 64 65 6c 61 79 32 20 3d 20 30 3b 0a 7d 0a  ->delay2 = 0;.}.
2a2d0 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
2a2e0 54 45 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20  TE_OS_WIN./*.** 
2a2f0 20 20 20 20 20 6c 6f 63 6b 5f 77 69 6e 33 32 5f       lock_win32_
2a300 66 69 6c 65 20 46 49 4c 45 4e 41 4d 45 20 44 45  file FILENAME DE
2a310 4c 41 59 31 20 44 45 4c 41 59 32 0a 2a 2a 0a 2a  LAY1 DELAY2.**.*
2a320 2a 20 47 65 74 20 61 6e 20 65 78 63 6c 75 73 69  * Get an exclusi
2a330 76 65 20 6d 61 6e 64 69 74 6f 72 79 20 6c 6f 63  ve manditory loc
2a340 6b 20 6f 6e 20 66 69 6c 65 20 66 6f 72 20 44 45  k on file for DE
2a350 4c 41 59 32 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  LAY2 millisecond
2a360 73 2e 0a 2a 2a 20 57 61 69 74 20 44 45 4c 41 59  s..** Wait DELAY
2a370 31 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62  1 milliseconds b
2a380 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20  efore acquiring 
2a390 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61  the lock..*/.sta
2a3a0 74 69 63 20 69 6e 74 20 77 69 6e 33 32 5f 66 69  tic int win32_fi
2a3b0 6c 65 5f 6c 6f 63 6b 28 0a 20 20 76 6f 69 64 20  le_lock(.  void 
2a3c0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
2a3d0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2a3e0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
2a3f0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
2a400 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74 61   objv[].){.  sta
2a410 74 69 63 20 73 74 72 75 63 74 20 77 69 6e 33 32  tic struct win32
2a420 46 69 6c 65 4c 6f 63 6b 65 72 20 78 20 3d 20 7b  FileLocker x = {
2a430 20 22 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63   "win32_file_loc
2a440 6b 22 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  k", 0, 0, 0, 0, 
2a450 30 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  0 };.  const cha
2a460 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  r *zFilename;.  
2a470 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a  char zBuf[200];.
2a480 20 20 69 6e 74 20 72 65 74 72 79 20 3d 20 30 3b    int retry = 0;
2a490 0a 20 20 48 41 4e 44 4c 45 20 65 76 3b 0a 20 20  .  HANDLE ev;.  
2a4a0 44 57 4f 52 44 20 77 52 65 73 75 6c 74 3b 0a 20  DWORD wResult;. 
2a4b0 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20   .  if( objc!=4 
2a4c0 26 26 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20  && objc!=1 ){.  
2a4d0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
2a4e0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
2a4f0 6a 76 2c 20 22 46 49 4c 45 4e 41 4d 45 20 44 45  jv, "FILENAME DE
2a500 4c 41 59 31 20 44 45 4c 41 59 32 22 29 3b 0a 20  LAY1 DELAY2");. 
2a510 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2a520 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  ROR;.  }.  if( o
2a530 62 6a 63 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71  bjc==1 ){.    sq
2a540 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
2a550 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75  izeof(zBuf), zBu
2a560 66 2c 20 22 25 64 20 25 64 20 25 64 20 25 64 20  f, "%d %d %d %d 
2a570 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %d",.           
2a580 20 20 20 20 20 20 20 20 20 20 78 2e 6f 6b 2c 20            x.ok, 
2a590 78 2e 65 72 72 2c 20 78 2e 64 65 6c 61 79 31 2c  x.err, x.delay1,
2a5a0 20 78 2e 64 65 6c 61 79 32 2c 20 78 2e 68 29 3b   x.delay2, x.h);
2a5b0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
2a5c0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
2a5d0 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  uf, (char*)0);. 
2a5e0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
2a5f0 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 78  ;.  }.  while( x
2a600 2e 68 20 26 26 20 72 65 74 72 79 3c 33 30 20 29  .h && retry<30 )
2a610 7b 0a 20 20 20 20 72 65 74 72 79 2b 2b 3b 0a 20  {.    retry++;. 
2a620 20 20 20 53 6c 65 65 70 28 31 30 30 29 3b 0a 20     Sleep(100);. 
2a630 20 7d 0a 20 20 69 66 28 20 78 2e 68 20 29 7b 0a   }.  if( x.h ){.
2a640 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
2a650 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 75  sult(interp, "bu
2a660 73 79 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  sy", (char*)0);.
2a670 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2a680 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
2a690 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
2a6a0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
2a6b0 5d 2c 20 26 78 2e 64 65 6c 61 79 31 29 20 29 20  ], &x.delay1) ) 
2a6c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2a6d0 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
2a6e0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
2a6f0 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 78 2e 64 65  , objv[3], &x.de
2a700 6c 61 79 32 29 20 29 20 72 65 74 75 72 6e 20 54  lay2) ) return T
2a710 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 46 69 6c  CL_ERROR;.  zFil
2a720 65 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  ename = Tcl_GetS
2a730 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a  tring(objv[1]);.
2a740 20 20 78 2e 68 20 3d 20 43 72 65 61 74 65 46 69    x.h = CreateFi
2a750 6c 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 47 45  le(zFilename, GE
2a760 4e 45 52 49 43 5f 52 45 41 44 7c 47 45 4e 45 52  NERIC_READ|GENER
2a770 49 43 5f 57 52 49 54 45 2c 0a 20 20 20 20 20 20  IC_WRITE,.      
2a780 20 20 20 20 20 20 20 20 46 49 4c 45 5f 53 48 41          FILE_SHA
2a790 52 45 5f 52 45 41 44 7c 46 49 4c 45 5f 53 48 41  RE_READ|FILE_SHA
2a7a0 52 45 5f 57 52 49 54 45 2c 20 30 2c 20 4f 50 45  RE_WRITE, 0, OPE
2a7b0 4e 5f 41 4c 57 41 59 53 2c 0a 20 20 20 20 20 20  N_ALWAYS,.      
2a7c0 20 20 20 20 20 20 20 20 46 49 4c 45 5f 41 54 54          FILE_ATT
2a7d0 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 2c 20 30  RIBUTE_NORMAL, 0
2a7e0 29 3b 0a 20 20 69 66 28 20 21 78 2e 68 20 29 7b  );.  if( !x.h ){
2a7f0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
2a800 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63  esult(interp, "c
2a810 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a  annot open file:
2a820 20 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28   ", zFilename, (
2a830 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65  char*)0);.    re
2a840 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2a850 20 20 7d 0a 20 20 65 76 20 3d 20 43 72 65 61 74    }.  ev = Creat
2a860 65 45 76 65 6e 74 28 4e 55 4c 4c 2c 20 54 52 55  eEvent(NULL, TRU
2a870 45 2c 20 46 41 4c 53 45 2c 20 78 2e 65 76 4e 61  E, FALSE, x.evNa
2a880 6d 65 29 3b 0a 20 20 69 66 20 28 20 21 65 76 20  me);.  if ( !ev 
2a890 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
2a8a0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2a8b0 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 65  "cannot create e
2a8c0 76 65 6e 74 3a 20 22 2c 20 78 2e 65 76 4e 61 6d  vent: ", x.evNam
2a8d0 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  e, (char*)0);.  
2a8e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2a8f0 4f 52 3b 0a 20 20 7d 0a 20 20 5f 62 65 67 69 6e  OR;.  }.  _begin
2a900 74 68 72 65 61 64 28 77 69 6e 33 32 5f 66 69 6c  thread(win32_fil
2a910 65 5f 6c 6f 63 6b 65 72 2c 20 30 2c 20 28 76 6f  e_locker, 0, (vo
2a920 69 64 2a 29 26 78 29 3b 0a 20 20 53 6c 65 65 70  id*)&x);.  Sleep
2a930 28 30 29 3b 0a 20 20 69 66 20 28 20 28 77 52 65  (0);.  if ( (wRe
2a940 73 75 6c 74 20 3d 20 57 61 69 74 46 6f 72 53 69  sult = WaitForSi
2a950 6e 67 6c 65 4f 62 6a 65 63 74 28 65 76 2c 20 31  ngleObject(ev, 1
2a960 30 30 30 30 29 29 21 3d 57 41 49 54 5f 4f 42 4a  0000))!=WAIT_OBJ
2a970 45 43 54 5f 30 20 29 7b 0a 20 20 20 20 73 71 6c  ECT_0 ){.    sql
2a980 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
2a990 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66  zeof(zBuf), zBuf
2a9a0 2c 20 22 30 78 25 78 22 2c 20 77 52 65 73 75 6c  , "0x%x", wResul
2a9b0 74 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  t);.    Tcl_Appe
2a9c0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2a9d0 20 22 77 61 69 74 20 66 61 69 6c 65 64 3a 20 22   "wait failed: "
2a9e0 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30  , zBuf, (char*)0
2a9f0 29 3b 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e 64  );.    CloseHand
2aa00 6c 65 28 65 76 29 3b 0a 20 20 20 20 72 65 74 75  le(ev);.    retu
2aa10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2aa20 7d 0a 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28  }.  CloseHandle(
2aa30 65 76 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ev);.  return TC
2aa40 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  L_OK;.}.#endif..
2aa50 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 6f 70 74 69  ./*.**      opti
2aa60 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c  mization_control
2aa70 20 44 42 20 4f 50 54 20 42 4f 4f 4c 45 41 4e 0a   DB OPT BOOLEAN.
2aa80 2a 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20  **.** Enable or 
2aa90 64 69 73 61 62 6c 65 20 71 75 65 72 79 20 6f 70  disable query op
2aaa0 74 69 6d 69 7a 61 74 69 6f 6e 73 20 75 73 69 6e  timizations usin
2aab0 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 74 65  g the sqlite3_te
2aac0 73 74 5f 63 6f 6e 74 72 6f 6c 28 29 0a 2a 2a 20  st_control().** 
2aad0 69 6e 74 65 72 66 61 63 65 2e 20 20 44 69 73 61  interface.  Disa
2aae0 62 6c 65 20 69 66 20 42 4f 4f 4c 45 41 4e 20 69  ble if BOOLEAN i
2aaf0 73 20 66 61 6c 73 65 20 61 6e 64 20 65 6e 61 62  s false and enab
2ab00 6c 65 20 69 66 20 42 4f 4f 4c 45 41 4e 20 69 73  le if BOOLEAN is
2ab10 20 74 72 75 65 2e 0a 2a 2a 20 4f 50 54 20 69 73   true..** OPT is
2ab20 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
2ab30 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 6f   optimization to
2ab40 20 62 65 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2f   be disabled..*/
2ab50 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 74 69  .static int opti
2ab60 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c  mization_control
2ab70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
2ab80 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
2ab90 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
2aba0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
2abb0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
2abc0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  .){.  int i;.  s
2abd0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
2abe0 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a  nst char *zOpt;.
2abf0 20 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a 20 20 69    int onoff;.  i
2ac00 6e 74 20 6d 61 73 6b 3b 0a 20 20 73 74 61 74 69  nt mask;.  stati
2ac10 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b  c const struct {
2ac20 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
2ac30 2a 7a 4f 70 74 4e 61 6d 65 3b 0a 20 20 20 20 69  *zOptName;.    i
2ac40 6e 74 20 6d 61 73 6b 3b 0a 20 20 7d 20 61 4f 70  nt mask;.  } aOp
2ac50 74 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 61  t[] = {.    { "a
2ac60 6c 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ll",            
2ac70 20 20 53 51 4c 49 54 45 5f 4f 70 74 4d 61 73 6b    SQLITE_OptMask
2ac80 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
2ac90 20 22 71 75 65 72 79 2d 66 6c 61 74 74 65 6e 65   "query-flattene
2aca0 72 22 2c 20 20 53 51 4c 49 54 45 5f 51 75 65 72  r",  SQLITE_Quer
2acb0 79 46 6c 61 74 74 65 6e 65 72 20 7d 2c 0a 20 20  yFlattener },.  
2acc0 20 20 7b 20 22 63 6f 6c 75 6d 6e 2d 63 61 63 68    { "column-cach
2acd0 65 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 43  e",     SQLITE_C
2ace0 6f 6c 75 6d 6e 43 61 63 68 65 20 20 20 20 7d 2c  olumnCache    },
2acf0 0a 20 20 20 20 7b 20 22 69 6e 64 65 78 2d 73 6f  .    { "index-so
2ad00 72 74 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54  rt",       SQLIT
2ad10 45 5f 49 6e 64 65 78 53 6f 72 74 20 20 20 20 20  E_IndexSort     
2ad20 20 7d 2c 0a 20 20 20 20 7b 20 22 69 6e 64 65 78   },.    { "index
2ad30 2d 73 65 61 72 63 68 22 2c 20 20 20 20 20 53 51  -search",     SQ
2ad40 4c 49 54 45 5f 49 6e 64 65 78 53 65 61 72 63 68  LITE_IndexSearch
2ad50 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69 6e      },.    { "in
2ad60 64 65 78 2d 63 6f 76 65 72 22 2c 20 20 20 20 20  dex-cover",     
2ad70 20 53 51 4c 49 54 45 5f 49 6e 64 65 78 43 6f 76   SQLITE_IndexCov
2ad80 65 72 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20  er     },.    { 
2ad90 22 67 72 6f 75 70 62 79 2d 6f 72 64 65 72 22 2c  "groupby-order",
2ada0 20 20 20 20 53 51 4c 49 54 45 5f 47 72 6f 75 70      SQLITE_Group
2adb0 42 79 4f 72 64 65 72 20 20 20 7d 2c 0a 20 20 20  ByOrder   },.   
2adc0 20 7b 20 22 66 61 63 74 6f 72 2d 63 6f 6e 73 74   { "factor-const
2add0 61 6e 74 73 22 2c 20 53 51 4c 49 54 45 5f 46 61  ants", SQLITE_Fa
2ade0 63 74 6f 72 4f 75 74 43 6f 6e 73 74 20 7d 2c 0a  ctorOutConst },.
2adf0 20 20 20 20 7b 20 22 72 65 61 6c 2d 61 73 2d 69      { "real-as-i
2ae00 6e 74 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45  nt",      SQLITE
2ae10 5f 49 64 78 52 65 61 6c 41 73 49 6e 74 20 20 20  _IdxRealAsInt   
2ae20 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f  },.  };..  if( o
2ae30 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
2ae40 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
2ae50 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
2ae60 22 44 42 20 4f 50 54 20 42 4f 4f 4c 45 41 4e 22  "DB OPT BOOLEAN"
2ae70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2ae80 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
2ae90 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
2aea0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
2aeb0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
2aec0 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
2aed0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
2aee0 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
2aef0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
2af00 76 5b 33 5d 2c 20 26 6f 6e 6f 66 66 29 20 29 20  v[3], &onoff) ) 
2af10 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2af20 3b 0a 20 20 7a 4f 70 74 20 3d 20 54 63 6c 5f 47  ;.  zOpt = Tcl_G
2af30 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
2af40 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
2af50 73 69 7a 65 6f 66 28 61 4f 70 74 29 2f 73 69 7a  sizeof(aOpt)/siz
2af60 65 6f 66 28 61 4f 70 74 5b 30 5d 29 3b 20 69 2b  eof(aOpt[0]); i+
2af70 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63  +){.    if( strc
2af80 6d 70 28 7a 4f 70 74 2c 20 61 4f 70 74 5b 69 5d  mp(zOpt, aOpt[i]
2af90 2e 7a 4f 70 74 4e 61 6d 65 29 3d 3d 30 20 29 7b  .zOptName)==0 ){
2afa0 0a 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 61 4f  .      mask = aO
2afb0 70 74 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20  pt[i].mask;.    
2afc0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2afd0 20 7d 0a 20 20 69 66 28 20 6f 6e 6f 66 66 20 29   }.  if( onoff )
2afe0 20 6d 61 73 6b 20 3d 20 7e 6d 61 73 6b 3b 0a 20   mask = ~mask;. 
2aff0 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28 61   if( i>=sizeof(a
2b000 4f 70 74 29 2f 73 69 7a 65 6f 66 28 61 4f 70 74  Opt)/sizeof(aOpt
2b010 5b 30 5d 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f  [0]) ){.    Tcl_
2b020 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
2b030 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70  erp, "unknown op
2b040 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 73 68 6f  timization - sho
2b050 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a 22 2c  uld be one of:",
2b060 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b070 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b        (char*)0);
2b080 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2b090 73 69 7a 65 6f 66 28 61 4f 70 74 29 2f 73 69 7a  sizeof(aOpt)/siz
2b0a0 65 6f 66 28 61 4f 70 74 5b 30 5d 29 3b 20 69 2b  eof(aOpt[0]); i+
2b0b0 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  +){.      Tcl_Ap
2b0c0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
2b0d0 70 2c 20 22 20 22 2c 20 61 4f 70 74 5b 69 5d 2e  p, " ", aOpt[i].
2b0e0 7a 4f 70 74 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  zOptName);.    }
2b0f0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2b100 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c  ERROR;.  }.  sql
2b110 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
2b120 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
2b130 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c  L_OPTIMIZATIONS,
2b140 20 64 62 2c 20 6d 61 73 6b 29 3b 0a 20 20 72 65   db, mask);.  re
2b150 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
2b160 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 63  /*.** Register c
2b170 6f 6d 6d 61 6e 64 73 20 77 69 74 68 20 74 68 65  ommands with the
2b180 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
2b190 2e 0a 2a 2f 0a 69 6e 74 20 53 71 6c 69 74 65 74  ..*/.int Sqlitet
2b1a0 65 73 74 31 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est1_Init(Tcl_In
2b1b0 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20  terp *interp){. 
2b1c0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
2b1d0 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
2b1e0 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
2b1f0 71 6c 69 74 65 33 5f 66 6f 75 6e 64 5f 63 6f 75  qlite3_found_cou
2b200 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  nt;.  extern int
2b210 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75   sqlite3_interru
2b220 70 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  pt_count;.  exte
2b230 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  rn int sqlite3_o
2b240 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 3b 0a  pen_file_count;.
2b250 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
2b260 69 74 65 33 5f 73 6f 72 74 5f 63 6f 75 6e 74 3b  ite3_sort_count;
2b270 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
2b280 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
2b290 6d 65 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  me;.#if SQLITE_O
2b2a0 53 5f 55 4e 49 58 20 26 26 20 64 65 66 69 6e 65  S_UNIX && define
2b2b0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
2b2c0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2b2d0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 65 78  CKING_STYLE.  ex
2b2e0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
2b2f0 5f 68 6f 73 74 69 64 5f 6e 75 6d 3b 0a 23 65 6e  _hostid_num;.#en
2b300 64 69 66 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  dif.  extern int
2b310 20 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f   sqlite3_max_blo
2b320 62 73 69 7a 65 3b 0a 20 20 65 78 74 65 72 6e 20  bsize;.  extern 
2b330 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2b340 53 68 61 72 65 64 43 61 63 68 65 52 65 70 6f 72  SharedCacheRepor
2b350 74 28 76 6f 69 64 2a 2c 0a 20 20 20 20 20 20 20  t(void*,.       
2b360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b380 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 2a 2c 69     Tcl_Interp*,i
2b390 6e 74 2c 54 63 6c 5f 4f 62 6a 2a 43 4f 4e 53 54  nt,Tcl_Obj*CONST
2b3a0 2a 29 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72  *);.  static str
2b3b0 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20  uct {.     char 
2b3c0 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c  *zName;.     Tcl
2b3d0 5f 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b  _CmdProc *xProc;
2b3e0 0a 20 20 7d 20 61 43 6d 64 5b 5d 20 3d 20 7b 0a  .  } aCmd[] = {.
2b3f0 20 20 20 20 20 7b 20 22 64 62 5f 65 6e 74 65 72       { "db_enter
2b400 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2b410 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
2b420 50 72 6f 63 2a 29 64 62 5f 65 6e 74 65 72 20 20  Proc*)db_enter  
2b430 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
2b440 20 20 20 20 20 7b 20 22 64 62 5f 6c 65 61 76 65       { "db_leave
2b450 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2b460 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
2b470 50 72 6f 63 2a 29 64 62 5f 6c 65 61 76 65 20 20  Proc*)db_leave  
2b480 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
2b490 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2b4a0 6d 70 72 69 6e 74 66 5f 69 6e 74 22 2c 20 20 20  mprintf_int",   
2b4b0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
2b4c0 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70  Proc*)sqlite3_mp
2b4d0 72 69 6e 74 66 5f 69 6e 74 20 20 20 20 7d 2c 0a  rintf_int    },.
2b4e0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2b4f0 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 22 2c 20  mprintf_int64", 
2b500 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
2b510 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70  Proc*)sqlite3_mp
2b520 72 69 6e 74 66 5f 69 6e 74 36 34 20 20 7d 2c 0a  rintf_int64  },.
2b530 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2b540 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67 22 2c 20 20  mprintf_long",  
2b550 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
2b560 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70  Proc*)sqlite3_mp
2b570 72 69 6e 74 66 5f 6c 6f 6e 67 20 20 20 7d 2c 0a  rintf_long   },.
2b580 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2b590 6d 70 72 69 6e 74 66 5f 73 74 72 22 2c 20 20 20  mprintf_str",   
2b5a0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
2b5b0 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70  Proc*)sqlite3_mp
2b5c0 72 69 6e 74 66 5f 73 74 72 20 20 20 20 7d 2c 0a  rintf_str    },.
2b5d0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2b5e0 73 6e 70 72 69 6e 74 66 5f 73 74 72 22 2c 20 20  snprintf_str",  
2b5f0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
2b600 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 73 6e  Proc*)sqlite3_sn
2b610 70 72 69 6e 74 66 5f 73 74 72 20 20 20 7d 2c 0a  printf_str   },.
2b620 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2b630 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 22  mprintf_stronly"
2b640 2c 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64  ,       (Tcl_Cmd
2b650 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70  Proc*)sqlite3_mp
2b660 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 7d 2c 0a  rintf_stronly},.
2b670 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2b680 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 22 2c  mprintf_double",
2b690 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
2b6a0 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70  Proc*)sqlite3_mp
2b6b0 72 69 6e 74 66 5f 64 6f 75 62 6c 65 20 7d 2c 0a  rintf_double },.
2b6c0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2b6d0 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 22 2c  mprintf_scaled",
2b6e0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
2b6f0 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70  Proc*)sqlite3_mp
2b700 72 69 6e 74 66 5f 73 63 61 6c 65 64 20 7d 2c 0a  rintf_scaled },.
2b710 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2b720 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c  mprintf_hexdoubl
2b730 65 22 2c 20 20 20 28 54 63 6c 5f 43 6d 64 50 72  e",   (Tcl_CmdPr
2b740 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69  oc*)sqlite3_mpri
2b750 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65 7d 2c 0a  ntf_hexdouble},.
2b760 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2b770 6d 70 72 69 6e 74 66 5f 7a 5f 74 65 73 74 22 2c  mprintf_z_test",
2b780 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
2b790 50 72 6f 63 2a 29 74 65 73 74 5f 6d 70 72 69 6e  Proc*)test_mprin
2b7a0 74 66 5f 7a 20 20 20 20 20 20 20 20 7d 2c 0a 20  tf_z        },. 
2b7b0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
2b7c0 70 72 69 6e 74 66 5f 6e 5f 74 65 73 74 22 2c 20  printf_n_test", 
2b7d0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
2b7e0 72 6f 63 2a 29 74 65 73 74 5f 6d 70 72 69 6e 74  roc*)test_mprint
2b7f0 66 5f 6e 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  f_n        },.  
2b800 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6e     { "sqlite3_sn
2b810 70 72 69 6e 74 66 5f 69 6e 74 22 2c 20 20 20 20  printf_int",    
2b820 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
2b830 6f 63 2a 29 74 65 73 74 5f 73 6e 70 72 69 6e 74  oc*)test_snprint
2b840 66 5f 69 6e 74 20 20 20 20 20 7d 2c 0a 20 20 20  f_int     },.   
2b850 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c 61 73    { "sqlite3_las
2b860 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c  t_insert_rowid",
2b870 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
2b880 63 2a 29 74 65 73 74 5f 6c 61 73 74 5f 72 6f 77  c*)test_last_row
2b890 69 64 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  id       },.    
2b8a0 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 65 63   { "sqlite3_exec
2b8b0 5f 70 72 69 6e 74 66 22 2c 20 20 20 20 20 20 20  _printf",       
2b8c0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2b8d0 2a 29 74 65 73 74 5f 65 78 65 63 5f 70 72 69 6e  *)test_exec_prin
2b8e0 74 66 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  tf      },.     
2b8f0 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 65 63 5f  { "sqlite3_exec_
2b900 68 65 78 22 2c 20 20 20 20 20 20 20 20 20 20 20  hex",           
2b910 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
2b920 29 74 65 73 74 5f 65 78 65 63 5f 68 65 78 20 20  )test_exec_hex  
2b930 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
2b940 20 22 73 71 6c 69 74 65 33 5f 65 78 65 63 22 2c   "sqlite3_exec",
2b950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b960 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
2b970 74 65 73 74 5f 65 78 65 63 20 20 20 20 20 20 20  test_exec       
2b980 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
2b990 22 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 6e 72  "sqlite3_exec_nr
2b9a0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2b9b0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
2b9c0 65 73 74 5f 65 78 65 63 5f 6e 72 20 20 20 20 20  est_exec_nr     
2b9d0 20 20 20 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20       },.#ifndef 
2b9e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 47 45 54 5f  SQLITE_OMIT_GET_
2b9f0 54 41 42 4c 45 0a 20 20 20 20 20 7b 20 22 73 71  TABLE.     { "sq
2ba00 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f  lite3_get_table_
2ba10 70 72 69 6e 74 66 22 2c 20 20 20 20 20 20 28 54  printf",      (T
2ba20 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
2ba30 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74  _get_table_print
2ba40 66 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20  f },.#endif.    
2ba50 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6c 6f 73   { "sqlite3_clos
2ba60 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
2ba70 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2ba80 2a 29 73 71 6c 69 74 65 5f 74 65 73 74 5f 63 6c  *)sqlite_test_cl
2ba90 6f 73 65 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  ose     },.     
2baa0 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74  { "sqlite3_creat
2bab0 65 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20  e_function",    
2bac0 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
2bad0 29 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75 6e  )test_create_fun
2bae0 63 74 69 6f 6e 20 20 7d 2c 0a 20 20 20 20 20 7b  ction  },.     {
2baf0 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65   "sqlite3_create
2bb00 5f 61 67 67 72 65 67 61 74 65 22 2c 20 20 20 20  _aggregate",    
2bb10 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
2bb20 74 65 73 74 5f 63 72 65 61 74 65 5f 61 67 67 72  test_create_aggr
2bb30 65 67 61 74 65 20 7d 2c 0a 20 20 20 20 20 7b 20  egate },.     { 
2bb40 22 73 71 6c 69 74 65 5f 72 65 67 69 73 74 65 72  "sqlite_register
2bb50 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c  _test_function",
2bb60 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
2bb70 65 73 74 5f 72 65 67 69 73 74 65 72 5f 66 75 6e  est_register_fun
2bb80 63 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  c    },.     { "
2bb90 73 71 6c 69 74 65 5f 61 62 6f 72 74 22 2c 20 20  sqlite_abort",  
2bba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bbb0 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71  (Tcl_CmdProc*)sq
2bbc0 6c 69 74 65 5f 61 62 6f 72 74 20 20 20 20 20 20  lite_abort      
2bbd0 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
2bbe0 71 6c 69 74 65 5f 62 69 6e 64 22 2c 20 20 20 20  qlite_bind",    
2bbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2bc00 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
2bc10 74 5f 62 69 6e 64 20 20 20 20 20 20 20 20 20 20  t_bind          
2bc20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 72     },.     { "br
2bc30 65 61 6b 70 6f 69 6e 74 22 2c 20 20 20 20 20 20  eakpoint",      
2bc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
2bc50 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
2bc60 5f 62 72 65 61 6b 70 6f 69 6e 74 20 20 20 20 20  _breakpoint     
2bc70 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2bc80 69 74 65 33 5f 6b 65 79 22 2c 20 20 20 20 20 20  ite3_key",      
2bc90 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
2bca0 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
2bcb0 6b 65 79 20 20 20 20 20 20 20 20 20 20 20 20 20  key             
2bcc0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2bcd0 74 65 33 5f 72 65 6b 65 79 22 2c 20 20 20 20 20  te3_rekey",     
2bce0 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
2bcf0 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 72  _CmdProc*)test_r
2bd00 65 6b 65 79 20 20 20 20 20 20 20 20 20 20 20 20  ekey            
2bd10 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2bd20 65 5f 73 65 74 5f 6d 61 67 69 63 22 2c 20 20 20  e_set_magic",   
2bd30 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
2bd40 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f  CmdProc*)sqlite_
2bd50 73 65 74 5f 6d 61 67 69 63 20 20 20 20 20 20 7d  set_magic      }
2bd60 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2bd70 33 5f 69 6e 74 65 72 72 75 70 74 22 2c 20 20 20  3_interrupt",   
2bd80 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
2bd90 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 69 6e 74  mdProc*)test_int
2bda0 65 72 72 75 70 74 20 20 20 20 20 20 20 20 7d 2c  errupt        },
2bdb0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f  .     { "sqlite_
2bdc0 64 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e 22  delete_function"
2bdd0 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d  ,        (Tcl_Cm
2bde0 64 50 72 6f 63 2a 29 64 65 6c 65 74 65 5f 66 75  dProc*)delete_fu
2bdf0 6e 63 74 69 6f 6e 20 20 20 20 20 20 20 7d 2c 0a  nction       },.
2be00 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 64       { "sqlite_d
2be10 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 22  elete_collation"
2be20 2c 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64  ,       (Tcl_Cmd
2be30 50 72 6f 63 2a 29 64 65 6c 65 74 65 5f 63 6f 6c  Proc*)delete_col
2be40 6c 61 74 69 6f 6e 20 20 20 20 20 20 7d 2c 0a 20  lation      },. 
2be50 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 67      { "sqlite3_g
2be60 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 22 2c 20  et_autocommit", 
2be70 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
2be80 72 6f 63 2a 29 67 65 74 5f 61 75 74 6f 63 6f 6d  roc*)get_autocom
2be90 6d 69 74 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  mit        },.  
2bea0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 74     { "sqlite3_st
2beb0 61 63 6b 5f 75 73 65 64 22 2c 20 20 20 20 20 20  ack_used",      
2bec0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
2bed0 6f 63 2a 29 74 65 73 74 5f 73 74 61 63 6b 5f 75  oc*)test_stack_u
2bee0 73 65 64 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  sed       },.   
2bef0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 75 73    { "sqlite3_bus
2bf00 79 5f 74 69 6d 65 6f 75 74 22 2c 20 20 20 20 20  y_timeout",     
2bf10 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
2bf20 63 2a 29 74 65 73 74 5f 62 75 73 79 5f 74 69 6d  c*)test_busy_tim
2bf30 65 6f 75 74 20 20 20 20 20 7d 2c 0a 20 20 20 20  eout     },.    
2bf40 20 7b 20 22 70 72 69 6e 74 66 22 2c 20 20 20 20   { "printf",    
2bf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf60 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2bf70 2a 29 74 65 73 74 5f 70 72 69 6e 74 66 20 20 20  *)test_printf   
2bf80 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
2bf90 7b 20 22 73 71 6c 69 74 65 33 49 6f 54 72 61 63  { "sqlite3IoTrac
2bfa0 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
2bfb0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
2bfc0 65 73 74 5f 69 6f 5f 74 72 61 63 65 20 20 20 20  est_io_trace    
2bfd0 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73       },.  };.  s
2bfe0 74 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20  tatic struct {. 
2bff0 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
2c000 0a 20 20 20 20 20 54 63 6c 5f 4f 62 6a 43 6d 64  .     Tcl_ObjCmd
2c010 50 72 6f 63 20 2a 78 50 72 6f 63 3b 0a 20 20 20  Proc *xProc;.   
2c020 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61    void *clientDa
2c030 74 61 3b 0a 20 20 7d 20 61 4f 62 6a 43 6d 64 5b  ta;.  } aObjCmd[
2c040 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 73 71  ] = {.     { "sq
2c050 6c 69 74 65 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e  lite3_connection
2c060 5f 70 6f 69 6e 74 65 72 22 2c 20 20 20 20 67 65  _pointer",    ge
2c070 74 5f 73 71 6c 69 74 65 5f 70 6f 69 6e 74 65 72  t_sqlite_pointer
2c080 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  , 0 },.     { "s
2c090 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 22  qlite3_bind_int"
2c0a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  ,              t
2c0b0 65 73 74 5f 62 69 6e 64 5f 69 6e 74 2c 20 20 20  est_bind_int,   
2c0c0 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22     0 },.     { "
2c0d0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72  sqlite3_bind_zer
2c0e0 6f 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20  oblob",         
2c0f0 74 65 73 74 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c  test_bind_zerobl
2c100 6f 62 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20  ob, 0 },.     { 
2c110 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e  "sqlite3_bind_in
2c120 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 20 20  t64",           
2c130 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74 36 34   test_bind_int64
2c140 2c 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b  ,    0 },.     {
2c150 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64   "sqlite3_bind_d
2c160 6f 75 62 6c 65 22 2c 20 20 20 20 20 20 20 20 20  ouble",         
2c170 20 20 74 65 73 74 5f 62 69 6e 64 5f 64 6f 75 62    test_bind_doub
2c180 6c 65 2c 20 20 20 30 20 7d 2c 0a 20 20 20 20 20  le,   0 },.     
2c190 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  { "sqlite3_bind_
2c1a0 6e 75 6c 6c 22 2c 20 20 20 20 20 20 20 20 20 20  null",          
2c1b0 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 6e 75 6c     test_bind_nul
2c1c0 6c 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20  l     ,0 },.    
2c1d0 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
2c1e0 5f 74 65 78 74 22 2c 20 20 20 20 20 20 20 20 20  _text",         
2c1f0 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 74 65      test_bind_te
2c200 78 74 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20  xt     ,0 },.   
2c210 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
2c220 64 5f 74 65 78 74 31 36 22 2c 20 20 20 20 20 20  d_text16",      
2c230 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 74       test_bind_t
2c240 65 78 74 31 36 20 20 20 2c 30 20 7d 2c 0a 20 20  ext16   ,0 },.  
2c250 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
2c260 6e 64 5f 62 6c 6f 62 22 2c 20 20 20 20 20 20 20  nd_blob",       
2c270 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f        test_bind_
2c280 62 6c 6f 62 20 20 20 20 20 2c 30 20 7d 2c 0a 20  blob     ,0 },. 
2c290 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
2c2a0 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f  ind_parameter_co
2c2b0 75 6e 74 22 2c 20 20 74 65 73 74 5f 62 69 6e 64  unt",  test_bind
2c2c0 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74  _parameter_count
2c2d0 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  , 0},.     { "sq
2c2e0 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
2c2f0 65 74 65 72 5f 6e 61 6d 65 22 2c 20 20 20 74 65  eter_name",   te
2c300 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  st_bind_paramete
2c310 72 5f 6e 61 6d 65 2c 20 20 30 7d 2c 0a 20 20 20  r_name,  0},.   
2c320 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
2c330 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65  d_parameter_inde
2c340 78 22 2c 20 20 74 65 73 74 5f 62 69 6e 64 5f 70  x",  test_bind_p
2c350 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 2c 20  arameter_index, 
2c360 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  0},.     { "sqli
2c370 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e  te3_clear_bindin
2c380 67 73 22 2c 20 20 20 20 20 20 20 20 74 65 73 74  gs",        test
2c390 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 2c  _clear_bindings,
2c3a0 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
2c3b0 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69  ite3_clear_bindi
2c3c0 6e 67 73 5f 6e 75 6c 6c 22 2c 20 20 20 74 65 73  ngs_null",   tes
2c3d0 74 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73  t_clear_bindings
2c3e0 5f 6e 75 6c 6c 2c 20 30 7d 2c 0a 20 20 20 20 20  _null, 0},.     
2c3f0 7b 20 22 73 71 6c 69 74 65 33 5f 73 6c 65 65 70  { "sqlite3_sleep
2c400 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2c410 20 20 20 74 65 73 74 5f 73 6c 65 65 70 2c 20 20     test_sleep,  
2c420 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
2c430 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72 63   { "sqlite3_errc
2c440 6f 64 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ode",           
2c450 20 20 20 20 74 65 73 74 5f 65 72 72 63 6f 64 65      test_errcode
2c460 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
2c470 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 74    { "sqlite3_ext
2c480 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 22 2c 20  ended_errcode", 
2c490 20 20 20 20 20 74 65 73 74 5f 65 78 5f 65 72 72       test_ex_err
2c4a0 63 6f 64 65 20 20 20 20 2c 30 20 7d 2c 0a 20 20  code    ,0 },.  
2c4b0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72     { "sqlite3_er
2c4c0 72 6d 73 67 22 2c 20 20 20 20 20 20 20 20 20 20  rmsg",          
2c4d0 20 20 20 20 20 20 74 65 73 74 5f 65 72 72 6d 73        test_errms
2c4e0 67 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20  g        ,0 },. 
2c4f0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
2c500 72 72 6d 73 67 31 36 22 2c 20 20 20 20 20 20 20  rrmsg16",       
2c510 20 20 20 20 20 20 20 74 65 73 74 5f 65 72 72 6d         test_errm
2c520 73 67 31 36 20 20 20 20 20 20 2c 30 20 7d 2c 0a  sg16      ,0 },.
2c530 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2c540 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20 20 20  open",          
2c550 20 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65          test_ope
2c560 6e 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c  n          ,0 },
2c570 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2c580 5f 6f 70 65 6e 31 36 22 2c 20 20 20 20 20 20 20  _open16",       
2c590 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70           test_op
2c5a0 65 6e 31 36 20 20 20 20 20 20 20 20 2c 30 20 7d  en16        ,0 }
2c5b0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2c5c0 33 5f 6f 70 65 6e 5f 76 32 22 2c 20 20 20 20 20  3_open_v2",     
2c5d0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 6f            test_o
2c5e0 70 65 6e 5f 76 32 20 20 20 20 20 20 20 2c 30 20  pen_v2       ,0 
2c5f0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2c600 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 22 2c 20  e3_complete16", 
2c610 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
2c620 63 6f 6d 70 6c 65 74 65 31 36 20 20 20 20 2c 30  complete16    ,0
2c630 20 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c   },..     { "sql
2c640 69 74 65 33 5f 70 72 65 70 61 72 65 22 2c 20 20  ite3_prepare",  
2c650 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
2c660 74 5f 70 72 65 70 61 72 65 20 20 20 20 20 20 20  t_prepare       
2c670 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
2c680 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 22  lite3_prepare16"
2c690 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ,             te
2c6a0 73 74 5f 70 72 65 70 61 72 65 31 36 20 20 20 20  st_prepare16    
2c6b0 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
2c6c0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
2c6d0 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 74  2",            t
2c6e0 65 73 74 5f 70 72 65 70 61 72 65 5f 76 32 20 20  est_prepare_v2  
2c6f0 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
2c700 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
2c710 74 6b 74 33 31 33 34 22 2c 20 20 20 20 20 20 20  tkt3134",       
2c720 74 65 73 74 5f 70 72 65 70 61 72 65 5f 74 6b 74  test_prepare_tkt
2c730 33 31 33 34 2c 20 30 7d 2c 0a 20 20 20 20 20 7b  3134, 0},.     {
2c740 20 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72   "sqlite3_prepar
2c750 65 31 36 5f 76 32 22 2c 20 20 20 20 20 20 20 20  e16_v2",        
2c760 20 20 74 65 73 74 5f 70 72 65 70 61 72 65 31 36    test_prepare16
2c770 5f 76 32 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20  _v2  ,0 },.     
2c780 7b 20 22 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  { "sqlite3_final
2c790 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ize",           
2c7a0 20 20 20 74 65 73 74 5f 66 69 6e 61 6c 69 7a 65     test_finalize
2c7b0 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
2c7c0 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 6d 74   { "sqlite3_stmt
2c7d0 5f 73 74 61 74 75 73 22 2c 20 20 20 20 20 20 20  _status",       
2c7e0 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 73 74      test_stmt_st
2c7f0 61 74 75 73 20 20 20 2c 30 20 7d 2c 0a 20 20 20  atus   ,0 },.   
2c800 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 72 65 73    { "sqlite3_res
2c810 65 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  et",            
2c820 20 20 20 20 20 74 65 73 74 5f 72 65 73 65 74 20       test_reset 
2c830 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20          ,0 },.  
2c840 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78     { "sqlite3_ex
2c850 70 69 72 65 64 22 2c 20 20 20 20 20 20 20 20 20  pired",         
2c860 20 20 20 20 20 20 74 65 73 74 5f 65 78 70 69 72        test_expir
2c870 65 64 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20  ed       ,0 },. 
2c880 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74      { "sqlite3_t
2c890 72 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67 73  ransfer_bindings
2c8a0 22 2c 20 20 20 20 20 74 65 73 74 5f 74 72 61 6e  ",     test_tran
2c8b0 73 66 65 72 5f 62 69 6e 64 20 2c 30 20 7d 2c 0a  sfer_bind ,0 },.
2c8c0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2c8d0 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20 20 20  changes",       
2c8e0 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 68 61          test_cha
2c8f0 6e 67 65 73 20 20 20 20 20 20 20 2c 30 20 7d 2c  nges       ,0 },
2c900 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2c910 5f 73 74 65 70 22 2c 20 20 20 20 20 20 20 20 20  _step",         
2c920 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 74           test_st
2c930 65 70 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d  ep          ,0 }
2c940 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2c950 33 5f 73 71 6c 22 2c 20 20 20 20 20 20 20 20 20  3_sql",         
2c960 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 73            test_s
2c970 71 6c 20 20 20 20 20 20 20 20 20 20 20 2c 30 20  ql           ,0 
2c980 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2c990 65 33 5f 6e 65 78 74 5f 73 74 6d 74 22 2c 20 20  e3_next_stmt",  
2c9a0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
2c9b0 6e 65 78 74 5f 73 74 6d 74 20 20 20 20 20 2c 30  next_stmt     ,0
2c9c0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2c9d0 74 65 33 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c  te3_stmt_readonl
2c9e0 79 22 2c 20 20 20 20 20 20 20 20 20 74 65 73 74  y",         test
2c9f0 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 20 2c  _stmt_readonly ,
2ca00 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
2ca10 69 74 65 33 5f 73 74 6d 74 5f 62 75 73 79 22 2c  ite3_stmt_busy",
2ca20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
2ca30 74 5f 73 74 6d 74 5f 62 75 73 79 20 20 20 20 20  t_stmt_busy     
2ca40 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 75 73  ,0 },.     { "us
2ca50 65 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 22  es_stmt_journal"
2ca60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 75 73  ,             us
2ca70 65 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 20  es_stmt_journal 
2ca80 2c 30 20 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73  ,0 },..     { "s
2ca90 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d  qlite3_release_m
2caa0 65 6d 6f 72 79 22 2c 20 20 20 20 20 20 20 20 74  emory",        t
2cab0 65 73 74 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  est_release_memo
2cac0 72 79 2c 20 20 20 20 20 30 7d 2c 0a 20 20 20 20  ry,     0},.    
2cad0 20 7b 20 22 73 71 6c 69 74 65 33 5f 64 62 5f 72   { "sqlite3_db_r
2cae0 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 22 2c 20  elease_memory", 
2caf0 20 20 20 20 74 65 73 74 5f 64 62 5f 72 65 6c 65      test_db_rele
2cb00 61 73 65 5f 6d 65 6d 6f 72 79 2c 20 20 30 7d 2c  ase_memory,  0},
2cb10 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2cb20 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 22 2c 20 20  _db_filename",  
2cb30 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 64 62           test_db
2cb40 5f 66 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20  _filename,      
2cb50 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71    0},.     { "sq
2cb60 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c  lite3_db_readonl
2cb70 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65  y",           te
2cb80 73 74 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 2c 20  st_db_readonly, 
2cb90 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
2cba0 7b 20 22 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f  { "sqlite3_soft_
2cbb0 68 65 61 70 5f 6c 69 6d 69 74 22 2c 20 20 20 20  heap_limit",    
2cbc0 20 20 20 74 65 73 74 5f 73 6f 66 74 5f 68 65 61     test_soft_hea
2cbd0 70 5f 6c 69 6d 69 74 2c 20 20 20 20 30 7d 2c 0a  p_limit,    0},.
2cbe0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2cbf0 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 22 2c  thread_cleanup",
2cc00 20 20 20 20 20 20 20 20 74 65 73 74 5f 74 68 72          test_thr
2cc10 65 61 64 5f 63 6c 65 61 6e 75 70 2c 20 20 20 20  ead_cleanup,    
2cc20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
2cc30 69 74 65 33 5f 70 61 67 65 72 5f 72 65 66 63 6f  ite3_pager_refco
2cc40 75 6e 74 73 22 2c 20 20 20 20 20 20 20 74 65 73  unts",       tes
2cc50 74 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74  t_pager_refcount
2cc60 73 2c 20 20 20 20 30 7d 2c 0a 0a 20 20 20 20 20  s,    0},..     
2cc70 7b 20 22 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f  { "sqlite3_load_
2cc80 65 78 74 65 6e 73 69 6f 6e 22 2c 20 20 20 20 20  extension",     
2cc90 20 20 20 74 65 73 74 5f 6c 6f 61 64 5f 65 78 74     test_load_ext
2cca0 65 6e 73 69 6f 6e 2c 20 20 20 20 20 30 7d 2c 0a  ension,     0},.
2ccb0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2ccc0 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65  enable_load_exte
2ccd0 6e 73 69 6f 6e 22 2c 20 74 65 73 74 5f 65 6e 61  nsion", test_ena
2cce0 62 6c 65 5f 6c 6f 61 64 2c 20 20 20 20 20 20 20  ble_load,       
2ccf0 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
2cd00 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65  ite3_extended_re
2cd10 73 75 6c 74 5f 63 6f 64 65 73 22 2c 20 74 65 73  sult_codes", tes
2cd20 74 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c  t_extended_resul
2cd30 74 5f 63 6f 64 65 73 2c 20 30 7d 2c 0a 20 20 20  t_codes, 0},.   
2cd40 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c 69 6d    { "sqlite3_lim
2cd50 69 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  it",            
2cd60 20 20 20 20 20 74 65 73 74 5f 6c 69 6d 69 74 2c       test_limit,
2cd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd80 20 30 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 61   0},..     { "sa
2cd90 76 65 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c 20  ve_prng_state", 
2cda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 61                sa
2cdb0 76 65 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20 20  ve_prng_state,  
2cdc0 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72    0 },.     { "r
2cdd0 65 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74  estore_prng_stat
2cde0 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 72  e",            r
2cdf0 65 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74  estore_prng_stat
2ce00 65 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22  e, 0 },.     { "
2ce10 72 65 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65  reset_prng_state
2ce20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2ce30 72 65 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65  reset_prng_state
2ce40 2c 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20  ,   0 },.     { 
2ce50 22 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f  "optimization_co
2ce60 6e 74 72 6f 6c 22 2c 20 20 20 20 20 20 20 20 20  ntrol",         
2ce70 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f   optimization_co
2ce80 6e 74 72 6f 6c 2c 30 7d 2c 0a 23 69 66 20 53 51  ntrol,0},.#if SQ
2ce90 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 20 20 20 20  LITE_OS_WIN.    
2cea0 20 7b 20 22 6c 6f 63 6b 5f 77 69 6e 33 32 5f 66   { "lock_win32_f
2ceb0 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
2cec0 20 20 20 20 77 69 6e 33 32 5f 66 69 6c 65 5f 6c      win32_file_l
2ced0 6f 63 6b 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6e  ock,    0 },.#en
2cee0 64 69 66 0a 20 20 20 20 20 7b 20 22 74 63 6c 5f  dif.     { "tcl_
2cef0 6f 62 6a 70 72 6f 63 22 2c 20 20 20 20 20 20 20  objproc",       
2cf00 20 20 20 20 20 20 20 20 20 20 20 20 72 75 6e 41              runA
2cf10 73 4f 62 6a 50 72 6f 63 2c 20 20 20 20 20 20 20  sObjProc,       
2cf20 30 20 7d 2c 0a 0a 20 20 20 20 20 2f 2a 20 73 71  0 },..     /* sq
2cf30 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 2a 28 29  lite3_column_*()
2cf40 20 41 50 49 20 2a 2f 0a 20 20 20 20 20 7b 20 22   API */.     { "
2cf50 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
2cf60 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  ount",          
2cf70 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  test_column_coun
2cf80 74 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20  t  ,0 },.     { 
2cf90 22 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f  "sqlite3_data_co
2cfa0 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  unt",           
2cfb0 20 74 65 73 74 5f 64 61 74 61 5f 63 6f 75 6e 74   test_data_count
2cfc0 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
2cfd0 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
2cfe0 5f 74 79 70 65 22 2c 20 20 20 20 20 20 20 20 20  _type",         
2cff0 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79    test_column_ty
2d000 70 65 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20  pe   ,0 },.     
2d010 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
2d020 6e 5f 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20  n_blob",        
2d030 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 62     test_column_b
2d040 6c 6f 62 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20  lob   ,0 },.    
2d050 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
2d060 6d 6e 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20 20  mn_double",     
2d070 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f      test_column_
2d080 64 6f 75 62 6c 65 20 2c 30 20 7d 2c 0a 20 20 20  double ,0 },.   
2d090 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
2d0a0 75 6d 6e 5f 69 6e 74 36 34 22 2c 20 20 20 20 20  umn_int64",     
2d0b0 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e       test_column
2d0c0 5f 69 6e 74 36 34 20 20 2c 30 20 7d 2c 0a 20 20  _int64  ,0 },.  
2d0d0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
2d0e0 6c 75 6d 6e 5f 74 65 78 74 22 2c 20 20 20 74 65  lumn_text",   te
2d0f0 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 20 20 28  st_stmt_utf8,  (
2d100 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f  void*)sqlite3_co
2d110 6c 75 6d 6e 5f 74 65 78 74 20 7d 2c 0a 20 20 20  lumn_text },.   
2d120 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
2d130 75 6d 6e 5f 6e 61 6d 65 22 2c 20 20 20 74 65 73  umn_name",   tes
2d140 74 5f 73 74 6d 74 5f 75 74 66 38 2c 20 20 28 76  t_stmt_utf8,  (v
2d150 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  oid*)sqlite3_col
2d160 75 6d 6e 5f 6e 61 6d 65 20 7d 2c 0a 20 20 20 20  umn_name },.    
2d170 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
2d180 6d 6e 5f 69 6e 74 22 2c 20 20 20 20 74 65 73 74  mn_int",    test
2d190 5f 73 74 6d 74 5f 69 6e 74 2c 20 20 20 28 76 6f  _stmt_int,   (vo
2d1a0 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  id*)sqlite3_colu
2d1b0 6d 6e 5f 69 6e 74 20 20 7d 2c 0a 20 20 20 20 20  mn_int  },.     
2d1c0 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
2d1d0 6e 5f 62 79 74 65 73 22 2c 20 20 74 65 73 74 5f  n_bytes",  test_
2d1e0 73 74 6d 74 5f 69 6e 74 2c 20 20 20 28 76 6f 69  stmt_int,   (voi
2d1f0 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
2d200 6e 5f 62 79 74 65 73 7d 2c 0a 23 69 66 6e 64 65  n_bytes},.#ifnde
2d210 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
2d220 43 4c 54 59 50 45 0a 20 20 20 20 20 7b 20 22 73  CLTYPE.     { "s
2d230 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65  qlite3_column_de
2d240 63 6c 74 79 70 65 22 2c 74 65 73 74 5f 73 74 6d  cltype",test_stm
2d250 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29 73 71  t_utf8,(void*)sq
2d260 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63  lite3_column_dec
2d270 6c 74 79 70 65 7d 2c 0a 23 65 6e 64 69 66 0a 23  ltype},.#endif.#
2d280 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2d290 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
2d2a0 41 54 41 0a 7b 20 22 73 71 6c 69 74 65 33 5f 63  ATA.{ "sqlite3_c
2d2b0 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e  olumn_database_n
2d2c0 61 6d 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75  ame",test_stmt_u
2d2d0 74 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74  tf8,(void*)sqlit
2d2e0 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61  e3_column_databa
2d2f0 73 65 5f 6e 61 6d 65 7d 2c 0a 7b 20 22 73 71 6c  se_name},.{ "sql
2d300 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c  ite3_column_tabl
2d310 65 5f 6e 61 6d 65 22 2c 74 65 73 74 5f 73 74 6d  e_name",test_stm
2d320 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29 73 71  t_utf8,(void*)sq
2d330 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62  lite3_column_tab
2d340 6c 65 5f 6e 61 6d 65 7d 2c 0a 7b 20 22 73 71 6c  le_name},.{ "sql
2d350 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67  ite3_column_orig
2d360 69 6e 5f 6e 61 6d 65 22 2c 74 65 73 74 5f 73 74  in_name",test_st
2d370 6d 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29 73  mt_utf8,(void*)s
2d380 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72  qlite3_column_or
2d390 69 67 69 6e 5f 6e 61 6d 65 7d 2c 0a 23 65 6e 64  igin_name},.#end
2d3a0 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
2d3b0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
2d3c0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
2d3d0 6c 75 6d 6e 5f 62 79 74 65 73 31 36 22 2c 20 74  lumn_bytes16", t
2d3e0 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 28 76  est_stmt_int, (v
2d3f0 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  oid*)sqlite3_col
2d400 75 6d 6e 5f 62 79 74 65 73 31 36 20 7d 2c 0a 20  umn_bytes16 },. 
2d410 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
2d420 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 22 2c 20 20  olumn_text16",  
2d430 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c  test_stmt_utf16,
2d440 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f   (void*)sqlite3_
2d450 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 7d 2c 0a  column_text16},.
2d460 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2d470 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36 22 2c 20  column_name16", 
2d480 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36   test_stmt_utf16
2d490 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  , (void*)sqlite3
2d4a0 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36 7d 2c  _column_name16},
2d4b0 0a 20 20 20 20 20 7b 20 22 61 64 64 5f 61 6c 69  .     { "add_ali
2d4c0 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c  gnment_test_coll
2d4d0 61 74 69 6f 6e 73 22 2c 20 61 64 64 5f 61 6c 69  ations", add_ali
2d4e0 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c  gnment_test_coll
2d4f0 61 74 69 6f 6e 73 2c 20 30 20 20 20 20 20 20 7d  ations, 0      }
2d500 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ,.#ifndef SQLITE
2d510 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20  _OMIT_DECLTYPE. 
2d520 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
2d530 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 31 36  olumn_decltype16
2d540 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31  ",test_stmt_utf1
2d550 36 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  6,(void*)sqlite3
2d560 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65  _column_decltype
2d570 31 36 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64  16},.#endif.#ifd
2d580 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2d590 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
2d5a0 0a 7b 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  .{"sqlite3_colum
2d5b0 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 31  n_database_name1
2d5c0 36 22 2c 0a 20 20 74 65 73 74 5f 73 74 6d 74 5f  6",.  test_stmt_
2d5d0 75 74 66 31 36 2c 20 28 76 6f 69 64 2a 29 73 71  utf16, (void*)sq
2d5e0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74  lite3_column_dat
2d5f0 61 62 61 73 65 5f 6e 61 6d 65 31 36 7d 2c 0a 7b  abase_name16},.{
2d600 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
2d610 74 61 62 6c 65 5f 6e 61 6d 65 31 36 22 2c 20 74  table_name16", t
2d620 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20  est_stmt_utf16, 
2d630 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63  (void*)sqlite3_c
2d640 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65  olumn_table_name
2d650 31 36 7d 2c 0a 7b 22 73 71 6c 69 74 65 33 5f 63  16},.{"sqlite3_c
2d660 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d  olumn_origin_nam
2d670 65 31 36 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f  e16", test_stmt_
2d680 75 74 66 31 36 2c 20 28 76 6f 69 64 2a 29 73 71  utf16, (void*)sq
2d690 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69  lite3_column_ori
2d6a0 67 69 6e 5f 6e 61 6d 65 31 36 7d 2c 0a 23 65 6e  gin_name16},.#en
2d6b0 64 69 66 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  dif.#endif.     
2d6c0 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74  { "sqlite3_creat
2d6d0 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 22 2c  e_collation_v2",
2d6e0 20 74 65 73 74 5f 63 72 65 61 74 65 5f 63 6f 6c   test_create_col
2d6f0 6c 61 74 69 6f 6e 5f 76 32 2c 20 30 20 7d 2c 0a  lation_v2, 0 },.
2d700 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2d710 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 22 2c  global_recover",
2d720 20 20 20 20 20 74 65 73 74 5f 67 6c 6f 62 61 6c       test_global
2d730 5f 72 65 63 6f 76 65 72 2c 20 30 20 20 20 7d 2c  _recover, 0   },
2d740 0a 20 20 20 20 20 7b 20 22 77 6f 72 6b 69 6e 67  .     { "working
2d750 5f 36 34 62 69 74 5f 69 6e 74 22 2c 20 20 20 20  _64bit_int",    
2d760 20 20 20 20 20 20 77 6f 72 6b 69 6e 67 5f 36 34        working_64
2d770 62 69 74 5f 69 6e 74 2c 20 20 20 30 20 20 20 7d  bit_int,   0   }
2d780 2c 0a 20 20 20 20 20 7b 20 22 76 66 73 5f 75 6e  ,.     { "vfs_un
2d790 6c 69 6e 6b 5f 74 65 73 74 22 2c 20 20 20 20 20  link_test",     
2d7a0 20 20 20 20 20 20 20 76 66 73 5f 75 6e 6c 69 6e         vfs_unlin
2d7b0 6b 5f 74 65 73 74 2c 20 20 20 20 20 30 20 20 20  k_test,     0   
2d7c0 7d 2c 0a 20 20 20 20 20 7b 20 22 76 66 73 5f 69  },.     { "vfs_i
2d7d0 6e 69 74 66 61 69 6c 5f 74 65 73 74 22 2c 20 20  nitfail_test",  
2d7e0 20 20 20 20 20 20 20 20 76 66 73 5f 69 6e 69 74          vfs_init
2d7f0 66 61 69 6c 5f 74 65 73 74 2c 20 20 20 30 20 20  fail_test,   0  
2d800 20 7d 2c 0a 20 20 20 20 20 7b 20 22 76 66 73 5f   },.     { "vfs_
2d810 75 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c 22 2c  unregister_all",
2d820 20 20 20 20 20 20 20 20 20 76 66 73 5f 75 6e 72           vfs_unr
2d830 65 67 69 73 74 65 72 5f 61 6c 6c 2c 20 20 30 20  egister_all,  0 
2d840 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 76 66 73    },.     { "vfs
2d850 5f 72 65 72 65 67 69 73 74 65 72 5f 61 6c 6c 22  _reregister_all"
2d860 2c 20 20 20 20 20 20 20 20 20 76 66 73 5f 72 65  ,         vfs_re
2d870 72 65 67 69 73 74 65 72 5f 61 6c 6c 2c 20 20 30  register_all,  0
2d880 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69     },.     { "fi
2d890 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73 74 22  le_control_test"
2d8a0 2c 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 5f  ,          file_
2d8b0 63 6f 6e 74 72 6f 6c 5f 74 65 73 74 2c 20 20 20  control_test,   
2d8c0 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66  0   },.     { "f
2d8d0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74  ile_control_last
2d8e0 65 72 72 6e 6f 5f 74 65 73 74 22 2c 20 66 69 6c  errno_test", fil
2d8f0 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72  e_control_laster
2d900 72 6e 6f 5f 74 65 73 74 2c 20 20 30 20 20 20 7d  rno_test,  0   }
2d910 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63  ,.     { "file_c
2d920 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79  ontrol_lockproxy
2d930 5f 74 65 73 74 22 2c 20 66 69 6c 65 5f 63 6f 6e  _test", file_con
2d940 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74  trol_lockproxy_t
2d950 65 73 74 2c 20 20 30 20 20 20 7d 2c 0a 23 69 66  est,  0   },.#if
2d960 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20  def __APPLE__.  
2d970 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72     { "file_contr
2d980 6f 6c 5f 74 72 75 6e 63 61 74 65 5f 74 65 73 74  ol_truncate_test
2d990 22 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  ", file_control_
2d9a0 74 72 75 6e 63 61 74 65 5f 74 65 73 74 2c 20 20  truncate_test,  
2d9b0 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66  0   },.     { "f
2d9c0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 72 65 70 6c  ile_control_repl
2d9d0 61 63 65 5f 74 65 73 74 22 2c 20 66 69 6c 65 5f  ace_test", file_
2d9e0 63 6f 6e 74 72 6f 6c 5f 72 65 70 6c 61 63 65 5f  control_replace_
2d9f0 74 65 73 74 2c 20 20 30 20 20 20 7d 2c 0a 23 65  test,  0   },.#e
2da00 6e 64 69 66 20 0a 20 20 20 20 20 7b 20 22 66 69  ndif .     { "fi
2da10 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b  le_control_chunk
2da20 73 69 7a 65 5f 74 65 73 74 22 2c 20 66 69 6c 65  size_test", file
2da30 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73 69  _control_chunksi
2da40 7a 65 5f 74 65 73 74 2c 20 20 30 20 20 20 7d 2c  ze_test,  0   },
2da50 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f  .     { "file_co
2da60 6e 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74  ntrol_sizehint_t
2da70 65 73 74 22 2c 20 20 66 69 6c 65 5f 63 6f 6e 74  est",  file_cont
2da80 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74 65 73  rol_sizehint_tes
2da90 74 2c 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20  t,   0   },.    
2daa0 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c   { "file_control
2dab0 5f 77 69 6e 33 32 5f 61 76 5f 72 65 74 72 79 22  _win32_av_retry"
2dac0 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77  , file_control_w
2dad0 69 6e 33 32 5f 61 76 5f 72 65 74 72 79 2c 20 20  in32_av_retry,  
2dae0 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66  0   },.     { "f
2daf0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72 73  ile_control_pers
2db00 69 73 74 5f 77 61 6c 22 2c 20 20 20 20 66 69 6c  ist_wal",    fil
2db10 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72 73 69 73  e_control_persis
2db20 74 5f 77 61 6c 2c 20 20 20 20 20 30 20 20 20 7d  t_wal,     0   }
2db30 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63  ,.     { "file_c
2db40 6f 6e 74 72 6f 6c 5f 70 6f 77 65 72 73 61 66 65  ontrol_powersafe
2db50 5f 6f 76 65 72 77 72 69 74 65 22 2c 66 69 6c 65  _overwrite",file
2db60 5f 63 6f 6e 74 72 6f 6c 5f 70 6f 77 65 72 73 61  _control_powersa
2db70 66 65 5f 6f 76 65 72 77 72 69 74 65 2c 30 7d 2c  fe_overwrite,0},
2db80 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f  .     { "file_co
2db90 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d 65 22 2c 20  ntrol_vfsname", 
2dba0 20 20 20 20 20 20 20 66 69 6c 65 5f 63 6f 6e 74         file_cont
2dbb0 72 6f 6c 5f 76 66 73 6e 61 6d 65 2c 20 20 20 20  rol_vfsname,    
2dbc0 20 20 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20       0   },.    
2dbd0 20 7b 20 22 73 71 6c 69 74 65 33 5f 76 66 73 5f   { "sqlite3_vfs_
2dbe0 6c 69 73 74 22 2c 20 20 20 20 20 20 20 20 20 20  list",          
2dbf0 20 76 66 73 5f 6c 69 73 74 2c 20 20 20 20 20 30   vfs_list,     0
2dc00 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
2dc10 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
2dc20 63 74 69 6f 6e 5f 76 32 22 2c 20 74 65 73 74 5f  ction_v2", test_
2dc30 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
2dc40 76 32 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20  v2, 0 },.     { 
2dc50 22 70 61 74 68 5f 69 73 5f 6c 6f 63 61 6c 22 2c  "path_is_local",
2dc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
2dc70 74 68 5f 69 73 5f 6c 6f 63 61 6c 2c 20 20 30 20  th_is_local,  0 
2dc80 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 70 61 74    },.     { "pat
2dc90 68 5f 69 73 5f 64 6f 73 22 2c 20 20 20 20 20 20  h_is_dos",      
2dca0 20 20 20 20 20 20 20 20 20 20 70 61 74 68 5f 69            path_i
2dcb0 73 5f 64 6f 73 2c 20 20 30 20 20 20 7d 2c 0a 0a  s_dos,  0   },..
2dcc0 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
2dcd0 73 20 66 72 6f 6d 20 6f 73 2e 68 20 2a 2f 0a 23  s from os.h */.#
2dce0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2dcf0 49 54 5f 55 54 46 31 36 0a 20 20 20 20 20 7b 20  IT_UTF16.     { 
2dd00 22 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74  "add_test_collat
2dd10 65 22 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f  e",        test_
2dd20 63 6f 6c 6c 61 74 65 2c 20 30 20 20 20 20 20 20  collate, 0      
2dd30 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
2dd40 22 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74  "add_test_collat
2dd50 65 5f 6e 65 65 64 65 64 22 2c 20 74 65 73 74 5f  e_needed", test_
2dd60 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 2c 20  collate_needed, 
2dd70 30 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20  0     },.     { 
2dd80 22 61 64 64 5f 74 65 73 74 5f 66 75 6e 63 74 69  "add_test_functi
2dd90 6f 6e 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f  on",       test_
2dda0 66 75 6e 63 74 69 6f 6e 2c 20 30 20 20 20 20 20  function, 0     
2ddb0 20 20 20 20 20 20 7d 2c 0a 23 65 6e 64 69 66 0a        },.#endif.
2ddc0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2ddd0 74 65 73 74 5f 65 72 72 73 74 72 22 2c 20 20 20  test_errstr",   
2dde0 20 20 74 65 73 74 5f 65 72 72 73 74 72 2c 20 30    test_errstr, 0
2ddf0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
2de00 20 20 20 20 20 7b 20 22 74 63 6c 5f 76 61 72 69       { "tcl_vari
2de10 61 62 6c 65 5f 74 79 70 65 22 2c 20 20 20 20 20  able_type",     
2de20 20 20 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74    tcl_variable_t
2de30 79 70 65 2c 20 30 20 20 20 20 20 20 20 7d 2c 0a  ype, 0       },.
2de40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2de50 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
2de60 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2de70 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63  _enable_shared_c
2de80 61 63 68 65 22 2c 20 74 65 73 74 5f 65 6e 61 62  ache", test_enab
2de90 6c 65 5f 73 68 61 72 65 64 2c 20 30 20 20 7d 2c  le_shared, 0  },
2dea0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2deb0 5f 73 68 61 72 65 64 5f 63 61 63 68 65 5f 72 65  _shared_cache_re
2dec0 70 6f 72 74 22 2c 20 73 71 6c 69 74 65 33 42 74  port", sqlite3Bt
2ded0 72 65 65 53 68 61 72 65 64 43 61 63 68 65 52 65  reeSharedCacheRe
2dee0 70 6f 72 74 2c 20 30 7d 2c 0a 23 65 6e 64 69 66  port, 0},.#endif
2def0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2df00 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62  _libversion_numb
2df10 65 72 22 2c 20 74 65 73 74 5f 6c 69 62 76 65 72  er", test_libver
2df20 73 69 6f 6e 5f 6e 75 6d 62 65 72 2c 20 30 20 20  sion_number, 0  
2df30 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  },.#ifdef SQLITE
2df40 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
2df50 45 54 41 44 41 54 41 0a 20 20 20 20 20 7b 20 22  ETADATA.     { "
2df60 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f  sqlite3_table_co
2df70 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 22 2c 20  lumn_metadata", 
2df80 74 65 73 74 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  test_table_colum
2df90 6e 5f 6d 65 74 61 64 61 74 61 2c 20 30 20 20 7d  n_metadata, 0  }
2dfa0 2c 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  ,.#endif.#ifndef
2dfb0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
2dfc0 52 42 4c 4f 42 0a 20 20 20 20 20 7b 20 22 73 71  RBLOB.     { "sq
2dfd0 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 22  lite3_blob_read"
2dfe0 2c 20 20 20 74 65 73 74 5f 62 6c 6f 62 5f 72 65  ,   test_blob_re
2dff0 61 64 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b  ad, 0  },.     {
2e000 20 22 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77   "sqlite3_blob_w
2e010 72 69 74 65 22 2c 20 20 74 65 73 74 5f 62 6c 6f  rite",  test_blo
2e020 62 5f 77 72 69 74 65 2c 20 30 20 20 7d 2c 0a 20  b_write, 0  },. 
2e030 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
2e040 6c 6f 62 5f 72 65 6f 70 65 6e 22 2c 20 74 65 73  lob_reopen", tes
2e050 74 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 2c 20 30  t_blob_reopen, 0
2e060 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2e070 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 22  ite3_blob_bytes"
2e080 2c 20 20 74 65 73 74 5f 62 6c 6f 62 5f 62 79 74  ,  test_blob_byt
2e090 65 73 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b  es, 0  },.     {
2e0a0 20 22 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63   "sqlite3_blob_c
2e0b0 6c 6f 73 65 22 2c 20 20 74 65 73 74 5f 62 6c 6f  lose",  test_blo
2e0c0 62 5f 63 6c 6f 73 65 2c 20 30 20 20 7d 2c 0a 23  b_close, 0  },.#
2e0d0 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 70 63  endif.     { "pc
2e0e0 61 63 68 65 5f 73 74 61 74 73 22 2c 20 20 20 20  ache_stats",    
2e0f0 20 20 20 74 65 73 74 5f 70 63 61 63 68 65 5f 73     test_pcache_s
2e100 74 61 74 73 2c 20 30 20 20 7d 2c 0a 23 69 66 64  tats, 0  },.#ifd
2e110 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2e120 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 20  _UNLOCK_NOTIFY. 
2e130 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 75      { "sqlite3_u
2e140 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c 20 74  nlock_notify", t
2e150 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66  est_unlock_notif
2e160 79 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a  y, 0  },.#endif.
2e170 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2e180 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 22 2c  wal_checkpoint",
2e190 20 20 20 74 65 73 74 5f 77 61 6c 5f 63 68 65 63     test_wal_chec
2e1a0 6b 70 6f 69 6e 74 2c 20 30 20 20 7d 2c 0a 20 20  kpoint, 0  },.  
2e1b0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 77 61     { "sqlite3_wa
2e1c0 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 22  l_checkpoint_v2"
2e1d0 2c 74 65 73 74 5f 77 61 6c 5f 63 68 65 63 6b 70  ,test_wal_checkp
2e1e0 6f 69 6e 74 5f 76 32 2c 20 30 20 20 7d 2c 0a 20  oint_v2, 0  },. 
2e1f0 20 20 20 20 7b 20 22 74 65 73 74 5f 73 71 6c 69      { "test_sqli
2e200 74 65 33 5f 6c 6f 67 22 2c 20 20 20 20 20 20 20  te3_log",       
2e210 20 20 74 65 73 74 5f 73 71 6c 69 74 65 33 5f 6c    test_sqlite3_l
2e220 6f 67 2c 20 30 20 20 7d 2c 0a 23 69 66 6e 64 65  og, 0  },.#ifnde
2e230 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
2e240 50 4c 41 49 4e 0a 20 20 20 20 20 7b 20 22 70 72  PLAIN.     { "pr
2e250 69 6e 74 5f 65 78 70 6c 61 69 6e 5f 71 75 65 72  int_explain_quer
2e260 79 5f 70 6c 61 6e 22 2c 20 74 65 73 74 5f 70 72  y_plan", test_pr
2e270 69 6e 74 5f 65 71 70 2c 20 30 20 20 7d 2c 0a 23  int_eqp, 0  },.#
2e280 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71  endif.     { "sq
2e290 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
2e2a0 6f 6c 22 2c 20 74 65 73 74 5f 74 65 73 74 5f 63  ol", test_test_c
2e2b0 6f 6e 74 72 6f 6c 20 7d 2c 0a 20 20 7d 3b 0a 20  ontrol },.  };. 
2e2c0 20 73 74 61 74 69 63 20 69 6e 74 20 62 69 74 6d   static int bitm
2e2d0 61 73 6b 5f 73 69 7a 65 20 3d 20 73 69 7a 65 6f  ask_size = sizeo
2e2e0 66 28 42 69 74 6d 61 73 6b 29 2a 38 3b 0a 20 20  f(Bitmask)*8;.  
2e2f0 69 6e 74 20 69 3b 0a 20 20 65 78 74 65 72 6e 20  int i;.  extern 
2e300 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  int sqlite3_sync
2e310 5f 63 6f 75 6e 74 2c 20 73 71 6c 69 74 65 33 5f  _count, sqlite3_
2e320 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 3b 0a  fullsync_count;.
2e330 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
2e340 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
2e350 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  unt;.  extern in
2e360 74 20 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f 63  t sqlite3_like_c
2e370 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69  ount;.  extern i
2e380 6e 74 20 73 71 6c 69 74 65 33 5f 78 66 65 72 6f  nt sqlite3_xfero
2e390 70 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  pt_count;.  exte
2e3a0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  rn int sqlite3_p
2e3b0 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
2e3c0 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  t;.  extern int 
2e3d0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
2e3e0 69 74 65 64 62 5f 63 6f 75 6e 74 3b 0a 20 20 65  itedb_count;.  e
2e3f0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
2e400 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
2e410 6f 75 6e 74 3b 0a 23 69 66 20 53 51 4c 49 54 45  ount;.#if SQLITE
2e420 5f 4f 53 5f 57 49 4e 0a 20 20 65 78 74 65 72 6e  _OS_WIN.  extern
2e430 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f   int sqlite3_os_
2e440 74 79 70 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66  type;.#endif.#if
2e450 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2e460 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
2e470 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 3b  lite3WhereTrace;
2e480 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
2e490 6c 69 74 65 33 4f 53 54 72 61 63 65 3b 0a 20 20  lite3OSTrace;.  
2e4a0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
2e4b0 65 33 56 64 62 65 41 64 64 6f 70 54 72 61 63 65  e3VdbeAddopTrace
2e4c0 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
2e4d0 71 6c 69 74 65 33 57 61 6c 54 72 61 63 65 3b 0a  qlite3WalTrace;.
2e4e0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
2e4f0 4c 49 54 45 5f 54 45 53 54 0a 20 20 65 78 74 65  LITE_TEST.  exte
2e500 72 6e 20 63 68 61 72 20 73 71 6c 69 74 65 33 5f  rn char sqlite3_
2e510 71 75 65 72 79 5f 70 6c 61 6e 5b 5d 3b 0a 20 20  query_plan[];.  
2e520 73 74 61 74 69 63 20 63 68 61 72 20 2a 71 75 65  static char *que
2e530 72 79 5f 70 6c 61 6e 20 3d 20 73 71 6c 69 74 65  ry_plan = sqlite
2e540 33 5f 71 75 65 72 79 5f 70 6c 61 6e 3b 0a 23 69  3_query_plan;.#i
2e550 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
2e560 4c 45 5f 46 54 53 33 0a 20 20 65 78 74 65 72 6e  LE_FTS3.  extern
2e570 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 74 73   int sqlite3_fts
2e580 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65 6e 74 68  3_enable_parenth
2e590 65 73 65 73 3b 0a 23 65 6e 64 69 66 0a 23 65 6e  eses;.#endif.#en
2e5a0 64 69 66 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  dif..  for(i=0; 
2e5b0 69 3c 73 69 7a 65 6f 66 28 61 43 6d 64 29 2f 73  i<sizeof(aCmd)/s
2e5c0 69 7a 65 6f 66 28 61 43 6d 64 5b 30 5d 29 3b 20  izeof(aCmd[0]); 
2e5d0 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72  i++){.    Tcl_Cr
2e5e0 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eateCommand(inte
2e5f0 72 70 2c 20 61 43 6d 64 5b 69 5d 2e 7a 4e 61 6d  rp, aCmd[i].zNam
2e600 65 2c 20 61 43 6d 64 5b 69 5d 2e 78 50 72 6f 63  e, aCmd[i].xProc
2e610 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 66  , 0, 0);.  }.  f
2e620 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
2e630 28 61 4f 62 6a 43 6d 64 29 2f 73 69 7a 65 6f 66  (aObjCmd)/sizeof
2e640 28 61 4f 62 6a 43 6d 64 5b 30 5d 29 3b 20 69 2b  (aObjCmd[0]); i+
2e650 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  +){.    Tcl_Crea
2e660 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
2e670 65 72 70 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e  erp, aObjCmd[i].
2e680 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20  zName, .        
2e690 61 4f 62 6a 43 6d 64 5b 69 5d 2e 78 50 72 6f 63  aObjCmd[i].xProc
2e6a0 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 63 6c 69  , aObjCmd[i].cli
2e6b0 65 6e 74 44 61 74 61 2c 20 30 29 3b 0a 20 20 7d  entData, 0);.  }
2e6c0 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
2e6d0 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73  nterp, "sqlite_s
2e6e0 65 61 72 63 68 5f 63 6f 75 6e 74 22 2c 20 0a 20  earch_count", . 
2e6f0 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
2e700 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e  ite3_search_coun
2e710 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  t, TCL_LINK_INT)
2e720 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
2e730 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
2e740 66 6f 75 6e 64 5f 63 6f 75 6e 74 22 2c 20 0a 20  found_count", . 
2e750 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
2e760 69 74 65 33 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74  ite3_found_count
2e770 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
2e780 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
2e790 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73  nterp, "sqlite_s
2e7a0 6f 72 74 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20  ort_count", .   
2e7b0 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
2e7c0 65 33 5f 73 6f 72 74 5f 63 6f 75 6e 74 2c 20 54  e3_sort_count, T
2e7d0 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
2e7e0 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
2e7f0 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 6d 61 78  rp, "sqlite3_max
2e800 5f 62 6c 6f 62 73 69 7a 65 22 2c 20 0a 20 20 20  _blobsize", .   
2e810 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
2e820 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a 65 2c  e3_max_blobsize,
2e830 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
2e840 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
2e850 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6c 69  terp, "sqlite_li
2e860 6b 65 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20  ke_count", .    
2e870 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
2e880 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 2c 20 54 43  3_like_count, TC
2e890 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54  L_LINK_INT);.  T
2e8a0 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
2e8b0 70 2c 20 22 73 71 6c 69 74 65 5f 69 6e 74 65 72  p, "sqlite_inter
2e8c0 72 75 70 74 5f 63 6f 75 6e 74 22 2c 20 0a 20 20  rupt_count", .  
2e8d0 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
2e8e0 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f  te3_interrupt_co
2e8f0 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  unt, TCL_LINK_IN
2e900 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  T);.  Tcl_LinkVa
2e910 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
2e920 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e  e_open_file_coun
2e930 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72  t", .      (char
2e940 2a 29 26 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  *)&sqlite3_open_
2e950 66 69 6c 65 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  file_count, TCL_
2e960 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
2e970 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
2e980 20 22 73 71 6c 69 74 65 5f 63 75 72 72 65 6e 74   "sqlite_current
2e990 5f 74 69 6d 65 22 2c 20 0a 20 20 20 20 20 20 28  _time", .      (
2e9a0 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 63  char*)&sqlite3_c
2e9b0 75 72 72 65 6e 74 5f 74 69 6d 65 2c 20 54 43 4c  urrent_time, TCL
2e9c0 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66 20  _LINK_INT);.#if 
2e9d0 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20 26  SQLITE_OS_UNIX &
2e9e0 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
2e9f0 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
2ea00 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2ea10 59 4c 45 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  YLE.  Tcl_LinkVa
2ea20 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
2ea30 65 5f 68 6f 73 74 69 64 5f 6e 75 6d 22 2c 20 0a  e_hostid_num", .
2ea40 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
2ea50 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d  lite3_hostid_num
2ea60 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
2ea70 0a 23 65 6e 64 69 66 0a 20 20 54 63 6c 5f 4c 69  .#endif.  Tcl_Li
2ea80 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
2ea90 71 6c 69 74 65 33 5f 78 66 65 72 6f 70 74 5f 63  qlite3_xferopt_c
2eaa0 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68  ount",.      (ch
2eab0 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 78 66 65  ar*)&sqlite3_xfe
2eac0 72 6f 70 74 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  ropt_count, TCL_
2ead0 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
2eae0 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
2eaf0 20 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f   "sqlite3_pager_
2eb00 72 65 61 64 64 62 5f 63 6f 75 6e 74 22 2c 0a 20  readdb_count",. 
2eb10 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
2eb20 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64  ite3_pager_readd
2eb30 62 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  b_count, TCL_LIN
2eb40 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
2eb50 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
2eb60 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
2eb70 74 65 64 62 5f 63 6f 75 6e 74 22 2c 0a 20 20 20  tedb_count",.   
2eb80 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
2eb90 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
2eba0 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b  _count, TCL_LINK
2ebb0 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e  _INT);.  Tcl_Lin
2ebc0 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
2ebd0 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
2ebe0 65 6a 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20  ej_count",.     
2ebf0 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
2ec00 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
2ec10 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  unt, TCL_LINK_IN
2ec20 54 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  T);.#ifndef SQLI
2ec30 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
2ec40 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
2ec50 72 70 2c 20 22 75 6e 61 6c 69 67 6e 65 64 5f 73  rp, "unaligned_s
2ec60 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 22 2c 0a  tring_counter",.
2ec70 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 75 6e        (char*)&un
2ec80 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63  aligned_string_c
2ec90 6f 75 6e 74 65 72 2c 20 54 43 4c 5f 4c 49 4e 4b  ounter, TCL_LINK
2eca0 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 23 69  _INT);.#endif.#i
2ecb0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2ecc0 54 5f 55 54 46 31 36 0a 20 20 54 63 6c 5f 4c 69  T_UTF16.  Tcl_Li
2ecd0 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
2ece0 71 6c 69 74 65 5f 6c 61 73 74 5f 6e 65 65 64 65  qlite_last_neede
2ecf0 64 5f 63 6f 6c 6c 61 74 69 6f 6e 22 2c 0a 20 20  d_collation",.  
2ed00 20 20 20 20 28 63 68 61 72 2a 29 26 70 7a 4e 65      (char*)&pzNe
2ed10 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 2c 20 54  ededCollation, T
2ed20 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 7c 54  CL_LINK_STRING|T
2ed30 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c  CL_LINK_READ_ONL
2ed40 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  Y);.#endif.#if S
2ed50 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 20 20 54  QLITE_OS_WIN.  T
2ed60 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
2ed70 70 2c 20 22 73 71 6c 69 74 65 5f 6f 73 5f 74 79  p, "sqlite_os_ty
2ed80 70 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  pe",.      (char
2ed90 2a 29 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79  *)&sqlite3_os_ty
2eda0 70 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  pe, TCL_LINK_INT
2edb0 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  );.#endif.#ifdef
2edc0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 54   SQLITE_TEST.  T
2edd0 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
2ede0 70 2c 20 22 73 71 6c 69 74 65 5f 71 75 65 72 79  p, "sqlite_query
2edf0 5f 70 6c 61 6e 22 2c 0a 20 20 20 20 20 20 28 63  _plan",.      (c
2ee00 68 61 72 2a 29 26 71 75 65 72 79 5f 70 6c 61 6e  har*)&query_plan
2ee10 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e  , TCL_LINK_STRIN
2ee20 47 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f  G|TCL_LINK_READ_
2ee30 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69  ONLY);.#endif.#i
2ee40 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2ee50 47 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  G.  Tcl_LinkVar(
2ee60 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
2ee70 61 64 64 6f 70 5f 74 72 61 63 65 22 2c 0a 20 20  addop_trace",.  
2ee80 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
2ee90 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61 63  te3VdbeAddopTrac
2eea0 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  e, TCL_LINK_INT)
2eeb0 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
2eec0 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
2eed0 77 68 65 72 65 5f 74 72 61 63 65 22 2c 0a 20 20  where_trace",.  
2eee0 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
2eef0 74 65 33 57 68 65 72 65 54 72 61 63 65 2c 20 54  te3WhereTrace, T
2ef00 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
2ef10 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
2ef20 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 73 5f 74  rp, "sqlite_os_t
2ef30 72 61 63 65 22 2c 0a 20 20 20 20 20 20 28 63 68  race",.      (ch
2ef40 61 72 2a 29 26 73 71 6c 69 74 65 33 4f 53 54 72  ar*)&sqlite3OSTr
2ef50 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  ace, TCL_LINK_IN
2ef60 54 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  T);.#ifndef SQLI
2ef70 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 54 63  TE_OMIT_WAL.  Tc
2ef80 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
2ef90 2c 20 22 73 71 6c 69 74 65 5f 77 61 6c 5f 74 72  , "sqlite_wal_tr
2efa0 61 63 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61  ace",.      (cha
2efb0 72 2a 29 26 73 71 6c 69 74 65 33 57 61 6c 54 72  r*)&sqlite3WalTr
2efc0 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  ace, TCL_LINK_IN
2efd0 54 29 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69  T);.#endif.#endi
2efe0 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
2eff0 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 54  _OMIT_DISKIO.  T
2f000 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
2f010 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 65 6e 74  p, "sqlite_opent
2f020 65 6d 70 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20  emp_count",.    
2f030 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
2f040 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
2f050 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
2f060 0a 23 65 6e 64 69 66 0a 20 20 54 63 6c 5f 4c 69  .#endif.  Tcl_Li
2f070 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
2f080 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e  qlite_static_bin
2f090 64 5f 76 61 6c 75 65 22 2c 0a 20 20 20 20 20 20  d_value",.      
2f0a0 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 5f 73  (char*)&sqlite_s
2f0b0 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65  tatic_bind_value
2f0c0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e  , TCL_LINK_STRIN
2f0d0 47 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  G);.  Tcl_LinkVa
2f0e0 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
2f0f0 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62  e_static_bind_nb
2f100 79 74 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61  yte",.      (cha
2f110 72 2a 29 26 73 71 6c 69 74 65 5f 73 74 61 74 69  r*)&sqlite_stati
2f120 63 5f 62 69 6e 64 5f 6e 62 79 74 65 2c 20 54 43  c_bind_nbyte, TC
2f130 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54  L_LINK_INT);.  T
2f140 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
2f150 70 2c 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f  p, "sqlite_temp_
2f160 64 69 72 65 63 74 6f 72 79 22 2c 0a 20 20 20 20  directory",.    
2f170 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
2f180 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
2f190 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e  , TCL_LINK_STRIN
2f1a0 47 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  G);.  Tcl_LinkVa
2f1b0 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
2f1c0 65 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  e_data_directory
2f1d0 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
2f1e0 26 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69  &sqlite3_data_di
2f1f0 72 65 63 74 6f 72 79 2c 20 54 43 4c 5f 4c 49 4e  rectory, TCL_LIN
2f200 4b 5f 53 54 52 49 4e 47 29 3b 0a 20 20 54 63 6c  K_STRING);.  Tcl
2f210 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
2f220 20 22 62 69 74 6d 61 73 6b 5f 73 69 7a 65 22 2c   "bitmask_size",
2f230 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 62  .      (char*)&b
2f240 69 74 6d 61 73 6b 5f 73 69 7a 65 2c 20 54 43 4c  itmask_size, TCL
2f250 5f 4c 49 4e 4b 5f 49 4e 54 7c 54 43 4c 5f 4c 49  _LINK_INT|TCL_LI
2f260 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a 20  NK_READ_ONLY);. 
2f270 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
2f280 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 79 6e  erp, "sqlite_syn
2f290 63 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20  c_count",.      
2f2a0 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
2f2b0 73 79 6e 63 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  sync_count, TCL_
2f2c0 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
2f2d0 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
2f2e0 20 22 73 71 6c 69 74 65 5f 66 75 6c 6c 73 79 6e   "sqlite_fullsyn
2f2f0 63 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20  c_count",.      
2f300 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
2f310 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2c 20  fullsync_count, 
2f320 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23  TCL_LINK_INT);.#
2f330 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
2f340 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 29 20 26  E_ENABLE_FTS3) &
2f350 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
2f360 5f 54 45 53 54 29 0a 20 20 54 63 6c 5f 4c 69 6e  _TEST).  Tcl_Lin
2f370 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
2f380 6c 69 74 65 5f 66 74 73 33 5f 65 6e 61 62 6c 65  lite_fts3_enable
2f390 5f 70 61 72 65 6e 74 68 65 73 65 73 22 2c 0a 20  _parentheses",. 
2f3a0 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
2f3b0 69 74 65 33 5f 66 74 73 33 5f 65 6e 61 62 6c 65  ite3_fts3_enable
2f3c0 5f 70 61 72 65 6e 74 68 65 73 65 73 2c 20 54 43  _parentheses, TC
2f3d0 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e  L_LINK_INT);.#en
2f3e0 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  dif.  return TCL
2f3f0 5f 4f 4b 3b 0a 7d 0a                             _OK;.}.