/ Hex Artifact Content
Login

Artifact 328cbe4a4ee6d10d67ece2a7adaa2770569fae0f:


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 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 69 66   strlen(z);.  if
5fc0: 28 20 70 2d 3e 6e 55 73 65 64 20 2b 20 6e 20 2b  ( p->nUsed + n +
5fd0: 20 32 20 3e 20 70 2d 3e 6e 41 6c 6c 6f 63 20 29   2 > p->nAlloc )
5fe0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77  {.    char *zNew
5ff0: 3b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20  ;.    p->nAlloc 
6000: 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20  = p->nAlloc*2 + 
6010: 6e 20 2b 20 32 30 30 3b 0a 20 20 20 20 7a 4e 65  n + 200;.    zNe
6020: 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  w = sqlite3_real
6030: 6c 6f 63 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c  loc(p->z, p->nAl
6040: 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  loc);.    if( zN
6050: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ew==0 ){.      s
6060: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a  qlite3_free(p->z
6070: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  );.      memset(
6080: 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29  p, 0, sizeof(*p)
6090: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
60a0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 20  .    }.    p->z 
60b0: 3d 20 7a 4e 65 77 3b 0a 20 20 7d 0a 20 20 69 66  = zNew;.  }.  if
60c0: 28 20 64 69 76 69 64 65 72 20 26 26 20 70 2d 3e  ( divider && p->
60d0: 6e 55 73 65 64 3e 30 20 29 7b 0a 20 20 20 20 70  nUsed>0 ){.    p
60e0: 2d 3e 7a 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20  ->z[p->nUsed++] 
60f0: 3d 20 64 69 76 69 64 65 72 3b 0a 20 20 7d 0a 20  = divider;.  }. 
6100: 20 6d 65 6d 63 70 79 28 26 70 2d 3e 7a 5b 70 2d   memcpy(&p->z[p-
6110: 3e 6e 55 73 65 64 5d 2c 20 7a 2c 20 6e 2b 31 29  >nUsed], z, n+1)
6120: 3b 0a 20 20 70 2d 3e 6e 55 73 65 64 20 2b 3d 20  ;.  p->nUsed += 
6130: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  n;.}../*.** Invo
6140: 6b 65 64 20 66 6f 72 20 65 61 63 68 20 63 61 6c  ked for each cal
6150: 6c 62 61 63 6b 20 66 72 6f 6d 20 73 71 6c 69 74  lback from sqlit
6160: 65 33 45 78 65 63 46 75 6e 63 0a 2a 2f 0a 73 74  e3ExecFunc.*/.st
6170: 61 74 69 63 20 69 6e 74 20 65 78 65 63 46 75 6e  atic int execFun
6180: 63 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a  cCallback(void *
6190: 70 44 61 74 61 2c 20 69 6e 74 20 61 72 67 63 2c  pData, int argc,
61a0: 20 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 63 68   char **argv, ch
61b0: 61 72 20 2a 2a 4e 6f 74 55 73 65 64 29 7b 0a 20  ar **NotUsed){. 
61c0: 20 73 74 72 75 63 74 20 64 73 74 72 20 2a 70 20   struct dstr *p 
61d0: 3d 20 28 73 74 72 75 63 74 20 64 73 74 72 2a 29  = (struct dstr*)
61e0: 70 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 3b 0a  pData;.  int i;.
61f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
6200: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  c; i++){.    if(
6210: 20 61 72 67 76 5b 69 5d 3d 3d 30 20 29 7b 0a 20   argv[i]==0 ){. 
6220: 20 20 20 20 20 64 73 74 72 41 70 70 65 6e 64 28       dstrAppend(
6230: 70 2c 20 22 4e 55 4c 4c 22 2c 20 27 20 27 29 3b  p, "NULL", ' ');
6240: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6250: 20 20 64 73 74 72 41 70 70 65 6e 64 28 70 2c 20    dstrAppend(p, 
6260: 61 72 67 76 5b 69 5d 2c 20 27 20 27 29 3b 0a 20  argv[i], ' ');. 
6270: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
6280: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  n 0;.}../*.** Im
6290: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
62a0: 74 68 65 20 78 5f 73 71 6c 69 74 65 5f 65 78 65  the x_sqlite_exe
62b0: 63 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  c() function.  T
62c0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b  his function tak
62d0: 65 73 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 61  es.** a single a
62e0: 72 67 75 6d 65 6e 74 20 61 6e 64 20 61 74 74 65  rgument and atte
62f0: 6d 70 74 73 20 74 6f 20 65 78 65 63 75 74 65 20  mpts to execute 
6300: 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20 61 73  that argument as
6310: 20 53 51 4c 20 63 6f 64 65 2e 0a 2a 2a 20 54 68   SQL code..** Th
6320: 69 73 20 69 73 20 69 6c 6c 65 67 61 6c 20 61 6e  is is illegal an
6330: 64 20 73 68 6f 75 6c 64 20 73 65 74 20 74 68 65  d should set the
6340: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 66   SQLITE_MISUSE f
6350: 6c 61 67 20 6f 6e 20 74 68 65 20 64 61 74 61 62  lag on the datab
6360: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 34 2d  ase..**.** 2004-
6370: 4a 61 6e 2d 30 37 3a 20 20 57 65 20 68 61 76 65  Jan-07:  We have
6380: 20 63 68 61 6e 67 65 64 20 74 68 69 73 20 74 6f   changed this to
6390: 20 6d 61 6b 65 20 69 74 20 6c 65 67 61 6c 20 74   make it legal t
63a0: 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 65  o call sqlite3_e
63b0: 78 65 63 28 29 0a 2a 2a 20 66 72 6f 6d 20 77 69  xec().** from wi
63c0: 74 68 69 6e 20 61 20 66 75 6e 63 74 69 6f 6e 20  thin a function 
63d0: 63 61 6c 6c 2e 20 20 0a 2a 2a 20 0a 2a 2a 20 54  call.  .** .** T
63e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 69 6d 75  his routine simu
63f0: 6c 61 74 65 73 20 74 68 65 20 65 66 66 65 63 74  lates the effect
6400: 20 6f 66 20 68 61 76 69 6e 67 20 74 77 6f 20 74   of having two t
6410: 68 72 65 61 64 73 20 61 74 74 65 6d 70 74 20 74  hreads attempt t
6420: 6f 0a 2a 2a 20 75 73 65 20 74 68 65 20 73 61 6d  o.** use the sam
6430: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
6440: 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2f 0a  e same time..*/.
6450: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
6460: 74 65 33 45 78 65 63 46 75 6e 63 28 0a 20 20 73  te3ExecFunc(.  s
6470: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
6480: 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20  context, .  int 
6490: 61 72 67 63 2c 20 20 0a 20 20 73 71 6c 69 74 65  argc,  .  sqlite
64a0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
64b0: 7b 0a 20 20 73 74 72 75 63 74 20 64 73 74 72 20  {.  struct dstr 
64c0: 78 3b 0a 20 20 6d 65 6d 73 65 74 28 26 78 2c 20  x;.  memset(&x, 
64d0: 30 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20  0, sizeof(x));. 
64e0: 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65   (void)sqlite3_e
64f0: 78 65 63 28 28 73 71 6c 69 74 65 33 2a 29 73 71  xec((sqlite3*)sq
6500: 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28  lite3_user_data(
6510: 63 6f 6e 74 65 78 74 29 2c 0a 20 20 20 20 20 20  context),.      
6520: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
6530: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
6540: 5d 29 2c 0a 20 20 20 20 20 20 65 78 65 63 46 75  ]),.      execFu
6550: 6e 63 43 61 6c 6c 62 61 63 6b 2c 20 26 78 2c 20  ncCallback, &x, 
6560: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  0);.  sqlite3_re
6570: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
6580: 74 2c 20 78 2e 7a 2c 20 78 2e 6e 55 73 65 64 2c  t, x.z, x.nUsed,
6590: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
65a0: 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  T);.  sqlite3_fr
65b0: 65 65 28 78 2e 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ee(x.z);.}../*.*
65c0: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
65d0: 20 6f 66 20 74 6b 74 32 32 31 33 66 75 6e 63 28   of tkt2213func(
65e0: 29 2c 20 61 20 73 63 61 6c 61 72 20 66 75 6e 63  ), a scalar func
65f0: 74 69 6f 6e 20 74 68 61 74 20 74 61 6b 65 73 20  tion that takes 
6600: 65 78 61 63 74 6c 79 0a 2a 2a 20 6f 6e 65 20 61  exactly.** one a
6610: 72 67 75 6d 65 6e 74 2e 20 49 74 20 68 61 73 20  rgument. It has 
6620: 74 77 6f 20 69 6e 74 65 72 65 73 74 69 6e 67 20  two interesting 
6630: 66 65 61 74 75 72 65 73 3a 0a 2a 2a 0a 2a 2a 20  features:.**.** 
6640: 2a 20 49 74 20 63 61 6c 6c 73 20 73 71 6c 69 74  * It calls sqlit
6650: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 29 20  e3_value_text() 
6660: 33 20 74 69 6d 65 73 20 6f 6e 20 74 68 65 20 61  3 times on the a
6670: 72 67 75 6d 65 6e 74 20 73 71 6c 69 74 65 33 5f  rgument sqlite3_
6680: 76 61 6c 75 65 2a 2e 0a 2a 2a 20 20 20 49 66 20  value*..**   If 
6690: 74 68 65 20 74 68 72 65 65 20 70 6f 69 6e 74 65  the three pointe
66a0: 72 73 20 72 65 74 75 72 6e 65 64 20 61 72 65 20  rs returned are 
66b0: 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 61 6e 20  not the same an 
66c0: 53 51 4c 20 65 72 72 6f 72 20 69 73 20 72 61 69  SQL error is rai
66d0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 20 4f 74 68  sed..**.** * Oth
66e0: 65 72 77 69 73 65 20 69 74 20 72 65 74 75 72 6e  erwise it return
66f0: 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
6700: 74 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74  text representat
6710: 69 6f 6e 20 6f 66 20 69 74 73 20 0a 2a 2a 20 20  ion of its .**  
6720: 20 61 72 67 75 6d 65 6e 74 20 69 6e 20 73 75 63   argument in suc
6730: 68 20 61 20 77 61 79 20 61 73 20 74 68 65 20 56  h a way as the V
6740: 44 42 45 20 72 65 70 72 65 73 65 6e 74 61 74 69  DBE representati
6750: 6f 6e 20 69 73 20 61 20 4d 65 6d 2a 20 63 65 6c  on is a Mem* cel
6760: 6c 20 0a 2a 2a 20 20 20 77 69 74 68 20 74 68 65  l .**   with the
6770: 20 4d 45 4d 5f 54 65 72 6d 20 66 6c 61 67 20 63   MEM_Term flag c
6780: 6c 65 61 72 2e 20 0a 2a 2a 0a 2a 2a 20 54 69 63  lear. .**.** Tic
6790: 6b 65 74 20 23 32 32 31 33 20 63 61 6e 20 74 68  ket #2213 can th
67a0: 65 72 65 66 6f 72 65 20 62 65 20 74 65 73 74 65  erefore be teste
67b0: 64 20 62 79 20 65 76 61 6c 75 61 74 69 6e 67 20  d by evaluating 
67c0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
67d0: 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e 3a   SQL expression:
67e0: 0a 2a 2a 0a 2a 2a 20 20 20 74 6b 74 32 32 31 33  .**.**   tkt2213
67f0: 66 75 6e 63 28 74 6b 74 32 32 31 33 66 75 6e 63  func(tkt2213func
6800: 28 27 61 20 73 74 72 69 6e 67 27 29 29 3b 0a 2a  ('a string'));.*
6810: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 6b  /.static void tk
6820: 74 32 32 31 33 46 75 6e 63 74 69 6f 6e 28 0a 20  t2213Function(. 
6830: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
6840: 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e   *context, .  in
6850: 74 20 61 72 67 63 2c 20 20 0a 20 20 73 71 6c 69  t argc,  .  sqli
6860: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
6870: 0a 29 7b 0a 20 20 69 6e 74 20 6e 54 65 78 74 3b  .){.  int nText;
6880: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
6890: 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74 31 3b 0a   const *zText1;.
68a0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
68b0: 63 6f 6e 73 74 20 2a 7a 54 65 78 74 32 3b 0a 20  const *zText2;. 
68c0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63   unsigned char c
68d0: 6f 6e 73 74 20 2a 7a 54 65 78 74 33 3b 0a 0a 20  onst *zText3;.. 
68e0: 20 6e 54 65 78 74 20 3d 20 73 71 6c 69 74 65 33   nText = sqlite3
68f0: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67  _value_bytes(arg
6900: 76 5b 30 5d 29 3b 0a 20 20 7a 54 65 78 74 31 20  v[0]);.  zText1 
6910: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
6920: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
6930: 20 7a 54 65 78 74 32 20 3d 20 73 71 6c 69 74 65   zText2 = sqlite
6940: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
6950: 76 5b 30 5d 29 3b 0a 20 20 7a 54 65 78 74 33 20  v[0]);.  zText3 
6960: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
6970: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 0a  text(argv[0]);..
6980: 20 20 69 66 28 20 7a 54 65 78 74 31 21 3d 7a 54    if( zText1!=zT
6990: 65 78 74 32 20 7c 7c 20 7a 54 65 78 74 32 21 3d  ext2 || zText2!=
69a0: 7a 54 65 78 74 33 20 29 7b 0a 20 20 20 20 73 71  zText3 ){.    sq
69b0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
69c0: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 74 6b 74  or(context, "tkt
69d0: 32 32 31 33 20 69 73 20 6e 6f 74 20 66 69 78 65  2213 is not fixe
69e0: 64 22 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65  d", -1);.  }else
69f0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 70  {.    char *zCop
6a00: 79 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  y = (char *)sqli
6a10: 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 54 65 78 74  te3_malloc(nText
6a20: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 43  );.    memcpy(zC
6a30: 6f 70 79 2c 20 7a 54 65 78 74 31 2c 20 6e 54 65  opy, zText1, nTe
6a40: 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  xt);.    sqlite3
6a50: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
6a60: 74 65 78 74 2c 20 7a 43 6f 70 79 2c 20 6e 54 65  text, zCopy, nTe
6a70: 78 74 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  xt, sqlite3_free
6a80: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6a90: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51  The following SQ
6aa0: 4c 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73  L function takes
6ab0: 20 34 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54   4 arguments.  T
6ac0: 68 65 20 32 6e 64 20 61 6e 64 0a 2a 2a 20 34 74  he 2nd and.** 4t
6ad0: 68 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20  h argument must 
6ae0: 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 20  be one of these 
6af0: 73 74 72 69 6e 67 73 3a 20 20 27 74 65 78 74 27  strings:  'text'
6b00: 2c 20 27 74 65 78 74 31 36 27 2c 0a 2a 2a 20 6f  , 'text16',.** o
6b10: 72 20 27 62 6c 6f 62 27 20 63 6f 72 72 65 73 70  r 'blob' corresp
6b20: 6f 6e 64 69 6e 67 20 74 6f 20 41 50 49 20 66 75  onding to API fu
6b30: 6e 63 74 69 6f 6e 73 0a 2a 2a 0a 2a 2a 20 20 20  nctions.**.**   
6b40: 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
6b50: 5f 74 65 78 74 28 29 0a 2a 2a 20 20 20 20 20 20  _text().**      
6b60: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
6b70: 78 74 31 36 28 29 0a 2a 2a 20 20 20 20 20 20 73  xt16().**      s
6b80: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
6b90: 62 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68  b().**.** The th
6ba0: 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ird argument is 
6bb0: 61 20 73 74 72 69 6e 67 2c 20 65 69 74 68 65 72  a string, either
6bc0: 20 27 62 79 74 65 73 27 20 6f 72 20 27 62 79 74   'bytes' or 'byt
6bd0: 65 73 31 36 27 20 6f 72 20 27 6e 6f 6f 70 27 2c  es16' or 'noop',
6be0: 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
6bf0: 67 20 74 6f 20 41 50 49 73 3a 0a 2a 2a 0a 2a 2a  g to APIs:.**.**
6c00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
6c10: 6c 75 65 5f 62 79 74 65 73 28 29 0a 2a 2a 20 20  lue_bytes().**  
6c20: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
6c30: 65 5f 62 79 74 65 73 31 36 28 29 0a 2a 2a 20 20  e_bytes16().**  
6c40: 20 20 20 20 6e 6f 6f 70 0a 2a 2a 0a 2a 2a 20 54      noop.**.** T
6c50: 68 65 20 41 50 49 73 20 64 65 73 69 67 6e 61 74  he APIs designat
6c60: 65 64 20 62 79 20 74 68 65 20 32 6e 64 20 74 68  ed by the 2nd th
6c70: 72 6f 75 67 68 20 34 74 68 20 61 72 67 75 6d 65  rough 4th argume
6c80: 6e 74 73 20 61 72 65 20 61 70 70 6c 69 65 64 0a  nts are applied.
6c90: 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ** to the first 
6ca0: 61 72 67 75 6d 65 6e 74 20 69 6e 20 6f 72 64 65  argument in orde
6cb0: 72 2e 20 20 49 66 20 74 68 65 20 70 6f 69 6e 74  r.  If the point
6cc0: 65 72 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ers returned by 
6cd0: 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 6e  the.** second an
6ce0: 64 20 66 6f 75 72 74 68 20 61 72 65 20 64 69 66  d fourth are dif
6cf0: 66 65 72 65 6e 74 2c 20 74 68 69 73 20 72 6f 75  ferent, this rou
6d00: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 20  tine returns 1. 
6d10: 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 74   Otherwise,.** t
6d20: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
6d30: 72 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rns 0..**.** Thi
6d40: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
6d50: 65 64 20 74 6f 20 74 65 73 74 20 74 6f 20 73 65  ed to test to se
6d60: 65 20 77 68 65 6e 20 72 65 74 75 72 6e 65 64 20  e when returned 
6d70: 70 6f 69 6e 74 65 72 73 20 66 72 6f 6d 0a 2a 2a  pointers from.**
6d80: 20 74 68 65 20 5f 74 65 78 74 28 29 2c 20 5f 74   the _text(), _t
6d90: 65 78 74 31 36 28 29 20 61 6e 64 20 5f 62 6c 6f  ext16() and _blo
6da0: 62 28 29 20 41 50 49 73 20 62 65 63 6f 6d 65 20  b() APIs become 
6db0: 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a  invalidated..*/.
6dc0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 43  static void ptrC
6dd0: 68 6e 67 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73  hngFunction(.  s
6de0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
6df0: 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20  context, .  int 
6e00: 61 72 67 63 2c 20 20 0a 20 20 73 71 6c 69 74 65  argc,  .  sqlite
6e10: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
6e20: 7b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  {.  const void *
6e30: 70 31 2c 20 2a 70 32 3b 0a 20 20 63 6f 6e 73 74  p1, *p2;.  const
6e40: 20 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20 69   char *zCmd;.  i
6e50: 66 28 20 61 72 67 63 21 3d 34 20 29 20 72 65 74  f( argc!=4 ) ret
6e60: 75 72 6e 3b 0a 20 20 7a 43 6d 64 20 3d 20 28 63  urn;.  zCmd = (c
6e70: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
6e80: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
6e90: 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 7a 43  gv[1]);.  if( zC
6ea0: 6d 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  md==0 ) return;.
6eb0: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d    if( strcmp(zCm
6ec0: 64 2c 22 74 65 78 74 22 29 3d 3d 30 20 29 7b 0a  d,"text")==0 ){.
6ed0: 20 20 20 20 70 31 20 3d 20 28 63 6f 6e 73 74 20      p1 = (const 
6ee0: 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61  void*)sqlite3_va
6ef0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
6f00: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
6f10: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 7d  E_OMIT_UTF16.  }
6f20: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
6f30: 7a 43 6d 64 2c 20 22 74 65 78 74 31 36 22 29 3d  zCmd, "text16")=
6f40: 3d 30 20 29 7b 0a 20 20 20 20 70 31 20 3d 20 28  =0 ){.    p1 = (
6f50: 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c 69  const void*)sqli
6f60: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36  te3_value_text16
6f70: 28 61 72 67 76 5b 30 5d 29 3b 0a 23 65 6e 64 69  (argv[0]);.#endi
6f80: 66 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  f.  }else if( st
6f90: 72 63 6d 70 28 7a 43 6d 64 2c 20 22 62 6c 6f 62  rcmp(zCmd, "blob
6fa0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 31 20  ")==0 ){.    p1 
6fb0: 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73  = (const void*)s
6fc0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
6fd0: 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7d 65  b(argv[0]);.  }e
6fe0: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  lse{.    return;
6ff0: 0a 20 20 7d 0a 20 20 7a 43 6d 64 20 3d 20 28 63  .  }.  zCmd = (c
7000: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
7010: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
7020: 67 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 7a 43  gv[2]);.  if( zC
7030: 6d 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  md==0 ) return;.
7040: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d    if( strcmp(zCm
7050: 64 2c 22 62 79 74 65 73 22 29 3d 3d 30 20 29 7b  d,"bytes")==0 ){
7060: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  .    sqlite3_val
7070: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d  ue_bytes(argv[0]
7080: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
7090: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 7d  E_OMIT_UTF16.  }
70a0: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
70b0: 7a 43 6d 64 2c 20 22 62 79 74 65 73 31 36 22 29  zCmd, "bytes16")
70c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
70d0: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 31 36  e3_value_bytes16
70e0: 28 61 72 67 76 5b 30 5d 29 3b 0a 23 65 6e 64 69  (argv[0]);.#endi
70f0: 66 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  f.  }else if( st
7100: 72 63 6d 70 28 7a 43 6d 64 2c 20 22 6e 6f 6f 70  rcmp(zCmd, "noop
7110: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ")==0 ){.    /* 
7120: 64 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20  do nothing */.  
7130: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
7140: 6e 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64 20 3d 20  n;.  }.  zCmd = 
7150: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
7160: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
7170: 61 72 67 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20  argv[3]);.  if( 
7180: 7a 43 6d 64 3d 3d 30 20 29 20 72 65 74 75 72 6e  zCmd==0 ) return
7190: 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a  ;.  if( strcmp(z
71a0: 43 6d 64 2c 22 74 65 78 74 22 29 3d 3d 30 20 29  Cmd,"text")==0 )
71b0: 7b 0a 20 20 20 20 70 32 20 3d 20 28 63 6f 6e 73  {.    p2 = (cons
71c0: 74 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f  t void*)sqlite3_
71d0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
71e0: 30 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0]);.#ifndef SQL
71f0: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
7200: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
7210: 70 28 7a 43 6d 64 2c 20 22 74 65 78 74 31 36 22  p(zCmd, "text16"
7220: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 32 20 3d  )==0 ){.    p2 =
7230: 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71   (const void*)sq
7240: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
7250: 31 36 28 61 72 67 76 5b 30 5d 29 3b 0a 23 65 6e  16(argv[0]);.#en
7260: 64 69 66 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  dif.  }else if( 
7270: 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 62 6c  strcmp(zCmd, "bl
7280: 6f 62 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ob")==0 ){.    p
7290: 32 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a  2 = (const void*
72a0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62  )sqlite3_value_b
72b0: 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  lob(argv[0]);.  
72c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
72d0: 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
72e0: 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74  _result_int(cont
72f0: 65 78 74 2c 20 70 31 21 3d 70 32 29 3b 0a 7d 0a  ext, p1!=p2);.}.
7300: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
7310: 73 71 6c 69 74 65 5f 74 65 73 74 5f 63 72 65 61  sqlite_test_crea
7320: 74 65 5f 66 75 6e 63 74 69 6f 6e 20 44 42 0a 2a  te_function DB.*
7330: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 73 71  *.** Call the sq
7340: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
7350: 63 74 69 6f 6e 20 41 50 49 20 6f 6e 20 74 68 65  ction API on the
7360: 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20   given database 
7370: 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 63  in order.** to c
7380: 72 65 61 74 65 20 61 20 66 75 6e 63 74 69 6f 6e  reate a function
7390: 20 6e 61 6d 65 64 20 22 78 5f 63 6f 61 6c 65 73   named "x_coales
73a0: 63 65 22 2e 20 20 54 68 69 73 20 66 75 6e 63 74  ce".  This funct
73b0: 69 6f 6e 20 64 6f 65 73 20 74 68 65 20 73 61 6d  ion does the sam
73c0: 65 20 74 68 69 6e 67 0a 2a 2a 20 61 73 20 74 68  e thing.** as th
73d0: 65 20 22 63 6f 61 6c 65 73 63 65 22 20 66 75 6e  e "coalesce" fun
73e0: 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e  ction.  This fun
73f0: 63 74 69 6f 6e 20 61 6c 73 6f 20 72 65 67 69 73  ction also regis
7400: 74 65 72 73 20 61 6e 20 53 51 4c 20 66 75 6e 63  ters an SQL func
7410: 74 69 6f 6e 0a 2a 2a 20 6e 61 6d 65 64 20 22 78  tion.** named "x
7420: 5f 73 71 6c 69 74 65 5f 65 78 65 63 22 20 74 68  _sqlite_exec" th
7430: 61 74 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69 74  at invokes sqlit
7440: 65 33 5f 65 78 65 63 28 29 2e 20 20 49 6e 76 6f  e3_exec().  Invo
7450: 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 65 78 65  king sqlite3_exe
7460: 63 28 29 0a 2a 2a 20 69 6e 20 74 68 69 73 20 77  c().** in this w
7470: 61 79 20 69 73 20 69 6c 6c 65 67 61 6c 20 72 65  ay is illegal re
7480: 63 75 72 73 69 6f 6e 20 61 6e 64 20 73 68 6f 75  cursion and shou
7490: 6c 64 20 72 61 69 73 65 20 61 6e 20 53 51 4c 49  ld raise an SQLI
74a0: 54 45 5f 4d 49 53 55 53 45 20 65 72 72 6f 72 2e  TE_MISUSE error.
74b0: 0a 2a 2a 20 54 68 65 20 65 66 66 65 63 74 20 69  .** The effect i
74c0: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 72 79  s similar to try
74d0: 69 6e 67 20 74 6f 20 75 73 65 20 74 68 65 20 73  ing to use the s
74e0: 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ame database con
74f0: 6e 65 63 74 69 6f 6e 20 66 72 6f 6d 0a 2a 2a 20  nection from.** 
7500: 74 77 6f 20 74 68 72 65 61 64 73 20 61 74 20 74  two threads at t
7510: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a  he same time..**
7520: 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  .** The original
7530: 20 6d 6f 74 69 76 61 74 69 6f 6e 20 66 6f 72 20   motivation for 
7540: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
7550: 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 63   to be able to c
7560: 61 6c 6c 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  all the.** sqlit
7570: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
7580: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c  on function whil
7590: 65 20 61 20 71 75 65 72 79 20 69 73 20 69 6e 20  e a query is in 
75a0: 70 72 6f 67 72 65 73 73 20 69 6e 20 6f 72 64 65  progress in orde
75b0: 72 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65  r.** to test the
75c0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 64   SQLITE_MISUSE d
75d0: 65 74 65 63 74 69 6f 6e 20 6c 6f 67 69 63 2e 0a  etection logic..
75e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
75f0: 73 74 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  st_create_functi
7600: 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  on(.  void *NotU
7610: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
7620: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
7630: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
7640: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
7650: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
7660: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
7670: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
7680: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
7690: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
76a0: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
76b0: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
76c0: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  gument */.){.  i
76d0: 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
76e0: 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 61 72 67   *db;..  if( arg
76f0: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
7700: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
7710: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
7720: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
7730: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
7740: 20 20 20 22 20 44 42 5c 22 22 2c 20 30 29 3b 0a     " DB\"", 0);.
7750: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
7760: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
7770: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
7780: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
7790: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
77a0: 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
77b0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
77c0: 63 74 69 6f 6e 28 64 62 2c 20 22 78 5f 63 6f 61  ction(db, "x_coa
77d0: 6c 65 73 63 65 22 2c 20 2d 31 2c 20 53 51 4c 49  lesce", -1, SQLI
77e0: 54 45 5f 41 4e 59 2c 20 30 2c 20 0a 20 20 20 20  TE_ANY, 0, .    
77f0: 20 20 20 20 74 31 5f 69 66 6e 75 6c 6c 46 75 6e      t1_ifnullFun
7800: 63 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  c, 0, 0);.  if( 
7810: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
7820: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
7830: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
7840: 6e 28 64 62 2c 20 22 68 65 78 38 22 2c 20 31 2c  n(db, "hex8", 1,
7850: 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20   SQLITE_ANY, 0, 
7860: 0a 20 20 20 20 20 20 20 20 20 20 68 65 78 38 46  .          hex8F
7870: 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  unc, 0, 0);.  }.
7880: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7890: 4d 49 54 5f 55 54 46 31 36 0a 20 20 69 66 28 20  MIT_UTF16.  if( 
78a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
78b0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
78c0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
78d0: 6e 28 64 62 2c 20 22 68 65 78 31 36 22 2c 20 31  n(db, "hex16", 1
78e0: 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c  , SQLITE_ANY, 0,
78f0: 20 0a 20 20 20 20 20 20 20 20 20 20 68 65 78 31   .          hex1
7900: 36 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20  6Func, 0, 0);.  
7910: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72  }.#endif.  if( r
7920: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
7930: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7940: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
7950: 28 64 62 2c 20 22 74 6b 74 32 32 31 33 66 75 6e  (db, "tkt2213fun
7960: 63 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 41 4e  c", 1, SQLITE_AN
7970: 59 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  Y, 0, .         
7980: 20 74 6b 74 32 32 31 33 46 75 6e 63 74 69 6f 6e   tkt2213Function
7990: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  , 0, 0);.  }.  i
79a0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
79b0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
79c0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
79d0: 74 69 6f 6e 28 64 62 2c 20 22 70 6f 69 6e 74 65  tion(db, "pointe
79e0: 72 5f 63 68 61 6e 67 65 22 2c 20 34 2c 20 53 51  r_change", 4, SQ
79f0: 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20 0a 20 20  LITE_ANY, 0, .  
7a00: 20 20 20 20 20 20 20 20 70 74 72 43 68 6e 67 46          ptrChngF
7a10: 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a  unction, 0, 0);.
7a20: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
7a30: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
7a40: 20 2f 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69   /* Use the sqli
7a50: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
7a60: 69 6f 6e 31 36 28 29 20 41 50 49 20 68 65 72 65  ion16() API here
7a70: 2e 20 4d 61 69 6e 6c 79 20 66 6f 72 20 66 75 6e  . Mainly for fun
7a80: 2c 20 62 75 74 20 61 6c 73 6f 20 0a 20 20 2a 2a  , but also .  **
7a90: 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20 6e   because it is n
7aa0: 6f 74 20 74 65 73 74 65 64 20 61 6e 79 77 68 65  ot tested anywhe
7ab0: 72 65 20 65 6c 73 65 2e 20 2a 2f 0a 20 20 69 66  re else. */.  if
7ac0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
7ad0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f 69  ){.    const voi
7ae0: 64 20 2a 7a 55 74 66 31 36 3b 0a 20 20 20 20 73  d *zUtf16;.    s
7af0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
7b00: 61 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  al;.    sqlite3_
7b10: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
7b20: 6d 75 74 65 78 29 3b 0a 20 20 20 20 70 56 61 6c  mutex);.    pVal
7b30: 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
7b40: 65 77 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69  ew(db);.    sqli
7b50: 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70  te3ValueSetStr(p
7b60: 56 61 6c 2c 20 2d 31 2c 20 22 78 5f 73 71 6c 69  Val, -1, "x_sqli
7b70: 74 65 5f 65 78 65 63 22 2c 20 53 51 4c 49 54 45  te_exec", SQLITE
7b80: 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54  _UTF8, SQLITE_ST
7b90: 41 54 49 43 29 3b 0a 20 20 20 20 7a 55 74 66 31  ATIC);.    zUtf1
7ba0: 36 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  6 = sqlite3Value
7bb0: 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49 54  Text(pVal, SQLIT
7bc0: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a  E_UTF16NATIVE);.
7bd0: 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
7be0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
7bf0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
7c00: 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
7c10: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
7c20: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
7c30: 6f 6e 31 36 28 64 62 2c 20 7a 55 74 66 31 36 2c  on16(db, zUtf16,
7c40: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
7c50: 20 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31    1, SQLITE_UTF1
7c60: 36 2c 20 64 62 2c 20 73 71 6c 69 74 65 33 45 78  6, db, sqlite3Ex
7c70: 65 63 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  ecFunc, 0, 0);. 
7c80: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
7c90: 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
7ca0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
7cb0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
7cc0: 65 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ex);.  }.#endif.
7cd0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
7ce0: 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
7cf0: 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
7d00: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
7d10: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
7d20: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
7d30: 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30  ErrorName(rc), 0
7d40: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
7d50: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75  OK;.}../*.** Rou
7d60: 74 69 6e 65 73 20 74 6f 20 69 6d 70 6c 65 6d 65  tines to impleme
7d70: 6e 74 20 74 68 65 20 78 5f 63 6f 75 6e 74 28 29  nt the x_count()
7d80: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
7d90: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 78 5f 63 6f 75  ion..**.** x_cou
7da0: 6e 74 28 29 20 63 6f 75 6e 74 73 20 74 68 65 20  nt() counts the 
7db0: 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 6e 75  number of non-nu
7dc0: 6c 6c 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 42  ll arguments.  B
7dd0: 75 74 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20  ut there are.** 
7de0: 73 6f 6d 65 20 74 77 69 73 74 73 20 66 6f 72 20  some twists for 
7df0: 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73  testing purposes
7e00: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 61  ..**.** If the a
7e10: 72 67 75 6d 65 6e 74 20 74 6f 20 78 5f 63 6f 75  rgument to x_cou
7e20: 6e 74 28 29 20 69 73 20 34 30 20 74 68 65 6e 20  nt() is 40 then 
7e30: 61 20 55 54 46 2d 38 20 65 72 72 6f 72 20 69 73  a UTF-8 error is
7e40: 20 72 65 70 6f 72 74 65 64 0a 2a 2a 20 6f 6e 20   reported.** on 
7e50: 74 68 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f  the step functio
7e60: 6e 2e 20 20 49 66 20 78 5f 63 6f 75 6e 74 28 34  n.  If x_count(4
7e70: 31 29 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e  1) is seen, then
7e80: 20 61 20 55 54 46 2d 31 36 20 65 72 72 6f 72 0a   a UTF-16 error.
7e90: 2a 2a 20 69 73 20 72 65 70 6f 72 74 65 64 20 6f  ** is reported o
7ea0: 6e 20 74 68 65 20 73 74 65 70 20 66 75 6e 63 74  n the step funct
7eb0: 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 74 6f 74  ion.  If the tot
7ec0: 61 6c 20 63 6f 75 6e 74 20 69 73 20 34 32 2c 20  al count is 42, 
7ed0: 74 68 65 6e 0a 2a 2a 20 61 20 55 54 46 2d 38 20  then.** a UTF-8 
7ee0: 65 72 72 6f 72 20 69 73 20 72 65 70 6f 72 74 65  error is reporte
7ef0: 64 20 6f 6e 20 74 68 65 20 66 69 6e 61 6c 69 7a  d on the finaliz
7f00: 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 74  e function..*/.t
7f10: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 74 31  ypedef struct t1
7f20: 43 6f 75 6e 74 43 74 78 20 74 31 43 6f 75 6e 74  CountCtx t1Count
7f30: 43 74 78 3b 0a 73 74 72 75 63 74 20 74 31 43 6f  Ctx;.struct t1Co
7f40: 75 6e 74 43 74 78 20 7b 0a 20 20 69 6e 74 20 6e  untCtx {.  int n
7f50: 3b 0a 7d 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.};.static void
7f60: 20 74 31 43 6f 75 6e 74 53 74 65 70 28 0a 20 20   t1CountStep(.  
7f70: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
7f80: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
7f90: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
7fa0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
7fb0: 20 20 74 31 43 6f 75 6e 74 43 74 78 20 2a 70 3b    t1CountCtx *p;
7fc0: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61  .  p = sqlite3_a
7fd0: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
7fe0: 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66  (context, sizeof
7ff0: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 28 61 72  (*p));.  if( (ar
8000: 67 63 3d 3d 30 20 7c 7c 20 53 51 4c 49 54 45 5f  gc==0 || SQLITE_
8010: 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61  NULL!=sqlite3_va
8020: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
8030: 29 20 29 20 26 26 20 70 20 29 7b 0a 20 20 20 20  ) ) && p ){.    
8040: 70 2d 3e 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66  p->n++;.  }.  if
8050: 28 20 61 72 67 63 3e 30 20 29 7b 0a 20 20 20 20  ( argc>0 ){.    
8060: 69 6e 74 20 76 20 3d 20 73 71 6c 69 74 65 33 5f  int v = sqlite3_
8070: 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 30  value_int(argv[0
8080: 5d 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 34  ]);.    if( v==4
8090: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
80a0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
80b0: 63 6f 6e 74 65 78 74 2c 20 22 76 61 6c 75 65 20  context, "value 
80c0: 6f 66 20 34 30 20 68 61 6e 64 65 64 20 74 6f 20  of 40 handed to 
80d0: 78 5f 63 6f 75 6e 74 22 2c 20 2d 31 29 3b 0a 23  x_count", -1);.#
80e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
80f0: 49 54 5f 55 54 46 31 36 0a 20 20 20 20 7d 65 6c  IT_UTF16.    }el
8100: 73 65 20 69 66 28 20 76 3d 3d 34 31 20 29 7b 0a  se if( v==41 ){.
8110: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
8120: 20 7a 55 74 66 31 36 45 72 72 4d 73 67 5b 5d 20   zUtf16ErrMsg[] 
8130: 3d 20 7b 20 30 2c 20 30 78 36 31 2c 20 30 2c 20  = { 0, 0x61, 0, 
8140: 30 78 36 32 2c 20 30 2c 20 30 78 36 33 2c 20 30  0x62, 0, 0x63, 0
8150: 2c 20 30 2c 20 30 7d 3b 0a 20 20 20 20 20 20 73  , 0, 0};.      s
8160: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
8170: 72 6f 72 31 36 28 63 6f 6e 74 65 78 74 2c 20 26  ror16(context, &
8180: 7a 55 74 66 31 36 45 72 72 4d 73 67 5b 31 2d 53  zUtf16ErrMsg[1-S
8190: 51 4c 49 54 45 5f 42 49 47 45 4e 44 49 41 4e 5d  QLITE_BIGENDIAN]
81a0: 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20  , -1);.#endif.  
81b0: 20 20 7d 0a 20 20 7d 0a 7d 20 20 20 0a 73 74 61    }.  }.}   .sta
81c0: 74 69 63 20 76 6f 69 64 20 74 31 43 6f 75 6e 74  tic void t1Count
81d0: 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33  Finalize(sqlite3
81e0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
81f0: 74 29 7b 0a 20 20 74 31 43 6f 75 6e 74 43 74 78  t){.  t1CountCtx
8200: 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74   *p;.  p = sqlit
8210: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
8220: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69  text(context, si
8230: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28  zeof(*p));.  if(
8240: 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d   p ){.    if( p-
8250: 3e 6e 3d 3d 34 32 20 29 7b 0a 20 20 20 20 20 20  >n==42 ){.      
8260: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
8270: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 78  rror(context, "x
8280: 5f 63 6f 75 6e 74 20 74 6f 74 61 6c 73 20 74 6f  _count totals to
8290: 20 34 32 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d   42", -1);.    }
82a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
82b0: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63  te3_result_int(c
82c0: 6f 6e 74 65 78 74 2c 20 70 20 3f 20 70 2d 3e 6e  ontext, p ? p->n
82d0: 20 3a 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   : 0);.    }.  }
82e0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
82f0: 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
8300: 45 44 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  ED.static void l
8310: 65 67 61 63 79 43 6f 75 6e 74 53 74 65 70 28 0a  egacyCountStep(.
8320: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
8330: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
8340: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
8350: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
8360: 7b 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a  {.  /* no-op */.
8370: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  }..static void l
8380: 65 67 61 63 79 43 6f 75 6e 74 46 69 6e 61 6c 69  egacyCountFinali
8390: 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  ze(sqlite3_conte
83a0: 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20  xt *context){.  
83b0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
83c0: 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69  nt(context, sqli
83d0: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
83e0: 75 6e 74 28 63 6f 6e 74 65 78 74 29 29 3b 0a 7d  unt(context));.}
83f0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55  .#endif../*.** U
8400: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 63  sage:  sqlite3_c
8410: 72 65 61 74 65 5f 61 67 67 72 65 67 61 74 65 20  reate_aggregate 
8420: 44 42 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68  DB.**.** Call th
8430: 65 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  e sqlite3_create
8440: 5f 66 75 6e 63 74 69 6f 6e 20 41 50 49 20 6f 6e  _function API on
8450: 20 74 68 65 20 67 69 76 65 6e 20 64 61 74 61 62   the given datab
8460: 61 73 65 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20  ase in order.** 
8470: 74 6f 20 63 72 65 61 74 65 20 61 20 66 75 6e 63  to create a func
8480: 74 69 6f 6e 20 6e 61 6d 65 64 20 22 78 5f 63 6f  tion named "x_co
8490: 75 6e 74 22 2e 20 20 54 68 69 73 20 66 75 6e 63  unt".  This func
84a0: 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 0a  tion is similar.
84b0: 2a 2a 20 74 6f 20 74 68 65 20 62 75 69 6c 74 2d  ** to the built-
84c0: 69 6e 20 63 6f 75 6e 74 28 29 20 66 75 6e 63 74  in count() funct
84d0: 69 6f 6e 2c 20 77 69 74 68 20 61 20 66 65 77 20  ion, with a few 
84e0: 73 70 65 63 69 61 6c 20 71 75 69 72 6b 73 0a 2a  special quirks.*
84f0: 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 74 68  * for testing th
8500: 65 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  e sqlite3_result
8510: 5f 65 72 72 6f 72 28 29 20 41 50 49 73 2e 0a 2a  _error() APIs..*
8520: 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61  *.** The origina
8530: 6c 20 6d 6f 74 69 76 61 74 69 6f 6e 20 66 6f 72  l motivation for
8540: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
8550: 73 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20  s to be able to 
8560: 63 61 6c 6c 20 74 68 65 0a 2a 2a 20 73 71 6c 69  call the.** sqli
8570: 74 65 33 5f 63 72 65 61 74 65 5f 61 67 67 72 65  te3_create_aggre
8580: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 77 68  gate function wh
8590: 69 6c 65 20 61 20 71 75 65 72 79 20 69 73 20 69  ile a query is i
85a0: 6e 20 70 72 6f 67 72 65 73 73 20 69 6e 20 6f 72  n progress in or
85b0: 64 65 72 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74  der.** to test t
85c0: 68 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  he SQLITE_MISUSE
85d0: 20 64 65 74 65 63 74 69 6f 6e 20 6c 6f 67 69 63   detection logic
85e0: 2e 20 20 53 65 65 20 6d 69 73 75 73 65 2e 74 65  .  See misuse.te
85f0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  st..**.** This r
8600: 6f 75 74 69 6e 65 20 77 61 73 20 6c 61 74 65 72  outine was later
8610: 20 65 78 74 65 6e 64 65 64 20 74 6f 20 74 65 73   extended to tes
8620: 74 20 74 68 65 20 75 73 65 20 6f 66 20 73 71 6c  t the use of sql
8630: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
8640: 72 28 29 0a 2a 2a 20 77 69 74 68 69 6e 20 61 67  r().** within ag
8650: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
8660: 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 74 65 72 3a 20  s..**.** Later: 
8670: 49 74 20 69 73 20 6e 6f 77 20 61 6c 73 6f 20 65  It is now also e
8680: 78 74 65 6e 64 65 64 20 74 6f 20 72 65 67 69 73  xtended to regis
8690: 74 65 72 20 74 68 65 20 61 67 67 72 65 67 61 74  ter the aggregat
86a0: 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 22 6c  e function.** "l
86b0: 65 67 61 63 79 5f 63 6f 75 6e 74 28 29 22 20 77  egacy_count()" w
86c0: 69 74 68 20 74 68 65 20 73 75 70 70 6c 69 65 64  ith the supplied
86d0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
86e0: 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 0a 2a  . This is used.*
86f0: 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 64 65  * to test the de
8700: 70 72 65 63 61 74 65 64 20 73 71 6c 69 74 65 33  precated sqlite3
8710: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 75 6e 74  _aggregate_count
8720: 28 29 20 41 50 49 2e 0a 2a 2f 0a 73 74 61 74 69  () API..*/.stati
8730: 63 20 69 6e 74 20 74 65 73 74 5f 63 72 65 61 74  c int test_creat
8740: 65 5f 61 67 67 72 65 67 61 74 65 28 0a 20 20 76  e_aggregate(.  v
8750: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
8760: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
8770: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
8780: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
8790: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
87a0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
87b0: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
87c0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
87d0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
87e0: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
87f0: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
8800: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
8810: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
8820: 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *db;.  int rc;. 
8830: 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a   if( argc!=2 ){.
8840: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
8850: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
8860: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
8870: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
8880: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c  0],.       " FIL
8890: 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20  ENAME\"", 0);.  
88a0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
88b0: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
88c0: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
88d0: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
88e0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
88f0: 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
8900: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
8910: 69 6f 6e 28 64 62 2c 20 22 78 5f 63 6f 75 6e 74  ion(db, "x_count
8920: 22 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 0, SQLITE_UTF
8930: 38 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 74  8, 0, 0,.      t
8940: 31 43 6f 75 6e 74 53 74 65 70 2c 74 31 43 6f 75  1CountStep,t1Cou
8950: 6e 74 46 69 6e 61 6c 69 7a 65 29 3b 0a 20 20 69  ntFinalize);.  i
8960: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
8970: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
8980: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
8990: 74 69 6f 6e 28 64 62 2c 20 22 78 5f 63 6f 75 6e  tion(db, "x_coun
89a0: 74 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54  t", 1, SQLITE_UT
89b0: 46 38 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  F8, 0, 0,.      
89c0: 20 20 74 31 43 6f 75 6e 74 53 74 65 70 2c 74 31    t1CountStep,t1
89d0: 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 29 3b 0a  CountFinalize);.
89e0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
89f0: 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
8a00: 45 44 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ED.  if( rc==SQL
8a10: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
8a20: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
8a30: 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
8a40: 6c 65 67 61 63 79 5f 63 6f 75 6e 74 22 2c 20 30  legacy_count", 0
8a50: 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c  , SQLITE_ANY, 0,
8a60: 20 30 2c 0a 20 20 20 20 20 20 20 20 6c 65 67 61   0,.        lega
8a70: 63 79 43 6f 75 6e 74 53 74 65 70 2c 20 6c 65 67  cyCountStep, leg
8a80: 61 63 79 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65  acyCountFinalize
8a90: 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  .    );.  }.#end
8aa0: 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  if.  if( sqlite3
8ab0: 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
8ac0: 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65  rp, db, rc) ) re
8ad0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8ae0: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
8af0: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
8b00: 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  t1ErrorName(rc),
8b10: 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43   0);.  return TC
8b20: 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
8b30: 55 73 61 67 65 3a 20 20 70 72 69 6e 74 66 20 54  Usage:  printf T
8b40: 45 58 54 0a 2a 2a 0a 2a 2a 20 53 65 6e 64 20 6f  EXT.**.** Send o
8b50: 75 74 70 75 74 20 74 6f 20 70 72 69 6e 74 66 2e  utput to printf.
8b60: 20 20 55 73 65 20 74 68 69 73 20 72 61 74 68 65    Use this rathe
8b70: 72 20 74 68 61 6e 20 70 75 74 73 20 74 6f 20 6d  r than puts to m
8b80: 65 72 67 65 20 74 68 65 20 6f 75 74 70 75 74 0a  erge the output.
8b90: 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63  ** in the correc
8ba0: 74 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20  t sequence with 
8bb0: 64 65 62 75 67 67 69 6e 67 20 70 72 69 6e 74 66  debugging printf
8bc0: 73 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  s inserted into 
8bd0: 43 20 63 6f 64 65 2e 0a 2a 2a 20 50 75 74 73 20  C code..** Puts 
8be0: 75 73 65 73 20 61 20 73 65 70 61 72 61 74 65 20  uses a separate 
8bf0: 62 75 66 66 65 72 20 61 6e 64 20 64 65 62 75 67  buffer and debug
8c00: 67 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  ging statements 
8c10: 77 69 6c 6c 20 62 65 20 6f 75 74 20 6f 66 0a 2a  will be out of.*
8c20: 2a 20 73 65 71 75 65 6e 63 65 20 69 66 20 69 74  * sequence if it
8c30: 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 73 74 61   is used..*/.sta
8c40: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72 69  tic int test_pri
8c50: 6e 74 66 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  ntf(.  void *Not
8c60: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
8c70: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
8c80: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
8c90: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
8ca0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
8cb0: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
8cc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8cd0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
8ce0: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
8cf0: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
8d00: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
8d10: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
8d20: 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20  if( argc!=2 ){. 
8d30: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
8d40: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
8d50: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
8d60: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
8d70: 5d 2c 0a 20 20 20 20 20 20 20 22 20 54 45 58 54  ],.       " TEXT
8d80: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
8d90: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8da0: 20 7d 0a 20 20 70 72 69 6e 74 66 28 22 25 73 5c   }.  printf("%s\
8db0: 6e 22 2c 20 61 72 67 76 5b 31 5d 29 3b 0a 20 20  n", argv[1]);.  
8dc0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
8dd0: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  ..../*.** Usage:
8de0: 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
8df0: 66 5f 69 6e 74 20 46 4f 52 4d 41 54 20 49 4e 54  f_int FORMAT INT
8e00: 45 47 45 52 20 49 4e 54 45 47 45 52 20 49 4e 54  EGER INTEGER INT
8e10: 45 47 45 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  EGER.**.** Call 
8e20: 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74 68 72  mprintf with thr
8e30: 65 65 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d  ee integer argum
8e40: 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ents.*/.static i
8e50: 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  nt sqlite3_mprin
8e60: 74 66 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a  tf_int(.  void *
8e70: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
8e80: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
8e90: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
8ea0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
8eb0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
8ec0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
8ed0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
8ee0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
8ef0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
8f00: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
8f10: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
8f20: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
8f30: 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a  .  int a[3], i;.
8f40: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28    char *z;.  if(
8f50: 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20   argc!=5 ){.    
8f60: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8f70: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
8f80: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
8f90: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
8fa0: 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20         " FORMAT 
8fb0: 49 4e 54 20 49 4e 54 20 49 4e 54 5c 22 22 2c 20  INT INT INT\"", 
8fc0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
8fd0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
8fe0: 66 6f 72 28 69 3d 32 3b 20 69 3c 35 3b 20 69 2b  for(i=2; i<5; i+
8ff0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f  +){.    if( Tcl_
9000: 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
9010: 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 29  rgv[i], &a[i-2])
9020: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
9030: 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73  ROR;.  }.  z = s
9040: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
9050: 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b  rgv[1], a[0], a[
9060: 31 5d 2c 20 61 5b 32 5d 29 3b 0a 20 20 54 63 6c  1], a[2]);.  Tcl
9070: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
9080: 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73  terp, z, 0);.  s
9090: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
90a0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
90b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
90c0: 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
90d0: 66 5f 69 6e 74 36 34 20 46 4f 52 4d 41 54 20 49  f_int64 FORMAT I
90e0: 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 20 49  NTEGER INTEGER I
90f0: 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 43 61 6c  NTEGER.**.** Cal
9100: 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74  l mprintf with t
9110: 68 72 65 65 20 36 34 2d 62 69 74 20 69 6e 74 65  hree 64-bit inte
9120: 67 65 72 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f  ger arguments.*/
9130: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
9140: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36  te3_mprintf_int6
9150: 34 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  4(.  void *NotUs
9160: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
9170: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
9180: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
9190: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
91a0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
91b0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
91c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
91d0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
91e0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
91f0: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
9200: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
9210: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ument */.){.  in
9220: 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 5f 69 6e  t i;.  sqlite_in
9230: 74 36 34 20 61 5b 33 5d 3b 0a 20 20 63 68 61 72  t64 a[3];.  char
9240: 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 21   *z;.  if( argc!
9250: 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =5 ){.    Tcl_Ap
9260: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
9270: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
9280: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
9290: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
92a0: 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e   " FORMAT INT IN
92b0: 54 20 49 4e 54 5c 22 22 2c 20 30 29 3b 0a 20 20  T INT\"", 0);.  
92c0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
92d0: 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  OR;.  }.  for(i=
92e0: 32 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20  2; i<5; i++){.  
92f0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 74 6f    if( sqlite3Ato
9300: 69 36 34 28 61 72 67 76 5b 69 5d 2c 20 26 61 5b  i64(argv[i], &a[
9310: 69 2d 32 5d 2c 20 31 30 30 30 30 30 30 2c 20 53  i-2], 1000000, S
9320: 51 4c 49 54 45 5f 55 54 46 38 29 20 29 7b 0a 20  QLITE_UTF8) ){. 
9330: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
9340: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 61  esult(interp, "a
9350: 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 61  rgument is not a
9360: 20 76 61 6c 69 64 20 36 34 2d 62 69 74 20 69 6e   valid 64-bit in
9370: 74 65 67 65 72 22 2c 20 30 29 3b 0a 20 20 20 20  teger", 0);.    
9380: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
9390: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OR;.    }.  }.  
93a0: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
93b0: 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30  ntf(argv[1], a[0
93c0: 5d 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a  ], a[1], a[2]);.
93d0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
93e0: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29  lt(interp, z, 0)
93f0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
9400: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  (z);.  return TC
9410: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
9420: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
9430: 70 72 69 6e 74 66 5f 6c 6f 6e 67 20 46 4f 52 4d  printf_long FORM
9440: 41 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47  AT INTEGER INTEG
9450: 45 52 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a  ER INTEGER.**.**
9460: 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69   Call mprintf wi
9470: 74 68 20 74 68 72 65 65 20 6c 6f 6e 67 20 69 6e  th three long in
9480: 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 2e  teger arguments.
9490: 20 20 20 54 68 69 73 20 6d 69 67 68 74 20 62 65     This might be
94a0: 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20   the.** same as 
94b0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
94c0: 69 6e 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 6d  int or sqlite3_m
94d0: 70 72 69 6e 74 66 5f 69 6e 74 36 34 2c 20 64 65  printf_int64, de
94e0: 70 65 6e 64 69 6e 67 20 6f 6e 0a 2a 2a 20 70 6c  pending on.** pl
94f0: 61 74 66 6f 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69  atform..*/.stati
9500: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70  c int sqlite3_mp
9510: 72 69 6e 74 66 5f 6c 6f 6e 67 28 0a 20 20 76 6f  rintf_long(.  vo
9520: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
9530: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
9540: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
9550: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
9560: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
9570: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
9580: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
9590: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
95a0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
95b0: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
95c0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
95d0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
95e0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
95f0: 6c 6f 6e 67 20 69 6e 74 20 61 5b 33 5d 3b 0a 20  long int a[3];. 
9600: 20 69 6e 74 20 62 5b 33 5d 3b 0a 20 20 63 68 61   int b[3];.  cha
9610: 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63  r *z;.  if( argc
9620: 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=5 ){.    Tcl_A
9630: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9640: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
9650: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
9660: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
9670: 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49    " FORMAT INT I
9680: 4e 54 20 49 4e 54 5c 22 22 2c 20 30 29 3b 0a 20  NT INT\"", 0);. 
9690: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
96a0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  ROR;.  }.  for(i
96b0: 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20  =2; i<5; i++){. 
96c0: 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
96d0: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69  t(interp, argv[i
96e0: 5d 2c 20 26 62 5b 69 2d 32 5d 29 20 29 20 72 65  ], &b[i-2]) ) re
96f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9700: 20 20 20 20 61 5b 69 2d 32 5d 20 3d 20 28 6c 6f      a[i-2] = (lo
9710: 6e 67 20 69 6e 74 29 62 5b 69 2d 32 5d 3b 0a 20  ng int)b[i-2];. 
9720: 20 20 20 61 5b 69 2d 32 5d 20 26 3d 20 28 28 28     a[i-2] &= (((
9730: 75 36 34 29 31 29 3c 3c 28 73 69 7a 65 6f 66 28  u64)1)<<(sizeof(
9740: 69 6e 74 29 2a 38 29 29 2d 31 3b 0a 20 20 7d 0a  int)*8))-1;.  }.
9750: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
9760: 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61  rintf(argv[1], a
9770: 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 29  [0], a[1], a[2])
9780: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
9790: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20  sult(interp, z, 
97a0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
97b0: 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(z);.  return 
97c0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
97d0: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
97e0: 5f 6d 70 72 69 6e 74 66 5f 73 74 72 20 46 4f 52  _mprintf_str FOR
97f0: 4d 41 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45  MAT INTEGER INTE
9800: 47 45 52 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a  GER STRING.**.**
9810: 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69   Call mprintf wi
9820: 74 68 20 74 77 6f 20 69 6e 74 65 67 65 72 20 61  th two integer a
9830: 72 67 75 6d 65 6e 74 73 20 61 6e 64 20 6f 6e 65  rguments and one
9840: 20 73 74 72 69 6e 67 20 61 72 67 75 6d 65 6e 74   string argument
9850: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
9860: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
9870: 74 72 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  tr(.  void *NotU
9880: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
9890: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
98a0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
98b0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
98c0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
98d0: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
98e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
98f0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
9900: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
9910: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
9920: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
9930: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  gument */.){.  i
9940: 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 63 68  nt a[3], i;.  ch
9950: 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67  ar *z;.  if( arg
9960: 63 3c 34 20 7c 7c 20 61 72 67 63 3e 35 20 29 7b  c<4 || argc>5 ){
9970: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
9980: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
9990: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
99a0: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
99b0: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f  [0],.       " FO
99c0: 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 3f 53 54  RMAT INT INT ?ST
99d0: 52 49 4e 47 3f 5c 22 22 2c 20 30 29 3b 0a 20 20  RING?\"", 0);.  
99e0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
99f0: 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  OR;.  }.  for(i=
9a00: 32 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20  2; i<4; i++){.  
9a10: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
9a20: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d  (interp, argv[i]
9a30: 2c 20 26 61 5b 69 2d 32 5d 29 20 29 20 72 65 74  , &a[i-2]) ) ret
9a40: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9a50: 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33   }.  z = sqlite3
9a60: 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d  _mprintf(argv[1]
9a70: 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 72  , a[0], a[1], ar
9a80: 67 63 3e 34 20 3f 20 61 72 67 76 5b 34 5d 20 3a  gc>4 ? argv[4] :
9a90: 20 4e 55 4c 4c 29 3b 0a 20 20 54 63 6c 5f 41 70   NULL);.  Tcl_Ap
9aa0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
9ab0: 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69  p, z, 0);.  sqli
9ac0: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72  te3_free(z);.  r
9ad0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
9ae0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
9af0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f  qlite3_snprintf_
9b00: 73 74 72 20 49 4e 54 45 47 45 52 20 46 4f 52 4d  str INTEGER FORM
9b10: 41 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47  AT INTEGER INTEG
9b20: 45 52 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20  ER STRING.**.** 
9b30: 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74  Call mprintf wit
9b40: 68 20 74 77 6f 20 69 6e 74 65 67 65 72 20 61 72  h two integer ar
9b50: 67 75 6d 65 6e 74 73 20 61 6e 64 20 6f 6e 65 20  guments and one 
9b60: 73 74 72 69 6e 67 20 61 72 67 75 6d 65 6e 74 0a  string argument.
9b70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
9b80: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73  lite3_snprintf_s
9b90: 74 72 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  tr(.  void *NotU
9ba0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
9bb0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
9bc0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
9bd0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
9be0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
9bf0: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
9c00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9c10: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
9c20: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
9c30: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
9c40: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
9c50: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  gument */.){.  i
9c60: 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 69 6e  nt a[3], i;.  in
9c70: 74 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  t n;.  char *z;.
9c80: 20 20 69 66 28 20 61 72 67 63 3c 35 20 7c 7c 20    if( argc<5 || 
9c90: 61 72 67 63 3e 36 20 29 7b 0a 20 20 20 20 54 63  argc>6 ){.    Tc
9ca0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
9cb0: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
9cc0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
9cd0: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
9ce0: 20 20 20 20 20 22 20 49 4e 54 20 46 4f 52 4d 41       " INT FORMA
9cf0: 54 20 49 4e 54 20 49 4e 54 20 3f 53 54 52 49 4e  T INT INT ?STRIN
9d00: 47 3f 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  G?\"", 0);.    r
9d10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9d20: 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
9d30: 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72  etInt(interp, ar
9d40: 67 76 5b 31 5d 2c 20 26 6e 29 20 29 20 72 65 74  gv[1], &n) ) ret
9d50: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9d60: 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20   if( n<0 ){.    
9d70: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
9d80: 28 69 6e 74 65 72 70 2c 20 22 4e 20 6d 75 73 74  (interp, "N must
9d90: 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   be non-negative
9da0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
9db0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
9dc0: 0a 20 20 66 6f 72 28 69 3d 33 3b 20 69 3c 35 3b  .  for(i=3; i<5;
9dd0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54   i++){.    if( T
9de0: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
9df0: 2c 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d  , argv[i], &a[i-
9e00: 33 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  3]) ) return TCL
9e10: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20  _ERROR;.  }.  z 
9e20: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
9e30: 28 20 6e 2b 31 20 29 3b 0a 20 20 73 71 6c 69 74  ( n+1 );.  sqlit
9e40: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a  e3_snprintf(n, z
9e50: 2c 20 61 72 67 76 5b 32 5d 2c 20 61 5b 30 5d 2c  , argv[2], a[0],
9e60: 20 61 5b 31 5d 2c 20 61 72 67 63 3e 34 20 3f 20   a[1], argc>4 ? 
9e70: 61 72 67 76 5b 35 5d 20 3a 20 4e 55 4c 4c 29 3b  argv[5] : NULL);
9e80: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
9e90: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30  ult(interp, z, 0
9ea0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
9eb0: 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  e(z);.  return T
9ec0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
9ed0: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
9ee0: 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 20 46  mprintf_double F
9ef0: 4f 52 4d 41 54 20 49 4e 54 45 47 45 52 20 49 4e  ORMAT INTEGER IN
9f00: 54 45 47 45 52 20 44 4f 55 42 4c 45 0a 2a 2a 0a  TEGER DOUBLE.**.
9f10: 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20  ** Call mprintf 
9f20: 77 69 74 68 20 74 77 6f 20 69 6e 74 65 67 65 72  with two integer
9f30: 20 61 72 67 75 6d 65 6e 74 73 20 61 6e 64 20 6f   arguments and o
9f40: 6e 65 20 64 6f 75 62 6c 65 20 61 72 67 75 6d 65  ne double argume
9f50: 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  nt.*/.static int
9f60: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
9f70: 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20  _double(.  void 
9f80: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
9f90: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
9fa0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
9fb0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
9fc0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
9fd0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
9fe0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
9ff0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
a000: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
a010: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
a020: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
a030: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
a040: 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69 3b  {.  int a[3], i;
a050: 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 63  .  double r;.  c
a060: 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72  har *z;.  if( ar
a070: 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=5 ){.    Tcl
a080: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
a090: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
a0a0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
a0b0: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
a0c0: 20 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54      " FORMAT INT
a0d0: 20 49 4e 54 20 44 4f 55 42 4c 45 5c 22 22 2c 20   INT DOUBLE\"", 
a0e0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
a0f0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
a100: 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b  for(i=2; i<4; i+
a110: 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f  +){.    if( Tcl_
a120: 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
a130: 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 29  rgv[i], &a[i-2])
a140: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
a150: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  ROR;.  }.  if( T
a160: 63 6c 5f 47 65 74 44 6f 75 62 6c 65 28 69 6e 74  cl_GetDouble(int
a170: 65 72 70 2c 20 61 72 67 76 5b 34 5d 2c 20 26 72  erp, argv[4], &r
a180: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
a190: 52 52 4f 52 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  RROR;.  z = sqli
a1a0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76  te3_mprintf(argv
a1b0: 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c  [1], a[0], a[1],
a1c0: 20 72 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e   r);.  Tcl_Appen
a1d0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
a1e0: 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  z, 0);.  sqlite3
a1f0: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75  _free(z);.  retu
a200: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
a210: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
a220: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c  te3_mprintf_scal
a230: 65 64 20 46 4f 52 4d 41 54 20 44 4f 55 42 4c 45  ed FORMAT DOUBLE
a240: 20 44 4f 55 42 4c 45 0a 2a 2a 0a 2a 2a 20 43 61   DOUBLE.**.** Ca
a250: 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20  ll mprintf with 
a260: 61 20 73 69 6e 67 6c 65 20 64 6f 75 62 6c 65 20  a single double 
a270: 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69  argument which i
a280: 73 20 74 68 65 20 70 72 6f 64 75 63 74 20 6f 66  s the product of
a290: 20 74 68 65 0a 2a 2a 20 74 77 6f 20 61 72 67 75   the.** two argu
a2a0: 6d 65 6e 74 73 20 67 69 76 65 6e 20 61 62 6f 76  ments given abov
a2b0: 65 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  e.  This is used
a2c0: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 6f 76 65   to generate ove
a2d0: 72 66 6c 6f 77 20 61 6e 64 20 75 6e 64 65 72 66  rflow and underf
a2e0: 6c 6f 77 0a 2a 2a 20 64 6f 75 62 6c 65 73 20 74  low.** doubles t
a2f0: 6f 20 74 65 73 74 20 74 68 61 74 20 74 68 65 79  o test that they
a300: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 70   are converted p
a310: 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 73 74 61 74  roperly..*/.stat
a320: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d  ic int sqlite3_m
a330: 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 28 0a 20  printf_scaled(. 
a340: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
a350: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
a360: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
a370: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
a380: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
a390: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
a3a0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
a3b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a3c0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
a3d0: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
a3e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
a3f0: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
a400: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  t */.){.  int i;
a410: 0a 20 20 64 6f 75 62 6c 65 20 72 5b 32 5d 3b 0a  .  double r[2];.
a420: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28    char *z;.  if(
a430: 20 61 72 67 63 21 3d 34 20 29 7b 0a 20 20 20 20   argc!=4 ){.    
a440: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
a450: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
a460: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
a470: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
a480: 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20         " FORMAT 
a490: 44 4f 55 42 4c 45 20 44 4f 55 42 4c 45 5c 22 22  DOUBLE DOUBLE\""
a4a0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
a4b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
a4c0: 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20    for(i=2; i<4; 
a4d0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63  i++){.    if( Tc
a4e0: 6c 5f 47 65 74 44 6f 75 62 6c 65 28 69 6e 74 65  l_GetDouble(inte
a4f0: 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 72 5b  rp, argv[i], &r[
a500: 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54  i-2]) ) return T
a510: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
a520: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
a530: 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 72 5b 30  ntf(argv[1], r[0
a540: 5d 2a 72 5b 31 5d 29 3b 0a 20 20 54 63 6c 5f 41  ]*r[1]);.  Tcl_A
a550: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
a560: 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c  rp, z, 0);.  sql
a570: 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
a580: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
a590: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
a5a0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
a5b0: 73 74 72 6f 6e 6c 79 20 46 4f 52 4d 41 54 20 53  stronly FORMAT S
a5c0: 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  TRING.**.** Call
a5d0: 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 61 20   mprintf with a 
a5e0: 73 69 6e 67 6c 65 20 64 6f 75 62 6c 65 20 61 72  single double ar
a5f0: 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20  gument which is 
a600: 74 68 65 20 70 72 6f 64 75 63 74 20 6f 66 20 74  the product of t
a610: 68 65 0a 2a 2a 20 74 77 6f 20 61 72 67 75 6d 65  he.** two argume
a620: 6e 74 73 20 67 69 76 65 6e 20 61 62 6f 76 65 2e  nts given above.
a630: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
a640: 6f 20 67 65 6e 65 72 61 74 65 20 6f 76 65 72 66  o generate overf
a650: 6c 6f 77 20 61 6e 64 20 75 6e 64 65 72 66 6c 6f  low and underflo
a660: 77 0a 2a 2a 20 64 6f 75 62 6c 65 73 20 74 6f 20  w.** doubles to 
a670: 74 65 73 74 20 74 68 61 74 20 74 68 65 79 20 61  test that they a
a680: 72 65 20 63 6f 6e 76 65 72 74 65 64 20 70 72 6f  re converted pro
a690: 70 65 72 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  perly..*/.static
a6a0: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72   int sqlite3_mpr
a6b0: 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 28 0a 20 20  intf_stronly(.  
a6c0: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
a6d0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
a6e0: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
a6f0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
a700: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
a710: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
a720: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
a730: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
a740: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
a750: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
a760: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
a770: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
a780: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
a790: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
a7a0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
a7b0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
a7c0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
a7d0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
a7e0: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
a7f0: 46 4f 52 4d 41 54 20 53 54 52 49 4e 47 5c 22 22  FORMAT STRING\""
a800: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
a810: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
a820: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
a830: 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61  rintf(argv[1], a
a840: 72 67 76 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41  rgv[2]);.  Tcl_A
a850: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
a860: 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c  rp, z, 0);.  sql
a870: 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
a880: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
a890: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
a8a0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
a8b0: 68 65 78 64 6f 75 62 6c 65 20 46 4f 52 4d 41 54  hexdouble FORMAT
a8c0: 20 48 45 58 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20   HEX.**.** Call 
a8d0: 6d 70 72 69 6e 74 66 20 77 69 74 68 20 61 20 73  mprintf with a s
a8e0: 69 6e 67 6c 65 20 64 6f 75 62 6c 65 20 61 72 67  ingle double arg
a8f0: 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 64  ument which is d
a900: 65 72 69 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  erived from the.
a910: 2a 2a 20 68 65 78 61 64 65 63 69 6d 61 6c 20 65  ** hexadecimal e
a920: 6e 63 6f 64 69 6e 67 20 6f 66 20 61 6e 20 49 45  ncoding of an IE
a930: 45 45 20 64 6f 75 62 6c 65 2e 0a 2a 2f 0a 73 74  EE double..*/.st
a940: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
a950: 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f 75 62  _mprintf_hexdoub
a960: 6c 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  le(.  void *NotU
a970: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
a980: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
a990: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
a9a0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
a9b0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
a9c0: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
a9d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
a9e0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
a9f0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
aa00: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
aa10: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
aa20: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63  gument */.){.  c
aa30: 68 61 72 20 2a 7a 3b 0a 20 20 64 6f 75 62 6c 65  har *z;.  double
aa40: 20 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69   r;.  unsigned i
aa50: 6e 74 20 78 31 2c 20 78 32 3b 0a 20 20 73 71 6c  nt x1, x2;.  sql
aa60: 69 74 65 5f 75 69 6e 74 36 34 20 64 3b 0a 20 20  ite_uint64 d;.  
aa70: 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
aa80: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
aa90: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
aaa0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
aab0: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
aac0: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d  ],.       " FORM
aad0: 41 54 20 53 54 52 49 4e 47 5c 22 22 2c 20 30 29  AT STRING\"", 0)
aae0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
aaf0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
ab00: 28 20 73 73 63 61 6e 66 28 61 72 67 76 5b 32 5d  ( sscanf(argv[2]
ab10: 2c 20 22 25 30 38 78 25 30 38 78 22 2c 20 26 78  , "%08x%08x", &x
ab20: 32 2c 20 26 78 31 29 21 3d 32 20 29 7b 0a 20 20  2, &x1)!=2 ){.  
ab30: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
ab40: 6c 74 28 69 6e 74 65 72 70 2c 20 22 32 6e 64 20  lt(interp, "2nd 
ab50: 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20  argument should 
ab60: 62 65 20 31 36 2d 63 68 61 72 61 63 74 65 72 73  be 16-characters
ab70: 20 6f 66 20 68 65 78 22 2c 20 30 29 3b 0a 20 20   of hex", 0);.  
ab80: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
ab90: 4f 52 3b 0a 20 20 7d 0a 20 20 64 20 3d 20 78 32  OR;.  }.  d = x2
aba0: 3b 0a 20 20 64 20 3d 20 28 64 3c 3c 33 32 29 20  ;.  d = (d<<32) 
abb0: 2b 20 78 31 3b 0a 20 20 6d 65 6d 63 70 79 28 26  + x1;.  memcpy(&
abc0: 72 2c 20 26 64 2c 20 73 69 7a 65 6f 66 28 72 29  r, &d, sizeof(r)
abd0: 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  );.  z = sqlite3
abe0: 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d  _mprintf(argv[1]
abf0: 2c 20 72 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  , r);.  Tcl_Appe
ac00: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
ac10: 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   z, 0);.  sqlite
ac20: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74  3_free(z);.  ret
ac30: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
ac40: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
ac50: 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65  te3_enable_share
ac60: 64 5f 63 61 63 68 65 20 3f 42 4f 4f 4c 45 41 4e  d_cache ?BOOLEAN
ac70: 3f 0a 2a 2a 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ?.**.*/.#if !def
ac80: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
ac90: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 0a 73  _SHARED_CACHE).s
aca0: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65  tatic int test_e
acb0: 6e 61 62 6c 65 5f 73 68 61 72 65 64 28 0a 20 20  nable_shared(.  
acc0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
acd0: 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
ace0: 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
acf0: 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
ad00: 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
ad10: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
ad20: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
ad30: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
ad40: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
ad50: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
ad60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
ad70: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
ad80: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
ad90: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
ada0: 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
adb0: 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  s */.){.  int rc
adc0: 3b 0a 20 20 69 6e 74 20 65 6e 61 62 6c 65 3b 0a  ;.  int enable;.
add0: 20 20 69 6e 74 20 72 65 74 20 3d 20 30 3b 0a 0a    int ret = 0;..
ade0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26    if( objc!=2 &&
adf0: 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20   objc!=1 ){.    
ae00: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
ae10: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
ae20: 2c 20 22 3f 42 4f 4f 4c 45 41 4e 3f 22 29 3b 0a  , "?BOOLEAN?");.
ae30: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
ae40: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 20  RROR;.  }.  ret 
ae50: 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
ae60: 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63 68  onfig.sharedCach
ae70: 65 45 6e 61 62 6c 65 64 3b 0a 0a 20 20 69 66 28  eEnabled;..  if(
ae80: 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
ae90: 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  if( Tcl_GetBoole
aea0: 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
aeb0: 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 65 6e 61 62  , objv[1], &enab
aec0: 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  le) ){.      ret
aed0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
aee0: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
aef0: 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61  lite3_enable_sha
af00: 72 65 64 5f 63 61 63 68 65 28 65 6e 61 62 6c 65  red_cache(enable
af10: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
af20: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
af30: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
af40: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
af50: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63  sqlite3ErrStr(rc
af60: 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
af70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
af80: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
af90: 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  }.  Tcl_SetObjRe
afa0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
afb0: 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72  _NewBooleanObj(r
afc0: 65 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  et));.  return T
afd0: 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  CL_OK;.}.#endif.
afe0: 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  .../*.** Usage: 
aff0: 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
b000: 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 20 20 20  _result_codes   
b010: 44 42 20 20 20 20 42 4f 4f 4c 45 41 4e 0a 2a 2a  DB    BOOLEAN.**
b020: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
b030: 65 73 74 5f 65 78 74 65 6e 64 65 64 5f 72 65 73  est_extended_res
b040: 75 6c 74 5f 63 6f 64 65 73 28 0a 20 20 43 6c 69  ult_codes(.  Cli
b050: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
b060: 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
b070: 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
b080: 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
b090: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
b0a0: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
b0b0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
b0c0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
b0d0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
b0e0: 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
b0f0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
b100: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
b110: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
b120: 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
b130: 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
b140: 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 6e 61 62 6c  /.){.  int enabl
b150: 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e;.  sqlite3 *db
b160: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
b170: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
b180: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
b190: 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 42 4f   1, objv, "DB BO
b1a0: 4f 4c 45 41 4e 22 29 3b 0a 20 20 20 20 72 65 74  OLEAN");.    ret
b1b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b1c0: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
b1d0: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
b1e0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
b1f0: 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
b200: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b210: 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c   if( Tcl_GetBool
b220: 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
b230: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 65 6e 61  p, objv[2], &ena
b240: 62 6c 65 29 20 29 20 72 65 74 75 72 6e 20 54 43  ble) ) return TC
b250: 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74  L_ERROR;.  sqlit
b260: 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75  e3_extended_resu
b270: 6c 74 5f 63 6f 64 65 73 28 64 62 2c 20 65 6e 61  lt_codes(db, ena
b280: 62 6c 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ble);.  return T
b290: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
b2a0: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6c  Usage: sqlite3_l
b2b0: 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72  ibversion_number
b2c0: 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
b2d0: 74 20 74 65 73 74 5f 6c 69 62 76 65 72 73 69 6f  t test_libversio
b2e0: 6e 5f 6e 75 6d 62 65 72 28 0a 20 20 43 6c 69 65  n_number(.  Clie
b2f0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
b300: 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
b310: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
b320: 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
b330: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
b340: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
b350: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
b360: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
b370: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
b380: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
b390: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
b3a0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
b3b0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
b3c0: 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
b3d0: 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
b3e0: 0a 29 7b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  .){.  Tcl_SetObj
b3f0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
b400: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c  cl_NewIntObj(sql
b410: 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f  ite3_libversion_
b420: 6e 75 6d 62 65 72 28 29 29 29 3b 0a 20 20 72 65  number()));.  re
b430: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
b440: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
b450: 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  ite3_table_colum
b460: 6e 5f 6d 65 74 61 64 61 74 61 20 44 42 20 64 62  n_metadata DB db
b470: 6e 61 6d 65 20 74 62 6c 6e 61 6d 65 20 63 6f 6c  name tblname col
b480: 6e 61 6d 65 0a 2a 2a 0a 2a 2f 0a 23 69 66 64 65  name.**.*/.#ifde
b490: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
b4a0: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
b4b0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
b4c0: 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
b4d0: 61 64 61 74 61 28 0a 20 20 43 6c 69 65 6e 74 44  adata(.  ClientD
b4e0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
b4f0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
b500: 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
b510: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
b520: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
b530: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
b540: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
b550: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
b560: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
b570: 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
b580: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
b590: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
b5a0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
b5b0: 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
b5c0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
b5d0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
b5e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
b5f0: 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
b600: 2a 7a 54 62 6c 3b 0a 20 20 63 6f 6e 73 74 20 63  *zTbl;.  const c
b610: 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 69 6e 74  har *zCol;.  int
b620: 20 72 63 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a   rc;.  Tcl_Obj *
b630: 70 52 65 74 3b 0a 0a 20 20 63 6f 6e 73 74 20 63  pRet;..  const c
b640: 68 61 72 20 2a 7a 44 61 74 61 74 79 70 65 3b 0a  har *zDatatype;.
b650: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
b660: 6f 6c 6c 73 65 71 3b 0a 20 20 69 6e 74 20 6e 6f  ollseq;.  int no
b670: 74 6e 75 6c 6c 3b 0a 20 20 69 6e 74 20 70 72 69  tnull;.  int pri
b680: 6d 61 72 79 6b 65 79 3b 0a 20 20 69 6e 74 20 61  marykey;.  int a
b690: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 0a 20  utoincrement;.. 
b6a0: 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a   if( objc!=5 ){.
b6b0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
b6c0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
b6d0: 6f 62 6a 76 2c 20 22 44 42 20 64 62 6e 61 6d 65  objv, "DB dbname
b6e0: 20 74 62 6c 6e 61 6d 65 20 63 6f 6c 6e 61 6d 65   tblname colname
b6f0: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
b700: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
b710: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
b720: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
b730: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
b740: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
b750: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 44 62 20  CL_ERROR;.  zDb 
b760: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
b770: 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7a 54 62 6c  objv[2]);.  zTbl
b780: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
b790: 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 7a 43 6f  (objv[3]);.  zCo
b7a0: 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  l = Tcl_GetStrin
b7b0: 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 0a 20 20 69  g(objv[4]);..  i
b7c0: 66 28 20 73 74 72 6c 65 6e 28 7a 44 62 29 3d 3d  f( strlen(zDb)==
b7d0: 30 20 29 20 7a 44 62 20 3d 20 30 3b 0a 0a 20 20  0 ) zDb = 0;..  
b7e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61 62  rc = sqlite3_tab
b7f0: 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61  le_column_metada
b800: 74 61 28 64 62 2c 20 7a 44 62 2c 20 7a 54 62 6c  ta(db, zDb, zTbl
b810: 2c 20 7a 43 6f 6c 2c 20 0a 20 20 20 20 20 20 26  , zCol, .      &
b820: 7a 44 61 74 61 74 79 70 65 2c 20 26 7a 43 6f 6c  zDatatype, &zCol
b830: 6c 73 65 71 2c 20 26 6e 6f 74 6e 75 6c 6c 2c 20  lseq, &notnull, 
b840: 26 70 72 69 6d 61 72 79 6b 65 79 2c 20 26 61 75  &primarykey, &au
b850: 74 6f 69 6e 63 72 65 6d 65 6e 74 29 3b 0a 0a 20  toincrement);.. 
b860: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
b870: 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  OK ){.    Tcl_Ap
b880: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
b890: 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  p, sqlite3_errms
b8a0: 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 72  g(db), 0);.    r
b8b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b8c0: 0a 20 20 7d 0a 0a 20 20 70 52 65 74 20 3d 20 54  .  }..  pRet = T
b8d0: 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 54  cl_NewObj();.  T
b8e0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
b8f0: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c  Element(0, pRet,
b900: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
b910: 6a 28 7a 44 61 74 61 74 79 70 65 2c 20 2d 31 29  j(zDatatype, -1)
b920: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
b930: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
b940: 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74   pRet, Tcl_NewSt
b950: 72 69 6e 67 4f 62 6a 28 7a 43 6f 6c 6c 73 65 71  ringObj(zCollseq
b960: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
b970: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
b980: 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f  nt(0, pRet, Tcl_
b990: 4e 65 77 49 6e 74 4f 62 6a 28 6e 6f 74 6e 75 6c  NewIntObj(notnul
b9a0: 6c 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  l));.  Tcl_ListO
b9b0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
b9c0: 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  0, pRet, Tcl_New
b9d0: 49 6e 74 4f 62 6a 28 70 72 69 6d 61 72 79 6b 65  IntObj(primaryke
b9e0: 79 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  y));.  Tcl_ListO
b9f0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
ba00: 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  0, pRet, Tcl_New
ba10: 49 6e 74 4f 62 6a 28 61 75 74 6f 69 6e 63 72 65  IntObj(autoincre
ba20: 6d 65 6e 74 29 29 3b 0a 20 20 54 63 6c 5f 53 65  ment));.  Tcl_Se
ba30: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
ba40: 70 2c 20 70 52 65 74 29 3b 0a 0a 20 20 72 65 74  p, pRet);..  ret
ba50: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
ba60: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
ba70: 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
ba80: 4f 42 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 62  OB..static int b
ba90: 6c 6f 62 48 61 6e 64 6c 65 46 72 6f 6d 4f 62 6a  lobHandleFromObj
baa0: 28 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  (.  Tcl_Interp *
bab0: 69 6e 74 65 72 70 2c 20 0a 20 20 54 63 6c 5f 4f  interp, .  Tcl_O
bac0: 62 6a 20 2a 70 4f 62 6a 2c 0a 20 20 73 71 6c 69  bj *pObj,.  sqli
bad0: 74 65 33 5f 62 6c 6f 62 20 2a 2a 70 70 42 6c 6f  te3_blob **ppBlo
bae0: 62 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  b.){.  char *z;.
baf0: 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 7a 20 3d 20    int n;..  z = 
bb00: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
bb10: 6d 4f 62 6a 28 70 4f 62 6a 2c 20 26 6e 29 3b 0a  mObj(pObj, &n);.
bb20: 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20    if( n==0 ){.  
bb30: 20 20 2a 70 70 42 6c 6f 62 20 3d 20 30 3b 0a 20    *ppBlob = 0;. 
bb40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
bb50: 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 54 63 6c  notUsed;.    Tcl
bb60: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 6e 65 6c  _Channel channel
bb70: 3b 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61  ;.    ClientData
bb80: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20   instanceData;. 
bb90: 20 20 20 0a 20 20 20 20 63 68 61 6e 6e 65 6c 20     .    channel 
bba0: 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  = Tcl_GetChannel
bbb0: 28 69 6e 74 65 72 70 2c 20 7a 2c 20 26 6e 6f 74  (interp, z, &not
bbc0: 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 21  Used);.    if( !
bbd0: 63 68 61 6e 6e 65 6c 20 29 20 72 65 74 75 72 6e  channel ) return
bbe0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 20   TCL_ERROR;..   
bbf0: 20 54 63 6c 5f 46 6c 75 73 68 28 63 68 61 6e 6e   Tcl_Flush(chann
bc00: 65 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 65  el);.    Tcl_See
bc10: 6b 28 63 68 61 6e 6e 65 6c 2c 20 30 2c 20 53 45  k(channel, 0, SE
bc20: 45 4b 5f 53 45 54 29 3b 0a 0a 20 20 20 20 69 6e  EK_SET);..    in
bc30: 73 74 61 6e 63 65 44 61 74 61 20 3d 20 54 63 6c  stanceData = Tcl
bc40: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61  _GetChannelInsta
bc50: 6e 63 65 44 61 74 61 28 63 68 61 6e 6e 65 6c 29  nceData(channel)
bc60: 3b 0a 20 20 20 20 2a 70 70 42 6c 6f 62 20 3d 20  ;.    *ppBlob = 
bc70: 2a 28 28 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20  *((sqlite3_blob 
bc80: 2a 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 29  **)instanceData)
bc90: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
bca0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
bcb0: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79   sqlite3_blob_by
bcc0: 74 65 73 20 20 43 48 41 4e 4e 45 4c 0a 2a 2f 0a  tes  CHANNEL.*/.
bcd0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
bce0: 62 6c 6f 62 5f 62 79 74 65 73 28 0a 20 20 43 6c  blob_bytes(.  Cl
bcf0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
bd00: 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64  ata, /* Not used
bd10: 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
bd20: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
bd30: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
bd40: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
bd50: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
bd60: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
bd70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
bd80: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
bd90: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
bda0: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
bdb0: 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
bdc0: 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
bdd0: 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20  3_blob *pBlob;. 
bde0: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 0a 20   int nByte;.  . 
bdf0: 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
be00: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
be10: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
be20: 6f 62 6a 76 2c 20 22 43 48 41 4e 4e 45 4c 22 29  objv, "CHANNEL")
be30: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
be40: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
be50: 66 28 20 62 6c 6f 62 48 61 6e 64 6c 65 46 72 6f  f( blobHandleFro
be60: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
be70: 76 5b 31 5d 2c 20 26 70 42 6c 6f 62 29 20 29 20  v[1], &pBlob) ) 
be80: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
be90: 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 71 6c 69  ;.  nByte = sqli
bea0: 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70  te3_blob_bytes(p
beb0: 42 6c 6f 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74  Blob);.  Tcl_Set
bec0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
bed0: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
bee0: 6e 42 79 74 65 29 29 3b 0a 0a 20 20 72 65 74 75  nByte));..  retu
bef0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
bf00: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  .** sqlite3_blob
bf10: 5f 63 6c 6f 73 65 20 20 43 48 41 4e 4e 45 4c 0a  _close  CHANNEL.
bf20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
bf30: 73 74 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 0a 20  st_blob_close(. 
bf40: 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
bf50: 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75  ntData, /* Not u
bf60: 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  sed */.  Tcl_Int
bf70: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
bf80: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
bf90: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
bfa0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
bfb0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
bfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bfd0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
bfe0: 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
bff0: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
c000: 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
c010: 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
c020: 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62  ite3_blob *pBlob
c030: 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21  ;.  .  if( objc!
c040: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
c050: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
c060: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 43 48 41  p, 1, objv, "CHA
c070: 4e 4e 45 4c 22 29 3b 0a 20 20 20 20 72 65 74 75  NNEL");.    retu
c080: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
c090: 7d 0a 0a 20 20 69 66 28 20 62 6c 6f 62 48 61 6e  }..  if( blobHan
c0a0: 64 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  dleFromObj(inter
c0b0: 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 70 42 6c  p, objv[1], &pBl
c0c0: 6f 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ob) ) return TCL
c0d0: 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65  _ERROR;.  sqlite
c0e0: 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 42 6c  3_blob_close(pBl
c0f0: 6f 62 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54  ob);..  return T
c100: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
c110: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61  sqlite3_blob_rea
c120: 64 20 20 43 48 41 4e 4e 45 4c 20 4f 46 46 53 45  d  CHANNEL OFFSE
c130: 54 20 4e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73  T N.**.**   This
c140: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64   command is used
c150: 20 74 6f 20 74 65 73 74 20 74 68 65 20 73 71 6c   to test the sql
c160: 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 29  ite3_blob_read()
c170: 20 69 6e 20 77 61 79 73 20 74 68 61 74 0a 2a 2a   in ways that.**
c180: 20 20 20 74 68 65 20 54 63 6c 20 63 68 61 6e 6e     the Tcl chann
c190: 65 6c 20 69 6e 74 65 72 66 61 63 65 20 64 6f 65  el interface doe
c1a0: 73 20 6e 6f 74 2e 20 54 68 65 20 66 69 72 73 74  s not. The first
c1b0: 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64   argument should
c1c0: 0a 2a 2a 20 20 20 62 65 20 74 68 65 20 6e 61 6d  .**   be the nam
c1d0: 65 20 6f 66 20 61 20 76 61 6c 69 64 20 63 68 61  e of a valid cha
c1e0: 6e 6e 65 6c 20 63 72 65 61 74 65 64 20 62 79 20  nnel created by 
c1f0: 74 68 65 20 5b 69 6e 63 72 62 6c 6f 62 5d 20 6d  the [incrblob] m
c200: 65 74 68 6f 64 0a 2a 2a 20 20 20 6f 66 20 61 20  ethod.**   of a 
c210: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  database handle.
c220: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
c230: 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f 62 6c 6f  alls sqlite3_blo
c240: 62 5f 72 65 61 64 28 29 0a 2a 2a 20 20 20 74 6f  b_read().**   to
c250: 20 72 65 61 64 20 4e 20 62 79 74 65 73 20 66 72   read N bytes fr
c260: 6f 6d 20 6f 66 66 73 65 74 20 4f 46 46 53 45 54  om offset OFFSET
c270: 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c   from the underl
c280: 79 69 6e 67 20 53 51 4c 69 74 65 0a 2a 2a 20 20  ying SQLite.**  
c290: 20 62 6c 6f 62 20 68 61 6e 64 6c 65 2e 0a 2a 2a   blob handle..**
c2a0: 0a 2a 2a 20 20 20 4f 6e 20 73 75 63 63 65 73 73  .**   On success
c2b0: 2c 20 61 20 62 79 74 65 2d 61 72 72 61 79 20 6f  , a byte-array o
c2c0: 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 69 6e 67  bject containing
c2d0: 20 74 68 65 20 72 65 61 64 20 64 61 74 61 20 69   the read data i
c2e0: 73 20 0a 2a 2a 20 20 20 72 65 74 75 72 6e 65 64  s .**   returned
c2f0: 2e 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 74 68  . On failure, th
c300: 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 72 65  e interpreter re
c310: 73 75 6c 74 20 69 73 20 73 65 74 20 74 6f 20 74  sult is set to t
c320: 68 65 0a 2a 2a 20 20 20 74 65 78 74 20 72 65 70  he.**   text rep
c330: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
c340: 68 65 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f  he returned erro
c350: 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 22 53 51  r code (i.e. "SQ
c360: 4c 49 54 45 5f 4e 4f 4d 45 4d 22 29 0a 2a 2a 20  LITE_NOMEM").** 
c370: 20 20 61 6e 64 20 61 20 54 63 6c 20 65 78 63 65    and a Tcl exce
c380: 70 74 69 6f 6e 20 69 73 20 74 68 72 6f 77 6e 2e  ption is thrown.
c390: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
c3a0: 65 73 74 5f 62 6c 6f 62 5f 72 65 61 64 28 0a 20  est_blob_read(. 
c3b0: 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
c3c0: 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75  ntData, /* Not u
c3d0: 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  sed */.  Tcl_Int
c3e0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
c3f0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
c400: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
c410: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
c420: 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
c430: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c440: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
c450: 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
c460: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
c470: 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
c480: 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
c490: 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62  ite3_blob *pBlob
c4a0: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
c4b0: 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20   int iOffset;.  
c4c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
c4d0: 42 75 66 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Buf = 0;.  int r
c4e0: 63 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63  c;.  .  if( objc
c4f0: 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=4 ){.    Tcl_W
c500: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
c510: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 43 48  rp, 1, objv, "CH
c520: 41 4e 4e 45 4c 20 4f 46 46 53 45 54 20 4e 22 29  ANNEL OFFSET N")
c530: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
c540: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
c550: 66 28 20 62 6c 6f 62 48 61 6e 64 6c 65 46 72 6f  f( blobHandleFro
c560: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
c570: 76 5b 31 5d 2c 20 26 70 42 6c 6f 62 29 20 29 20  v[1], &pBlob) ) 
c580: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
c590: 3b 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d  ;.  if( TCL_OK!=
c5a0: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
c5b0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
c5c0: 5d 2c 20 26 69 4f 66 66 73 65 74 29 0a 20 20 20  ], &iOffset).   
c5d0: 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47  || TCL_OK!=Tcl_G
c5e0: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
c5f0: 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e  erp, objv[3], &n
c600: 42 79 74 65 29 0a 20 20 29 7b 20 0a 20 20 20 20  Byte).  ){ .    
c610: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
c620: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 42 79  ;.  }..  if( nBy
c630: 74 65 3e 30 20 29 7b 0a 20 20 20 20 7a 42 75 66  te>0 ){.    zBuf
c640: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
c650: 72 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 6e 42  r *)Tcl_Alloc(nB
c660: 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  yte);.  }.  rc =
c670: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65   sqlite3_blob_re
c680: 61 64 28 70 42 6c 6f 62 2c 20 7a 42 75 66 2c 20  ad(pBlob, zBuf, 
c690: 6e 42 79 74 65 2c 20 69 4f 66 66 73 65 74 29 3b  nByte, iOffset);
c6a0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
c6b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
c6c0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
c6d0: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65  erp, Tcl_NewByte
c6e0: 41 72 72 61 79 4f 62 6a 28 7a 42 75 66 2c 20 6e  ArrayObj(zBuf, n
c6f0: 42 79 74 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  Byte));.  }else{
c700: 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
c710: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
c720: 20 2a 29 73 71 6c 69 74 65 33 54 65 73 74 45 72   *)sqlite3TestEr
c730: 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c  rorName(rc), TCL
c740: 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 7d 0a  _VOLATILE);.  }.
c750: 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
c760: 20 2a 29 7a 42 75 66 29 3b 0a 0a 20 20 72 65 74   *)zBuf);..  ret
c770: 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
c780: 4f 4b 20 3f 20 54 43 4c 5f 4f 4b 20 3a 20 54 43  OK ? TCL_OK : TC
c790: 4c 5f 45 52 52 4f 52 29 3b 0a 7d 0a 0a 2f 2a 0a  L_ERROR);.}../*.
c7a0: 2a 2a 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f  ** sqlite3_blob_
c7b0: 77 72 69 74 65 20 43 48 41 4e 4e 45 4c 20 4f 46  write CHANNEL OF
c7c0: 46 53 45 54 20 44 41 54 41 20 3f 4e 44 41 54 41  FSET DATA ?NDATA
c7d0: 3f 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 63  ?.**.**   This c
c7e0: 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74  ommand is used t
c7f0: 6f 20 74 65 73 74 20 74 68 65 20 73 71 6c 69 74  o test the sqlit
c800: 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28 29 20  e3_blob_write() 
c810: 69 6e 20 77 61 79 73 20 74 68 61 74 0a 2a 2a 20  in ways that.** 
c820: 20 20 74 68 65 20 54 63 6c 20 63 68 61 6e 6e 65    the Tcl channe
c830: 6c 20 69 6e 74 65 72 66 61 63 65 20 64 6f 65 73  l interface does
c840: 20 6e 6f 74 2e 20 54 68 65 20 66 69 72 73 74 20   not. The first 
c850: 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 0a  argument should.
c860: 2a 2a 20 20 20 62 65 20 74 68 65 20 6e 61 6d 65  **   be the name
c870: 20 6f 66 20 61 20 76 61 6c 69 64 20 63 68 61 6e   of a valid chan
c880: 6e 65 6c 20 63 72 65 61 74 65 64 20 62 79 20 74  nel created by t
c890: 68 65 20 5b 69 6e 63 72 62 6c 6f 62 5d 20 6d 65  he [incrblob] me
c8a0: 74 68 6f 64 0a 2a 2a 20 20 20 6f 66 20 61 20 64  thod.**   of a d
c8b0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20  atabase handle. 
c8c0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  This function ca
c8d0: 6c 6c 73 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  lls sqlite3_blob
c8e0: 5f 77 72 69 74 65 28 29 0a 2a 2a 20 20 20 74 6f  _write().**   to
c8f0: 20 77 72 69 74 65 20 74 68 65 20 44 41 54 41 20   write the DATA 
c900: 62 79 74 65 2d 61 72 72 61 79 20 74 6f 20 74 68  byte-array to th
c910: 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 53 51 4c  e underlying SQL
c920: 69 74 65 20 62 6c 6f 62 20 68 61 6e 64 6c 65 2e  ite blob handle.
c930: 0a 2a 2a 20 20 20 61 74 20 6f 66 66 73 65 74 20  .**   at offset 
c940: 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 20  OFFSET..**.**   
c950: 4f 6e 20 73 75 63 63 65 73 73 2c 20 61 6e 20 65  On success, an e
c960: 6d 70 74 79 20 73 74 72 69 6e 67 20 69 73 20 72  mpty string is r
c970: 65 74 75 72 6e 65 64 2e 20 4f 6e 20 66 61 69 6c  eturned. On fail
c980: 75 72 65 2c 20 74 68 65 20 69 6e 74 65 72 70 72  ure, the interpr
c990: 65 74 65 72 0a 2a 2a 20 20 20 72 65 73 75 6c 74  eter.**   result
c9a0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 74   is set to the t
c9b0: 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ext representati
c9c0: 6f 6e 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e  on of the return
c9d0: 65 64 20 65 72 72 6f 72 20 63 6f 64 65 20 0a 2a  ed error code .*
c9e0: 2a 20 20 20 28 69 2e 65 2e 20 22 53 51 4c 49 54  *   (i.e. "SQLIT
c9f0: 45 5f 4e 4f 4d 45 4d 22 29 20 61 6e 64 20 61 20  E_NOMEM") and a 
ca00: 54 63 6c 20 65 78 63 65 70 74 69 6f 6e 20 69 73  Tcl exception is
ca10: 20 74 68 72 6f 77 6e 2e 0a 2a 2f 0a 73 74 61 74   thrown..*/.stat
ca20: 69 63 20 69 6e 74 20 74 65 73 74 5f 62 6c 6f 62  ic int test_blob
ca30: 5f 77 72 69 74 65 28 0a 20 20 43 6c 69 65 6e 74  _write(.  Client
ca40: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
ca50: 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a   /* Not used */.
ca60: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
ca70: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
ca80: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
ca90: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
caa0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
cab0: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
cac0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
cad0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
cae0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
caf0: 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
cb00: 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
cb10: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c  .){.  sqlite3_bl
cb20: 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74  ob *pBlob;.  int
cb30: 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20   iOffset;.  int 
cb40: 72 63 3b 0a 0a 20 20 75 6e 73 69 67 6e 65 64 20  rc;..  unsigned 
cb50: 63 68 61 72 20 2a 7a 42 75 66 3b 0a 20 20 69 6e  char *zBuf;.  in
cb60: 74 20 6e 42 75 66 3b 0a 20 20 0a 20 20 69 66 28  t nBuf;.  .  if(
cb70: 20 6f 62 6a 63 21 3d 34 20 26 26 20 6f 62 6a 63   objc!=4 && objc
cb80: 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=5 ){.    Tcl_W
cb90: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
cba0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 43 48  rp, 1, objv, "CH
cbb0: 41 4e 4e 45 4c 20 4f 46 46 53 45 54 20 44 41 54  ANNEL OFFSET DAT
cbc0: 41 20 3f 4e 44 41 54 41 3f 22 29 3b 0a 20 20 20  A ?NDATA?");.   
cbd0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
cbe0: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 6c  R;.  }..  if( bl
cbf0: 6f 62 48 61 6e 64 6c 65 46 72 6f 6d 4f 62 6a 28  obHandleFromObj(
cc00: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
cc10: 20 26 70 42 6c 6f 62 29 20 29 20 72 65 74 75 72   &pBlob) ) retur
cc20: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
cc30: 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47  f( TCL_OK!=Tcl_G
cc40: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
cc50: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69  erp, objv[2], &i
cc60: 4f 66 66 73 65 74 29 20 29 7b 20 0a 20 20 20 20  Offset) ){ .    
cc70: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
cc80: 3b 0a 20 20 7d 0a 0a 20 20 7a 42 75 66 20 3d 20  ;.  }..  zBuf = 
cc90: 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
cca0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
ccb0: 20 26 6e 42 75 66 29 3b 0a 20 20 69 66 28 20 6f   &nBuf);.  if( o
ccc0: 62 6a 63 3d 3d 35 20 26 26 20 54 63 6c 5f 47 65  bjc==5 && Tcl_Ge
ccd0: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
cce0: 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 6e 42  rp, objv[4], &nB
ccf0: 75 66 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  uf) ){.    retur
cd00: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
cd10: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
cd20: 62 6c 6f 62 5f 77 72 69 74 65 28 70 42 6c 6f 62  blob_write(pBlob
cd30: 2c 20 7a 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f  , zBuf, nBuf, iO
cd40: 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63  ffset);.  if( rc
cd50: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
cd60: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
cd70: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
cd80: 29 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 6f  )sqlite3TestErro
cd90: 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 56  rName(rc), TCL_V
cda0: 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 7d 0a 0a 20  OLATILE);.  }.. 
cdb0: 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
cdc0: 49 54 45 5f 4f 4b 20 3f 20 54 43 4c 5f 4f 4b 20  ITE_OK ? TCL_OK 
cdd0: 3a 20 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 7d 0a  : TCL_ERROR);.}.
cde0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
cdf0: 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 0a 20 20  _blob_reopen(.  
ce00: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
ce10: 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73  tData, /* Not us
ce20: 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
ce30: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
ce40: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
ce50: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
ce60: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
ce70: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
ce80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
ce90: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
cea0: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
ceb0: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
cec0: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
ced0: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f  nts */.){.  Tcl_
cee0: 57 69 64 65 49 6e 74 20 69 52 6f 77 69 64 3b 0a  WideInt iRowid;.
cef0: 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a    sqlite3_blob *
cf00: 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 72 63 3b  pBlob;.  int rc;
cf10: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
cf20: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
cf30: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
cf40: 31 2c 20 6f 62 6a 76 2c 20 22 43 48 41 4e 4e 45  1, objv, "CHANNE
cf50: 4c 20 52 4f 57 49 44 22 29 3b 0a 20 20 20 20 72  L ROWID");.    r
cf60: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
cf70: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 6c 6f 62  .  }..  if( blob
cf80: 48 61 6e 64 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e  HandleFromObj(in
cf90: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26  terp, objv[1], &
cfa0: 70 42 6c 6f 62 29 20 29 20 72 65 74 75 72 6e 20  pBlob) ) return 
cfb0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
cfc0: 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46   Tcl_GetWideIntF
cfd0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
cfe0: 62 6a 76 5b 32 5d 2c 20 26 69 52 6f 77 69 64 29  bjv[2], &iRowid)
cff0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
d000: 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
d010: 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e  ite3_blob_reopen
d020: 28 70 42 6c 6f 62 2c 20 69 52 6f 77 69 64 29 3b  (pBlob, iRowid);
d030: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
d040: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
d050: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
d060: 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
d070: 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65 28 72  3TestErrorName(r
d080: 63 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  c), TCL_VOLATILE
d090: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
d0a0: 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   (rc==SQLITE_OK 
d0b0: 3f 20 54 43 4c 5f 4f 4b 20 3a 20 54 43 4c 5f 45  ? TCL_OK : TCL_E
d0c0: 52 52 4f 52 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66  RROR);.}..#endif
d0d0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
d0e0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
d0f0: 6c 6c 61 74 69 6f 6e 5f 76 32 20 44 42 2d 48 41  llation_v2 DB-HA
d100: 4e 44 4c 45 20 4e 41 4d 45 20 43 4d 50 2d 50 52  NDLE NAME CMP-PR
d110: 4f 43 20 44 45 4c 2d 50 52 4f 43 0a 2a 2a 0a 2a  OC DEL-PROC.**.*
d120: 2a 20 20 20 54 68 69 73 20 54 63 6c 20 70 72 6f  *   This Tcl pro
d130: 63 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  c is used for te
d140: 73 74 69 6e 67 20 74 68 65 20 65 78 70 65 72 69  sting the experi
d150: 6d 65 6e 74 61 6c 0a 2a 2a 20 20 20 73 71 6c 69  mental.**   sqli
d160: 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
d170: 74 69 6f 6e 5f 76 32 28 29 20 69 6e 74 65 72 66  tion_v2() interf
d180: 61 63 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 54  ace..*/.struct T
d190: 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 7b 0a  estCollationX {.
d1a0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
d1b0: 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  terp;.  Tcl_Obj 
d1c0: 2a 70 43 6d 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a  *pCmp;.  Tcl_Obj
d1d0: 20 2a 70 44 65 6c 3b 0a 7d 3b 0a 74 79 70 65 64   *pDel;.};.typed
d1e0: 65 66 20 73 74 72 75 63 74 20 54 65 73 74 43 6f  ef struct TestCo
d1f0: 6c 6c 61 74 69 6f 6e 58 20 54 65 73 74 43 6f 6c  llationX TestCol
d200: 6c 61 74 69 6f 6e 58 3b 0a 73 74 61 74 69 63 20  lationX;.static 
d210: 76 6f 69 64 20 74 65 73 74 43 72 65 61 74 65 43  void testCreateC
d220: 6f 6c 6c 61 74 69 6f 6e 44 65 6c 28 76 6f 69 64  ollationDel(void
d230: 20 2a 70 43 74 78 29 7b 0a 20 20 54 65 73 74 43   *pCtx){.  TestC
d240: 6f 6c 6c 61 74 69 6f 6e 58 20 2a 70 20 3d 20 28  ollationX *p = (
d250: 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a  TestCollationX *
d260: 29 70 43 74 78 3b 0a 0a 20 20 69 6e 74 20 72 63  )pCtx;..  int rc
d270: 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78   = Tcl_EvalObjEx
d280: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 70  (p->interp, p->p
d290: 44 65 6c 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49  Del, TCL_EVAL_DI
d2a0: 52 45 43 54 7c 54 43 4c 5f 45 56 41 4c 5f 47 4c  RECT|TCL_EVAL_GL
d2b0: 4f 42 41 4c 29 3b 0a 20 20 69 66 28 20 72 63 21  OBAL);.  if( rc!
d2c0: 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  =TCL_OK ){.    T
d2d0: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72  cl_BackgroundErr
d2e0: 6f 72 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20  or(p->interp);. 
d2f0: 20 7d 0a 0a 20 20 54 63 6c 5f 44 65 63 72 52 65   }..  Tcl_DecrRe
d300: 66 43 6f 75 6e 74 28 70 2d 3e 70 43 6d 70 29 3b  fCount(p->pCmp);
d310: 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
d320: 75 6e 74 28 70 2d 3e 70 44 65 6c 29 3b 0a 20 20  unt(p->pDel);.  
d330: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 28 76 6f  sqlite3_free((vo
d340: 69 64 20 2a 29 70 29 3b 0a 7d 0a 73 74 61 74 69  id *)p);.}.stati
d350: 63 20 69 6e 74 20 74 65 73 74 43 72 65 61 74 65  c int testCreate
d360: 43 6f 6c 6c 61 74 69 6f 6e 43 6d 70 28 0a 20 20  CollationCmp(.  
d370: 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69 6e  void *pCtx,.  in
d380: 74 20 6e 4c 65 66 74 2c 0a 20 20 63 6f 6e 73 74  t nLeft,.  const
d390: 20 76 6f 69 64 20 2a 7a 4c 65 66 74 2c 0a 20 20   void *zLeft,.  
d3a0: 69 6e 74 20 6e 52 69 67 68 74 2c 0a 20 20 63 6f  int nRight,.  co
d3b0: 6e 73 74 20 76 6f 69 64 20 2a 7a 52 69 67 68 74  nst void *zRight
d3c0: 0a 29 7b 0a 20 20 54 65 73 74 43 6f 6c 6c 61 74  .){.  TestCollat
d3d0: 69 6f 6e 58 20 2a 70 20 3d 20 28 54 65 73 74 43  ionX *p = (TestC
d3e0: 6f 6c 6c 61 74 69 6f 6e 58 20 2a 29 70 43 74 78  ollationX *)pCtx
d3f0: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63  ;.  Tcl_Obj *pSc
d400: 72 69 70 74 20 3d 20 54 63 6c 5f 44 75 70 6c 69  ript = Tcl_Dupli
d410: 63 61 74 65 4f 62 6a 28 70 2d 3e 70 43 6d 70 29  cateObj(p->pCmp)
d420: 3b 0a 20 20 69 6e 74 20 69 52 65 73 20 3d 20 30  ;.  int iRes = 0
d430: 3b 0a 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  ;..  Tcl_IncrRef
d440: 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a  Count(pScript);.
d450: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
d460: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53  endElement(0, pS
d470: 63 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74  cript, Tcl_NewSt
d480: 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29  ringObj((char *)
d490: 7a 4c 65 66 74 2c 20 6e 4c 65 66 74 29 29 3b 0a  zLeft, nLeft));.
d4a0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
d4b0: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53  endElement(0, pS
d4c0: 63 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74  cript, Tcl_NewSt
d4d0: 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29  ringObj((char *)
d4e0: 7a 52 69 67 68 74 2c 6e 52 69 67 68 74 29 29 3b  zRight,nRight));
d4f0: 0a 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d  ..  if( TCL_OK!=
d500: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d  Tcl_EvalObjEx(p-
d510: 3e 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74  >interp, pScript
d520: 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43  , TCL_EVAL_DIREC
d530: 54 7c 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41  T|TCL_EVAL_GLOBA
d540: 4c 29 0a 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b 21  L).   || TCL_OK!
d550: 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f  =Tcl_GetIntFromO
d560: 62 6a 28 70 2d 3e 69 6e 74 65 72 70 2c 20 54 63  bj(p->interp, Tc
d570: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 70  l_GetObjResult(p
d580: 2d 3e 69 6e 74 65 72 70 29 2c 20 26 69 52 65 73  ->interp), &iRes
d590: 29 0a 20 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42  ).  ){.    Tcl_B
d5a0: 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 70  ackgroundError(p
d5b0: 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 20  ->interp);.  }. 
d5c0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
d5d0: 74 28 70 53 63 72 69 70 74 29 3b 0a 0a 20 20 72  t(pScript);..  r
d5e0: 65 74 75 72 6e 20 69 52 65 73 3b 0a 7d 0a 73 74  eturn iRes;.}.st
d5f0: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 72  atic int test_cr
d600: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76  eate_collation_v
d610: 32 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  2(.  ClientData 
d620: 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e  clientData, /* N
d630: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c  ot used */.  Tcl
d640: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
d650: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
d660: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
d670: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
d680: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
d690: 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
d6a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
d6b0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
d6c0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
d6d0: 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
d6e0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
d6f0: 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20   TestCollationX 
d700: 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *p;.  sqlite3 *d
d710: 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  b;.  int rc;..  
d720: 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20  if( objc!=5 ){. 
d730: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
d740: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
d750: 62 6a 76 2c 20 22 44 42 2d 48 41 4e 44 4c 45 20  bjv, "DB-HANDLE 
d760: 4e 41 4d 45 20 43 4d 50 2d 50 52 4f 43 20 44 45  NAME CMP-PROC DE
d770: 4c 2d 50 52 4f 43 22 29 3b 0a 20 20 20 20 72 65  L-PROC");.    re
d780: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d790: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
d7a0: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
d7b0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
d7c0: 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
d7d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d7e0: 0a 20 20 70 20 3d 20 28 54 65 73 74 43 6f 6c 6c  .  p = (TestColl
d7f0: 61 74 69 6f 6e 58 20 2a 29 73 71 6c 69 74 65 33  ationX *)sqlite3
d800: 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54  _malloc(sizeof(T
d810: 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 29 29 3b  estCollationX));
d820: 0a 20 20 70 2d 3e 70 43 6d 70 20 3d 20 6f 62 6a  .  p->pCmp = obj
d830: 76 5b 33 5d 3b 0a 20 20 70 2d 3e 70 44 65 6c 20  v[3];.  p->pDel 
d840: 3d 20 6f 62 6a 76 5b 34 5d 3b 0a 20 20 70 2d 3e  = objv[4];.  p->
d850: 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
d860: 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
d870: 75 6e 74 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20  unt(p->pCmp);.  
d880: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
d890: 28 70 2d 3e 70 44 65 6c 29 3b 0a 0a 20 20 72 63  (p->pDel);..  rc
d8a0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
d8b0: 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64  e_collation_v2(d
d8c0: 62 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  b, Tcl_GetString
d8d0: 28 6f 62 6a 76 5b 32 5d 29 2c 20 31 36 2c 20 0a  (objv[2]), 16, .
d8e0: 20 20 20 20 20 20 28 76 6f 69 64 20 2a 29 70 2c        (void *)p,
d8f0: 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61   testCreateColla
d900: 74 69 6f 6e 43 6d 70 2c 20 74 65 73 74 43 72 65  tionCmp, testCre
d910: 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c 0a  ateCollationDel.
d920: 20 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53    );.  if( rc!=S
d930: 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 29 7b 0a  QLITE_MISUSE ){.
d940: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
d950: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 71  sult(interp, "sq
d960: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
d970: 6c 61 74 65 5f 76 32 28 29 20 66 61 69 6c 65 64  late_v2() failed
d980: 20 74 6f 20 64 65 74 65 63 74 20 22 0a 20 20 20   to detect ".   
d990: 20 20 20 22 61 6e 20 69 6e 76 61 6c 69 64 20 65     "an invalid e
d9a0: 6e 63 6f 64 69 6e 67 22 2c 20 28 63 68 61 72 2a  ncoding", (char*
d9b0: 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )0);.    return 
d9c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
d9d0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
d9e0: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76  eate_collation_v
d9f0: 32 28 64 62 2c 20 54 63 6c 5f 47 65 74 53 74 72  2(db, Tcl_GetStr
da00: 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 53 51  ing(objv[2]), SQ
da10: 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20  LITE_UTF8, .    
da20: 20 20 28 76 6f 69 64 20 2a 29 70 2c 20 74 65 73    (void *)p, tes
da30: 74 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e  tCreateCollation
da40: 43 6d 70 2c 20 74 65 73 74 43 72 65 61 74 65 43  Cmp, testCreateC
da50: 6f 6c 6c 61 74 69 6f 6e 44 65 6c 0a 20 20 29 3b  ollationDel.  );
da60: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
da70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 53 41 47 45  ;.}../*.** USAGE
da80: 3a 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  : sqlite3_create
da90: 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 44 42 20  _function_v2 DB 
daa0: 4e 41 4d 45 20 4e 41 52 47 20 45 4e 43 20 3f 53  NAME NARG ENC ?S
dab0: 57 49 54 43 48 45 53 3f 0a 2a 2a 0a 2a 2a 20 41  WITCHES?.**.** A
dac0: 76 61 69 6c 61 62 6c 65 20 73 77 69 74 63 68 65  vailable switche
dad0: 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2d  s are:.**.**   -
dae0: 66 75 6e 63 20 20 20 20 53 43 52 49 50 54 0a 2a  func    SCRIPT.*
daf0: 2a 20 20 20 2d 73 74 65 70 20 20 20 20 53 43 52  *   -step    SCR
db00: 49 50 54 0a 2a 2a 20 20 20 2d 66 69 6e 61 6c 20  IPT.**   -final 
db10: 20 20 53 43 52 49 50 54 0a 2a 2a 20 20 20 2d 64    SCRIPT.**   -d
db20: 65 73 74 72 6f 79 20 53 43 52 49 50 54 0a 2a 2f  estroy SCRIPT.*/
db30: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
db40: 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32  CreateFunctionV2
db50: 20 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56   CreateFunctionV
db60: 32 3b 0a 73 74 72 75 63 74 20 43 72 65 61 74 65  2;.struct Create
db70: 46 75 6e 63 74 69 6f 6e 56 32 20 7b 0a 20 20 54  FunctionV2 {.  T
db80: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
db90: 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 46  p;.  Tcl_Obj *pF
dba0: 75 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  unc;            
dbb0: 20 20 20 20 20 2f 2a 20 53 63 72 69 70 74 20 66       /* Script f
dbc0: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f  or function invo
dbd0: 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  cation */.  Tcl_
dbe0: 4f 62 6a 20 2a 70 53 74 65 70 3b 20 20 20 20 20  Obj *pStep;     
dbf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
dc00: 63 72 69 70 74 20 66 6f 72 20 61 67 67 2e 20 73  cript for agg. s
dc10: 74 65 70 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a  tep invocation *
dc20: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 46 69  /.  Tcl_Obj *pFi
dc30: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
dc40: 20 20 20 20 2f 2a 20 53 63 72 69 70 74 20 66 6f      /* Script fo
dc50: 72 20 61 67 67 2e 20 66 69 6e 61 6c 69 7a 61 74  r agg. finalizat
dc60: 69 6f 6e 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a  ion invocation *
dc70: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 44 65  /.  Tcl_Obj *pDe
dc80: 73 74 72 6f 79 3b 20 20 20 20 20 20 20 20 20 20  stroy;          
dc90: 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74 6f      /* Destructo
dca0: 72 20 73 63 72 69 70 74 20 2a 2f 0a 7d 3b 0a 73  r script */.};.s
dcb0: 74 61 74 69 63 20 76 6f 69 64 20 63 66 32 46 75  tatic void cf2Fu
dcc0: 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  nc(sqlite3_conte
dcd0: 78 74 20 2a 63 74 78 2c 20 69 6e 74 20 6e 41 72  xt *ctx, int nAr
dce0: 67 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  g, sqlite3_value
dcf0: 20 2a 2a 61 41 72 67 29 7b 0a 7d 0a 73 74 61 74   **aArg){.}.stat
dd00: 69 63 20 76 6f 69 64 20 63 66 32 53 74 65 70 28  ic void cf2Step(
dd10: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
dd20: 2a 63 74 78 2c 20 69 6e 74 20 6e 41 72 67 2c 20  *ctx, int nArg, 
dd30: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
dd40: 61 41 72 67 29 7b 0a 7d 0a 73 74 61 74 69 63 20  aArg){.}.static 
dd50: 76 6f 69 64 20 63 66 32 46 69 6e 61 6c 28 73 71  void cf2Final(sq
dd60: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
dd70: 74 78 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  tx){.}.static vo
dd80: 69 64 20 63 66 32 44 65 73 74 72 6f 79 28 76 6f  id cf2Destroy(vo
dd90: 69 64 20 2a 70 55 73 65 72 29 7b 0a 20 20 43 72  id *pUser){.  Cr
dda0: 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 20 2a  eateFunctionV2 *
ddb0: 70 20 3d 20 28 43 72 65 61 74 65 46 75 6e 63 74  p = (CreateFunct
ddc0: 69 6f 6e 56 32 20 2a 29 70 55 73 65 72 3b 0a 0a  ionV2 *)pUser;..
ddd0: 20 20 69 66 28 20 70 2d 3e 69 6e 74 65 72 70 20    if( p->interp 
dde0: 26 26 20 70 2d 3e 70 44 65 73 74 72 6f 79 20 29  && p->pDestroy )
ddf0: 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 54  {.    int rc = T
de00: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e  cl_EvalObjEx(p->
de10: 69 6e 74 65 72 70 2c 20 70 2d 3e 70 44 65 73 74  interp, p->pDest
de20: 72 6f 79 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  roy, 0);.    if(
de30: 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 54 63   rc!=TCL_OK ) Tc
de40: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f  l_BackgroundErro
de50: 72 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20  r(p->interp);.  
de60: 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 70 46 75 6e  }..  if( p->pFun
de70: 63 20 29 20 54 63 6c 5f 44 65 63 72 52 65 66 43  c ) Tcl_DecrRefC
de80: 6f 75 6e 74 28 70 2d 3e 70 46 75 6e 63 29 3b 20  ount(p->pFunc); 
de90: 0a 20 20 69 66 28 20 70 2d 3e 70 53 74 65 70 20  .  if( p->pStep 
dea0: 29 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75  ) Tcl_DecrRefCou
deb0: 6e 74 28 70 2d 3e 70 53 74 65 70 29 3b 20 0a 20  nt(p->pStep); . 
dec0: 20 69 66 28 20 70 2d 3e 70 46 69 6e 61 6c 20 29   if( p->pFinal )
ded0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
dee0: 74 28 70 2d 3e 70 46 69 6e 61 6c 29 3b 20 0a 20  t(p->pFinal); . 
def0: 20 69 66 28 20 70 2d 3e 70 44 65 73 74 72 6f 79   if( p->pDestroy
df00: 20 29 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f   ) Tcl_DecrRefCo
df10: 75 6e 74 28 70 2d 3e 70 44 65 73 74 72 6f 79 29  unt(p->pDestroy)
df20: 3b 20 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ; .  sqlite3_fre
df30: 65 28 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69  e(p);.}.static i
df40: 6e 74 20 74 65 73 74 5f 63 72 65 61 74 65 5f 66  nt test_create_f
df50: 75 6e 63 74 69 6f 6e 5f 76 32 28 0a 20 20 43 6c  unction_v2(.  Cl
df60: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
df70: 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ata,          /*
df80: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54   Not used */.  T
df90: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
dfa0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
dfb0: 2a 20 54 68 65 20 69 6e 76 6f 6b 69 6e 67 20 54  * The invoking T
dfc0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a  CL interpreter *
dfd0: 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dff0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
e000: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
e010: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
e020: 62 6a 76 5b 5d 20 20 20 20 20 20 20 20 20 20 20  bjv[]           
e030: 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
e040: 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
e050: 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
e060: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 3b 0a 20  t char *zFunc;. 
e070: 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 69 6e 74   int nArg;.  int
e080: 20 65 6e 63 3b 0a 20 20 43 72 65 61 74 65 46 75   enc;.  CreateFu
e090: 6e 63 74 69 6f 6e 56 32 20 2a 70 3b 0a 20 20 69  nctionV2 *p;.  i
e0a0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  nt i;.  int rc;.
e0b0: 0a 20 20 73 74 72 75 63 74 20 45 6e 63 54 61 62  .  struct EncTab
e0c0: 6c 65 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  le {.    const c
e0d0: 68 61 72 20 2a 7a 45 6e 63 3b 0a 20 20 20 20 69  har *zEnc;.    i
e0e0: 6e 74 20 65 6e 63 3b 0a 20 20 7d 20 61 45 6e 63  nt enc;.  } aEnc
e0f0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 22 75 74 66  [] = {.    {"utf
e100: 38 22 2c 20 20 20 20 53 51 4c 49 54 45 5f 55 54  8",    SQLITE_UT
e110: 46 38 20 7d 2c 0a 20 20 20 20 7b 22 75 74 66 31  F8 },.    {"utf1
e120: 36 22 2c 20 20 20 53 51 4c 49 54 45 5f 55 54 46  6",   SQLITE_UTF
e130: 31 36 20 7d 2c 0a 20 20 20 20 7b 22 75 74 66 31  16 },.    {"utf1
e140: 36 6c 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  6le", SQLITE_UTF
e150: 31 36 4c 45 20 7d 2c 0a 20 20 20 20 7b 22 75 74  16LE },.    {"ut
e160: 66 31 36 62 65 22 2c 20 53 51 4c 49 54 45 5f 55  f16be", SQLITE_U
e170: 54 46 31 36 42 45 20 7d 2c 0a 20 20 20 20 7b 22  TF16BE },.    {"
e180: 61 6e 79 22 2c 20 20 20 20 20 53 51 4c 49 54 45  any",     SQLITE
e190: 5f 41 4e 59 20 7d 2c 0a 20 20 20 20 7b 22 30 22  _ANY },.    {"0"
e1a0: 2c 20 30 20 7d 0a 20 20 7d 3b 0a 0a 20 20 69 66  , 0 }.  };..  if
e1b0: 28 20 6f 62 6a 63 3c 35 20 7c 7c 20 28 6f 62 6a  ( objc<5 || (obj
e1c0: 63 25 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 54  c%2)==0 ){.    T
e1d0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
e1e0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
e1f0: 20 22 44 42 20 4e 41 4d 45 20 4e 41 52 47 20 45   "DB NAME NARG E
e200: 4e 43 20 53 57 49 54 43 48 45 53 2e 2e 2e 22 29  NC SWITCHES...")
e210: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
e220: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
e230: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
e240: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
e250: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
e260: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
e270: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 46 75 6e 63  L_ERROR;.  zFunc
e280: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
e290: 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28  (objv[2]);.  if(
e2a0: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
e2b0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
e2c0: 33 5d 2c 20 26 6e 41 72 67 29 20 29 20 72 65 74  3], &nArg) ) ret
e2d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
e2e0: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65   if( Tcl_GetInde
e2f0: 78 46 72 6f 6d 4f 62 6a 53 74 72 75 63 74 28 69  xFromObjStruct(i
e300: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
e310: 61 45 6e 63 2c 20 73 69 7a 65 6f 66 28 61 45 6e  aEnc, sizeof(aEn
e320: 63 5b 30 5d 29 2c 20 0a 20 20 20 20 20 20 20 20  c[0]), .        
e330: 20 20 22 65 6e 63 6f 64 69 6e 67 22 2c 20 30 2c    "encoding", 0,
e340: 20 26 65 6e 63 29 0a 20 20 29 7b 0a 20 20 20 20   &enc).  ){.    
e350: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
e360: 3b 0a 20 20 7d 0a 20 20 65 6e 63 20 3d 20 61 45  ;.  }.  enc = aE
e370: 6e 63 5b 65 6e 63 5d 2e 65 6e 63 3b 0a 0a 20 20  nc[enc].enc;..  
e380: 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  p = sqlite3_mall
e390: 6f 63 28 73 69 7a 65 6f 66 28 43 72 65 61 74 65  oc(sizeof(Create
e3a0: 46 75 6e 63 74 69 6f 6e 56 32 29 29 3b 0a 20 20  FunctionV2));.  
e3b0: 61 73 73 65 72 74 28 20 70 20 29 3b 0a 20 20 6d  assert( p );.  m
e3c0: 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
e3d0: 6f 66 28 43 72 65 61 74 65 46 75 6e 63 74 69 6f  of(CreateFunctio
e3e0: 6e 56 32 29 29 3b 0a 20 20 70 2d 3e 69 6e 74 65  nV2));.  p->inte
e3f0: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 0a 20 20  rp = interp;..  
e400: 66 6f 72 28 69 3d 35 3b 20 69 3c 6f 62 6a 63 3b  for(i=5; i<objc;
e410: 20 69 2b 3d 32 29 7b 0a 20 20 20 20 69 6e 74 20   i+=2){.    int 
e420: 69 53 77 69 74 63 68 3b 0a 20 20 20 20 63 6f 6e  iSwitch;.    con
e430: 73 74 20 63 68 61 72 20 2a 61 7a 53 77 69 74 63  st char *azSwitc
e440: 68 5b 5d 20 3d 20 7b 22 2d 66 75 6e 63 22 2c 20  h[] = {"-func", 
e450: 22 2d 73 74 65 70 22 2c 20 22 2d 66 69 6e 61 6c  "-step", "-final
e460: 22 2c 20 22 2d 64 65 73 74 72 6f 79 22 2c 20 30  ", "-destroy", 0
e470: 7d 3b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  };.    if( Tcl_G
e480: 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69  etIndexFromObj(i
e490: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 5d 2c 20  nterp, objv[i], 
e4a0: 61 7a 53 77 69 74 63 68 2c 20 22 73 77 69 74 63  azSwitch, "switc
e4b0: 68 22 2c 20 30 2c 20 26 69 53 77 69 74 63 68 29  h", 0, &iSwitch)
e4c0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
e4d0: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
e4e0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
e4f0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77  R;.    }..    sw
e500: 69 74 63 68 28 20 69 53 77 69 74 63 68 20 29 7b  itch( iSwitch ){
e510: 0a 20 20 20 20 20 20 63 61 73 65 20 30 3a 20 70  .      case 0: p
e520: 2d 3e 70 46 75 6e 63 20 3d 20 6f 62 6a 76 5b 69  ->pFunc = objv[i
e530: 2b 31 5d 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  +1];      break;
e540: 0a 20 20 20 20 20 20 63 61 73 65 20 31 3a 20 70  .      case 1: p
e550: 2d 3e 70 53 74 65 70 20 3d 20 6f 62 6a 76 5b 69  ->pStep = objv[i
e560: 2b 31 5d 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  +1];      break;
e570: 0a 20 20 20 20 20 20 63 61 73 65 20 32 3a 20 70  .      case 2: p
e580: 2d 3e 70 46 69 6e 61 6c 20 3d 20 6f 62 6a 76 5b  ->pFinal = objv[
e590: 69 2b 31 5d 3b 20 20 20 20 20 62 72 65 61 6b 3b  i+1];     break;
e5a0: 0a 20 20 20 20 20 20 63 61 73 65 20 33 3a 20 70  .      case 3: p
e5b0: 2d 3e 70 44 65 73 74 72 6f 79 20 3d 20 6f 62 6a  ->pDestroy = obj
e5c0: 76 5b 69 2b 31 5d 3b 20 20 20 62 72 65 61 6b 3b  v[i+1];   break;
e5d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
e5e0: 20 70 2d 3e 70 46 75 6e 63 20 29 20 70 2d 3e 70   p->pFunc ) p->p
e5f0: 46 75 6e 63 20 3d 20 54 63 6c 5f 44 75 70 6c 69  Func = Tcl_Dupli
e600: 63 61 74 65 4f 62 6a 28 70 2d 3e 70 46 75 6e 63  cateObj(p->pFunc
e610: 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 53 74  ); .  if( p->pSt
e620: 65 70 20 29 20 70 2d 3e 70 53 74 65 70 20 3d 20  ep ) p->pStep = 
e630: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
e640: 28 70 2d 3e 70 53 74 65 70 29 3b 20 0a 20 20 69  (p->pStep); .  i
e650: 66 28 20 70 2d 3e 70 46 69 6e 61 6c 20 29 20 70  f( p->pFinal ) p
e660: 2d 3e 70 46 69 6e 61 6c 20 3d 20 54 63 6c 5f 44  ->pFinal = Tcl_D
e670: 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70  uplicateObj(p->p
e680: 46 69 6e 61 6c 29 3b 20 0a 20 20 69 66 28 20 70  Final); .  if( p
e690: 2d 3e 70 44 65 73 74 72 6f 79 20 29 20 70 2d 3e  ->pDestroy ) p->
e6a0: 70 44 65 73 74 72 6f 79 20 3d 20 54 63 6c 5f 44  pDestroy = Tcl_D
e6b0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70  uplicateObj(p->p
e6c0: 44 65 73 74 72 6f 79 29 3b 20 0a 0a 20 20 69 66  Destroy); ..  if
e6d0: 28 20 70 2d 3e 70 46 75 6e 63 20 29 20 54 63 6c  ( p->pFunc ) Tcl
e6e0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 2d  _IncrRefCount(p-
e6f0: 3e 70 46 75 6e 63 29 3b 20 0a 20 20 69 66 28 20  >pFunc); .  if( 
e700: 70 2d 3e 70 53 74 65 70 20 29 20 54 63 6c 5f 49  p->pStep ) Tcl_I
e710: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70  ncrRefCount(p->p
e720: 53 74 65 70 29 3b 20 0a 20 20 69 66 28 20 70 2d  Step); .  if( p-
e730: 3e 70 46 69 6e 61 6c 20 29 20 54 63 6c 5f 49 6e  >pFinal ) Tcl_In
e740: 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 46  crRefCount(p->pF
e750: 69 6e 61 6c 29 3b 20 0a 20 20 69 66 28 20 70 2d  inal); .  if( p-
e760: 3e 70 44 65 73 74 72 6f 79 20 29 20 54 63 6c 5f  >pDestroy ) Tcl_
e770: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e  IncrRefCount(p->
e780: 70 44 65 73 74 72 6f 79 29 3b 20 0a 0a 20 20 72  pDestroy); ..  r
e790: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
e7a0: 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64  te_function_v2(d
e7b0: 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20  b, zFunc, nArg, 
e7c0: 65 6e 63 2c 20 28 76 6f 69 64 20 2a 29 70 2c 20  enc, (void *)p, 
e7d0: 0a 20 20 20 20 20 20 28 70 2d 3e 70 46 75 6e 63  .      (p->pFunc
e7e0: 20 3f 20 63 66 32 46 75 6e 63 20 3a 20 30 29 2c   ? cf2Func : 0),
e7f0: 0a 20 20 20 20 20 20 28 70 2d 3e 70 53 74 65 70  .      (p->pStep
e800: 20 3f 20 63 66 32 53 74 65 70 20 3a 20 30 29 2c   ? cf2Step : 0),
e810: 0a 20 20 20 20 20 20 28 70 2d 3e 70 46 69 6e 61  .      (p->pFina
e820: 6c 20 3f 20 63 66 32 46 69 6e 61 6c 20 3a 20 30  l ? cf2Final : 0
e830: 29 2c 0a 20 20 20 20 20 20 63 66 32 44 65 73 74  ),.      cf2Dest
e840: 72 6f 79 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  roy.  );.  if( r
e850: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
e860: 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73      Tcl_ResetRes
e870: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
e880: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
e890: 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65  t(interp, sqlite
e8a0: 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65 28 72  3TestErrorName(r
e8b0: 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  c), 0);.    retu
e8c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
e8d0: 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
e8e0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
e8f0: 65 3a 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f  e: sqlite3_load_
e900: 65 78 74 65 6e 73 69 6f 6e 20 44 42 2d 48 41 4e  extension DB-HAN
e910: 44 4c 45 20 46 49 4c 45 20 3f 50 52 4f 43 3f 0a  DLE FILE ?PROC?.
e920: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
e930: 73 74 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  st_load_extensio
e940: 6e 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  n(.  ClientData 
e950: 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e  clientData, /* N
e960: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c  ot used */.  Tcl
e970: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
e980: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
e990: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
e9a0: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
e9b0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
e9c0: 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
e9d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
e9e0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
e9f0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
ea00: 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
ea10: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
ea20: 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64   Tcl_CmdInfo cmd
ea30: 49 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20  Info;.  sqlite3 
ea40: 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *db;.  int rc;. 
ea50: 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 63 68   char *zDb;.  ch
ea60: 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63 68 61  ar *zFile;.  cha
ea70: 72 20 2a 7a 50 72 6f 63 20 3d 20 30 3b 0a 20 20  r *zProc = 0;.  
ea80: 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a  char *zErr = 0;.
ea90: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 26  .  if( objc!=4 &
eaa0: 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  & objc!=3 ){.   
eab0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
eac0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
ead0: 76 2c 20 22 44 42 2d 48 41 4e 44 4c 45 20 46 49  v, "DB-HANDLE FI
eae0: 4c 45 20 3f 50 52 4f 43 3f 22 29 3b 0a 20 20 20  LE ?PROC?");.   
eaf0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
eb00: 52 3b 0a 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54  R;.  }.  zDb = T
eb10: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
eb20: 76 5b 31 5d 29 3b 0a 20 20 7a 46 69 6c 65 20 3d  v[1]);.  zFile =
eb30: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
eb40: 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 6f  bjv[2]);.  if( o
eb50: 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 7a 50  bjc==4 ){.    zP
eb60: 72 6f 63 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  roc = Tcl_GetStr
eb70: 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20  ing(objv[3]);.  
eb80: 7d 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63 74 20  }..  /* Extract 
eb90: 74 68 65 20 43 20 64 61 74 61 62 61 73 65 20 68  the C database h
eba0: 61 6e 64 6c 65 20 66 72 6f 6d 20 74 68 65 20 54  andle from the T
ebb0: 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20  cl command name 
ebc0: 2a 2f 0a 20 20 69 66 28 20 21 54 63 6c 5f 47 65  */.  if( !Tcl_Ge
ebd0: 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74  tCommandInfo(int
ebe0: 65 72 70 2c 20 7a 44 62 2c 20 26 63 6d 64 49 6e  erp, zDb, &cmdIn
ebf0: 66 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  fo) ){.    Tcl_A
ec00: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
ec10: 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74  rp, "command not
ec20: 20 66 6f 75 6e 64 3a 20 22 2c 20 7a 44 62 2c 20   found: ", zDb, 
ec30: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72  (char*)0);.    r
ec40: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ec50: 0a 20 20 7d 0a 20 20 64 62 20 3d 20 28 28 73 74  .  }.  db = ((st
ec60: 72 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29 63  ruct SqliteDb*)c
ec70: 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74  mdInfo.objClient
ec80: 44 61 74 61 29 2d 3e 64 62 3b 0a 20 20 61 73 73  Data)->db;.  ass
ec90: 65 72 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 43  ert(db);..  /* C
eca0: 61 6c 6c 20 74 68 65 20 75 6e 64 65 72 6c 79 69  all the underlyi
ecb0: 6e 67 20 43 20 66 75 6e 63 74 69 6f 6e 2e 20 49  ng C function. I
ecc0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
ecd0: 73 2c 20 73 65 74 20 72 63 20 74 6f 20 0a 20 20  s, set rc to .  
ece0: 2a 2a 20 54 43 4c 5f 45 52 52 4f 52 20 61 6e 64  ** TCL_ERROR and
ecf0: 20 6c 6f 61 64 20 61 6e 79 20 65 72 72 6f 72 20   load any error 
ed00: 73 74 72 69 6e 67 20 69 6e 74 6f 20 74 68 65 20  string into the 
ed10: 69 6e 74 65 72 70 72 65 74 65 72 2e 20 49 66 20  interpreter. If 
ed20: 6e 6f 20 0a 20 20 2a 2a 20 65 72 72 6f 72 20 6f  no .  ** error o
ed30: 63 63 75 72 73 2c 20 73 65 74 20 72 63 20 74 6f  ccurs, set rc to
ed40: 20 54 43 4c 5f 4f 4b 2e 0a 20 20 2a 2f 0a 23 69   TCL_OK..  */.#i
ed50: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
ed60: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
ed70: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
ed80: 52 4f 52 3b 0a 20 20 7a 45 72 72 20 3d 20 73 71  ROR;.  zErr = sq
ed90: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 74  lite3_mprintf("t
eda0: 68 69 73 20 62 75 69 6c 64 20 6f 6d 69 74 73 20  his build omits 
edb0: 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74  sqlite3_load_ext
edc0: 65 6e 73 69 6f 6e 28 29 22 29 3b 0a 23 65 6c 73  ension()");.#els
edd0: 65 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  e.  rc = sqlite3
ede0: 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28  _load_extension(
edf0: 64 62 2c 20 7a 46 69 6c 65 2c 20 7a 50 72 6f 63  db, zFile, zProc
ee00: 2c 20 26 7a 45 72 72 29 3b 0a 23 65 6e 64 69 66  , &zErr);.#endif
ee10: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
ee20: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
ee30: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
ee40: 2c 20 7a 45 72 72 20 3f 20 7a 45 72 72 20 3a 20  , zErr ? zErr : 
ee50: 22 22 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  "", TCL_VOLATILE
ee60: 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  );.    rc = TCL_
ee70: 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ERROR;.  }else{.
ee80: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b      rc = TCL_OK;
ee90: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
eea0: 72 65 65 28 7a 45 72 72 29 3b 0a 0a 20 20 72 65  ree(zErr);..  re
eeb0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
eec0: 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
eed0: 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74  _enable_load_ext
eee0: 65 6e 73 69 6f 6e 20 44 42 2d 48 41 4e 44 4c 45  ension DB-HANDLE
eef0: 20 4f 4e 4f 46 46 0a 2a 2f 0a 73 74 61 74 69 63   ONOFF.*/.static
ef00: 20 69 6e 74 20 74 65 73 74 5f 65 6e 61 62 6c 65   int test_enable
ef10: 5f 6c 6f 61 64 28 0a 20 20 43 6c 69 65 6e 74 44  _load(.  ClientD
ef20: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
ef30: 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20  /* Not used */. 
ef40: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
ef50: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
ef60: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
ef70: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
ef80: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
ef90: 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
efa0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
efb0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
efc0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
efd0: 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
efe0: 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
eff0: 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f  ){.  Tcl_CmdInfo
f000: 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 73 71 6c 69   cmdInfo;.  sqli
f010: 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72 20  te3 *db;.  char 
f020: 2a 7a 44 62 3b 0a 20 20 69 6e 74 20 6f 6e 6f 66  *zDb;.  int onof
f030: 66 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  f;..  if( objc!=
f040: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  3 ){.    Tcl_Wro
f050: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
f060: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 2d 48  , 1, objv, "DB-H
f070: 41 4e 44 4c 45 20 4f 4e 4f 46 46 22 29 3b 0a 20  ANDLE ONOFF");. 
f080: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
f090: 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62 20 3d  ROR;.  }.  zDb =
f0a0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
f0b0: 62 6a 76 5b 31 5d 29 3b 0a 0a 20 20 2f 2a 20 45  bjv[1]);..  /* E
f0c0: 78 74 72 61 63 74 20 74 68 65 20 43 20 64 61 74  xtract the C dat
f0d0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 66 72 6f  abase handle fro
f0e0: 6d 20 74 68 65 20 54 63 6c 20 63 6f 6d 6d 61 6e  m the Tcl comman
f0f0: 64 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 66 28 20  d name */.  if( 
f100: 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49  !Tcl_GetCommandI
f110: 6e 66 6f 28 69 6e 74 65 72 70 2c 20 7a 44 62 2c  nfo(interp, zDb,
f120: 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20   &cmdInfo) ){.  
f130: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
f140: 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d  lt(interp, "comm
f150: 61 6e 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20 22  and not found: "
f160: 2c 20 7a 44 62 2c 20 28 63 68 61 72 2a 29 30 29  , zDb, (char*)0)
f170: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
f180: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 64 62  _ERROR;.  }.  db
f190: 20 3d 20 28 28 73 74 72 75 63 74 20 53 71 6c 69   = ((struct Sqli
f1a0: 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62  teDb*)cmdInfo.ob
f1b0: 6a 43 6c 69 65 6e 74 44 61 74 61 29 2d 3e 64 62  jClientData)->db
f1c0: 3b 0a 20 20 61 73 73 65 72 74 28 64 62 29 3b 0a  ;.  assert(db);.
f1d0: 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6f 6e  .  /* Get the on
f1e0: 6f 66 66 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  off parameter */
f1f0: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f  .  if( Tcl_GetBo
f200: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
f210: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6f  erp, objv[2], &o
f220: 6e 6f 66 66 29 20 29 7b 0a 20 20 20 20 72 65 74  noff) ){.    ret
f230: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
f240: 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
f250: 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
f260: 4e 53 49 4f 4e 0a 20 20 54 63 6c 5f 41 70 70 65  NSION.  Tcl_Appe
f270: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
f280: 20 22 74 68 69 73 20 62 75 69 6c 64 20 6f 6d 69   "this build omi
f290: 74 73 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f  ts sqlite3_load_
f2a0: 65 78 74 65 6e 73 69 6f 6e 28 29 22 29 3b 0a 20  extension()");. 
f2b0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f2c0: 52 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74  R;.#else.  sqlit
f2d0: 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65  e3_enable_load_e
f2e0: 78 74 65 6e 73 69 6f 6e 28 64 62 2c 20 6f 6e 6f  xtension(db, ono
f2f0: 66 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ff);.  return TC
f300: 4c 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  L_OK;.#endif.}..
f310: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
f320: 6c 69 74 65 5f 61 62 6f 72 74 0a 2a 2a 0a 2a 2a  lite_abort.**.**
f330: 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 72   Shutdown the pr
f340: 6f 63 65 73 73 20 69 6d 6d 65 64 69 61 74 65 6c  ocess immediatel
f350: 79 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 74 20  y.  This is not 
f360: 61 20 63 6c 65 61 6e 20 73 68 75 74 64 6f 77 6e  a clean shutdown
f370: 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e  ..** This comman
f380: 64 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73  d is used to tes
f390: 74 20 74 68 65 20 72 65 63 6f 76 65 72 61 62 69  t the recoverabi
f3a0: 6c 69 74 79 20 6f 66 20 61 20 64 61 74 61 62 61  lity of a databa
f3b0: 73 65 20 69 6e 0a 2a 2a 20 74 68 65 20 65 76 65  se in.** the eve
f3c0: 6e 74 20 6f 66 20 61 20 70 72 6f 67 72 61 6d 20  nt of a program 
f3d0: 63 72 61 73 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  crash..*/.static
f3e0: 20 69 6e 74 20 73 71 6c 69 74 65 5f 61 62 6f 72   int sqlite_abor
f3f0: 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  t(.  void *NotUs
f400: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
f410: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
f420: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
f430: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
f440: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
f450: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
f460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
f470: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
f480: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
f490: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
f4a0: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
f4b0: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66 20  ument */.){.#if 
f4c0: 64 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52  defined(_MSC_VER
f4d0: 29 0a 20 20 2f 2a 20 57 65 20 64 6f 20 74 68 69  ).  /* We do thi
f4e0: 73 2c 20 6f 74 68 65 72 77 69 73 65 20 74 68 65  s, otherwise the
f4f0: 20 74 65 73 74 20 77 69 6c 6c 20 68 61 6c 74 20   test will halt 
f500: 77 69 74 68 20 61 20 70 6f 70 75 70 20 6d 65 73  with a popup mes
f510: 73 61 67 65 0a 20 20 20 2a 20 74 68 61 74 20 77  sage.   * that w
f520: 65 20 68 61 76 65 20 74 6f 20 63 6c 69 63 6b 20  e have to click 
f530: 61 77 61 79 20 62 65 66 6f 72 65 20 74 68 65 20  away before the 
f540: 74 65 73 74 20 77 69 6c 6c 20 63 6f 6e 74 69 6e  test will contin
f550: 75 65 2e 0a 20 20 20 2a 2f 0a 20 20 5f 73 65 74  ue..   */.  _set
f560: 5f 61 62 6f 72 74 5f 62 65 68 61 76 69 6f 72 28  _abort_behavior(
f570: 20 30 2c 20 5f 43 41 4c 4c 5f 52 45 50 4f 52 54   0, _CALL_REPORT
f580: 46 41 55 4c 54 20 29 3b 0a 23 65 6e 64 69 66 0a  FAULT );.#endif.
f590: 20 20 65 78 69 74 28 32 35 35 29 3b 0a 20 20 61    exit(255);.  a
f5a0: 73 73 65 72 74 28 20 69 6e 74 65 72 70 3d 3d 30  ssert( interp==0
f5b0: 20 29 3b 20 20 20 2f 2a 20 54 68 69 73 20 77 69   );   /* This wi
f5c0: 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20 2a  ll always fail *
f5d0: 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  /.  return TCL_O
f5e0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
f5f0: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
f600: 65 20 69 73 20 61 20 75 73 65 72 2d 64 65 66 69  e is a user-defi
f610: 6e 65 64 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ned SQL function
f620: 20 77 68 6f 73 65 20 70 75 72 70 6f 73 65 0a 2a   whose purpose.*
f630: 2a 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 65  * is to test the
f640: 20 73 71 6c 69 74 65 5f 73 65 74 5f 72 65 73 75   sqlite_set_resu
f650: 6c 74 28 29 20 41 50 49 2e 0a 2a 2f 0a 73 74 61  lt() API..*/.sta
f660: 74 69 63 20 76 6f 69 64 20 74 65 73 74 46 75 6e  tic void testFun
f670: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
f680: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20  t *context, int 
f690: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
f6a0: 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 77  lue **argv){.  w
f6b0: 68 69 6c 65 28 20 61 72 67 63 3e 3d 32 20 29 7b  hile( argc>=2 ){
f6c0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
f6d0: 2a 7a 41 72 67 30 20 3d 20 28 63 68 61 72 2a 29  *zArg0 = (char*)
f6e0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
f6f0: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  xt(argv[0]);.   
f700: 20 69 66 28 20 7a 41 72 67 30 20 29 7b 0a 20 20   if( zArg0 ){.  
f710: 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
f720: 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c  e3StrICmp(zArg0,
f730: 20 22 69 6e 74 22 29 20 29 7b 0a 20 20 20 20 20   "int") ){.     
f740: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
f750: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73  t_int(context, s
f760: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
f770: 28 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20  (argv[1]));.    
f780: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
f790: 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30  te3StrICmp(zArg0
f7a0: 2c 22 69 6e 74 36 34 22 29 3d 3d 30 20 29 7b 0a  ,"int64")==0 ){.
f7b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
f7c0: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e  result_int64(con
f7d0: 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61  text, sqlite3_va
f7e0: 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 31  lue_int64(argv[1
f7f0: 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ]));.      }else
f800: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
f810: 43 6d 70 28 7a 41 72 67 30 2c 22 73 74 72 69 6e  Cmp(zArg0,"strin
f820: 67 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  g")==0 ){.      
f830: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
f840: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 28  _text(context, (
f850: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
f860: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d  lue_text(argv[1]
f870: 29 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20  ), -1,.         
f880: 20 20 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49     SQLITE_TRANSI
f890: 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ENT);.      }els
f8a0: 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
f8b0: 49 43 6d 70 28 7a 41 72 67 30 2c 22 64 6f 75 62  ICmp(zArg0,"doub
f8c0: 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  le")==0 ){.     
f8d0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
f8e0: 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74  t_double(context
f8f0: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  , sqlite3_value_
f900: 64 6f 75 62 6c 65 28 61 72 67 76 5b 31 5d 29 29  double(argv[1]))
f910: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
f920: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
f930: 28 7a 41 72 67 30 2c 22 6e 75 6c 6c 22 29 3d 3d  (zArg0,"null")==
f940: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
f950: 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
f960: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  (context);.     
f970: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
f980: 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c  e3StrICmp(zArg0,
f990: 22 76 61 6c 75 65 22 29 3d 3d 30 20 29 7b 0a 20  "value")==0 ){. 
f9a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
f9b0: 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74  esult_value(cont
f9c0: 65 78 74 2c 20 61 72 67 76 5b 73 71 6c 69 74 65  ext, argv[sqlite
f9d0: 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76  3_value_int(argv
f9e0: 5b 31 5d 29 5d 29 3b 0a 20 20 20 20 20 20 7d 65  [1])]);.      }e
f9f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  lse{.        got
fa00: 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20  o error_out;.   
fa10: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
fa20: 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72        goto error
fa30: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
fa40: 61 72 67 63 20 2d 3d 20 32 3b 0a 20 20 20 20 61  argc -= 2;.    a
fa50: 72 67 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20  rgv += 2;.  }.  
fa60: 72 65 74 75 72 6e 3b 0a 0a 65 72 72 6f 72 5f 6f  return;..error_o
fa70: 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  ut:.  sqlite3_re
fa80: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
fa90: 78 74 2c 22 66 69 72 73 74 20 61 72 67 75 6d 65  xt,"first argume
faa0: 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65  nt should be one
fab0: 20 6f 66 3a 20 22 0a 20 20 20 20 20 20 22 69 6e   of: ".      "in
fac0: 74 20 69 6e 74 36 34 20 73 74 72 69 6e 67 20 64  t int64 string d
fad0: 6f 75 62 6c 65 20 6e 75 6c 6c 20 76 61 6c 75 65  ouble null value
fae0: 22 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ", -1);.}../*.**
faf0: 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
fb00: 5f 72 65 67 69 73 74 65 72 5f 74 65 73 74 5f 66  _register_test_f
fb10: 75 6e 63 74 69 6f 6e 20 20 44 42 20 20 4e 41 4d  unction  DB  NAM
fb20: 45 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  E.**.** Register
fb30: 20 74 68 65 20 74 65 73 74 20 53 51 4c 20 66 75   the test SQL fu
fb40: 6e 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64 61  nction on the da
fb50: 74 61 62 61 73 65 20 44 42 20 75 6e 64 65 72 20  tabase DB under 
fb60: 74 68 65 20 6e 61 6d 65 20 4e 41 4d 45 2e 0a 2a  the name NAME..*
fb70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
fb80: 74 5f 72 65 67 69 73 74 65 72 5f 66 75 6e 63 28  t_register_func(
fb90: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
fba0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
fbb0: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
fbc0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
fbd0: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
fbe0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
fbf0: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
fc00: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
fc10: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
fc20: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
fc30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
fc40: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
fc50: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ent */.){.  sqli
fc60: 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
fc70: 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33  c;.  if( argc!=3
fc80: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
fc90: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
fca0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
fcb0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
fcc0: 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
fcd0: 22 20 44 42 20 46 55 4e 43 54 49 4f 4e 2d 4e 41  " DB FUNCTION-NA
fce0: 4d 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  ME", 0);.    ret
fcf0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
fd00: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
fd10: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
fd20: 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
fd30: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
fd40: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
fd50: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
fd60: 62 2c 20 61 72 67 76 5b 32 5d 2c 20 2d 31 2c 20  b, argv[2], -1, 
fd70: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
fd80: 0a 20 20 20 20 20 20 74 65 73 74 46 75 6e 63 2c  .      testFunc,
fd90: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63   0, 0);.  if( rc
fda0: 21 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=0 ){.    Tcl_A
fdb0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
fdc0: 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  rp, sqlite3ErrSt
fdd0: 72 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72  r(rc), 0);.    r
fde0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
fdf0: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
fe00: 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
fe10: 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
fe20: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
fe30: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
fe40: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
fe50: 65 3a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  e:  sqlite3_fina
fe60: 6c 69 7a 65 20 20 53 54 4d 54 20 0a 2a 2a 0a 2a  lize  STMT .**.*
fe70: 2a 20 46 69 6e 61 6c 69 7a 65 20 61 20 73 74 61  * Finalize a sta
fe80: 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a  tement handle..*
fe90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
fea0: 74 5f 66 69 6e 61 6c 69 7a 65 28 0a 20 20 76 6f  t_finalize(.  vo
feb0: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
fec0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
fed0: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
fee0: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
fef0: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
ff00: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
ff10: 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  tmt;.  int rc;. 
ff20: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 30   sqlite3 *db = 0
ff30: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
ff40: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
ff50: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
ff60: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
ff70: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
ff80: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
ff90: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
ffa0: 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54  [0], 0), " <STMT
ffb0: 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  >", 0);.    retu
ffc0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ffd0: 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
ffe0: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
fff0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
10000 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
10010 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
10020 4f 52 3b 0a 0a 20 20 69 66 28 20 70 53 74 6d 74  OR;..  if( pStmt
10030 20 29 7b 0a 20 20 20 20 64 62 20 3d 20 53 74 6d   ){.    db = Stm
10040 74 54 6f 44 62 28 70 53 74 6d 74 29 3b 0a 20 20  tToDb(pStmt);.  
10050 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
10060 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
10070 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ;.  Tcl_SetResul
10080 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
10090 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
100a0 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
100b0 20 20 69 66 28 20 64 62 20 26 26 20 73 71 6c 69    if( db && sqli
100c0 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
100d0 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
100e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
100f0 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  R;.  return TCL_
10100 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
10110 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ge:  sqlite3_stm
10120 74 5f 73 74 61 74 75 73 20 20 53 54 4d 54 20 20  t_status  STMT  
10130 43 4f 44 45 20 20 52 45 53 45 54 46 4c 41 47 0a  CODE  RESETFLAG.
10140 2a 2a 0a 2a 2a 20 47 65 74 20 74 68 65 20 76 61  **.** Get the va
10150 6c 75 65 20 6f 66 20 61 20 73 74 61 74 75 73 20  lue of a status 
10160 63 6f 75 6e 74 65 72 20 66 72 6f 6d 20 61 20 73  counter from a s
10170 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  tatement..*/.sta
10180 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d  tic int test_stm
10190 74 5f 73 74 61 74 75 73 28 0a 20 20 76 6f 69 64  t_status(.  void
101a0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
101b0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
101c0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
101d0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
101e0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e  T objv[].){.  in
101f0 74 20 69 56 61 6c 75 65 3b 0a 20 20 69 6e 74 20  t iValue;.  int 
10200 69 2c 20 6f 70 2c 20 72 65 73 65 74 46 6c 61 67  i, op, resetFlag
10210 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
10220 7a 4f 70 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74  zOpName;.  sqlit
10230 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
10240 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
10250 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e  struct {.    con
10260 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  st char *zName;.
10270 20 20 20 20 69 6e 74 20 6f 70 3b 0a 20 20 7d 20      int op;.  } 
10280 61 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  aOp[] = {.    { 
10290 22 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54  "SQLITE_STMTSTAT
102a0 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50  US_FULLSCAN_STEP
102b0 22 2c 20 20 20 53 51 4c 49 54 45 5f 53 54 4d 54  ",   SQLITE_STMT
102c0 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f  STATUS_FULLSCAN_
102d0 53 54 45 50 20 20 20 7d 2c 0a 20 20 20 20 7b 20  STEP   },.    { 
102e0 22 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54  "SQLITE_STMTSTAT
102f0 55 53 5f 53 4f 52 54 22 2c 20 20 20 20 20 20 20  US_SORT",       
10300 20 20 20 20 20 53 51 4c 49 54 45 5f 53 54 4d 54       SQLITE_STMT
10310 53 54 41 54 55 53 5f 53 4f 52 54 20 20 20 20 20  STATUS_SORT     
10320 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
10330 22 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54  "SQLITE_STMTSTAT
10340 55 53 5f 41 55 54 4f 49 4e 44 45 58 22 2c 20 20  US_AUTOINDEX",  
10350 20 20 20 20 20 53 51 4c 49 54 45 5f 53 54 4d 54       SQLITE_STMT
10360 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58  STATUS_AUTOINDEX
10370 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20         },.  };. 
10380 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
10390 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
103a0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
103b0 6f 62 6a 76 2c 20 22 53 54 4d 54 20 50 41 52 41  objv, "STMT PARA
103c0 4d 45 54 45 52 20 52 45 53 45 54 46 4c 41 47 22  METER RESETFLAG"
103d0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
103e0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
103f0 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
10400 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
10410 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
10420 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
10430 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10440 7a 4f 70 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65  zOpName = Tcl_Ge
10450 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
10460 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41  ;.  for(i=0; i<A
10470 72 72 61 79 53 69 7a 65 28 61 4f 70 29 3b 20 69  rraySize(aOp); i
10480 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
10490 63 6d 70 28 61 4f 70 5b 69 5d 2e 7a 4e 61 6d 65  cmp(aOp[i].zName
104a0 2c 20 7a 4f 70 4e 61 6d 65 29 3d 3d 30 20 29 7b  , zOpName)==0 ){
104b0 0a 20 20 20 20 20 20 6f 70 20 3d 20 61 4f 70 5b  .      op = aOp[
104c0 69 5d 2e 6f 70 3b 0a 20 20 20 20 20 20 62 72 65  i].op;.      bre
104d0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
104e0 69 66 28 20 69 3e 3d 41 72 72 61 79 53 69 7a 65  if( i>=ArraySize
104f0 28 61 4f 70 29 20 29 7b 0a 20 20 20 20 69 66 28  (aOp) ){.    if(
10500 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
10510 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
10520 32 5d 2c 20 26 6f 70 29 20 29 20 72 65 74 75 72  2], &op) ) retur
10530 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
10540 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f  .  if( Tcl_GetBo
10550 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
10560 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 72  erp, objv[3], &r
10570 65 73 65 74 46 6c 61 67 29 20 29 20 72 65 74 75  esetFlag) ) retu
10580 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10590 69 56 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33  iValue = sqlite3
105a0 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53 74  _stmt_status(pSt
105b0 6d 74 2c 20 6f 70 2c 20 72 65 73 65 74 46 6c 61  mt, op, resetFla
105c0 67 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  g);.  Tcl_SetObj
105d0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
105e0 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 69 56 61  cl_NewIntObj(iVa
105f0 6c 75 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  lue));.  return 
10600 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
10610 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
10620 5f 6e 65 78 74 5f 73 74 6d 74 20 20 44 42 20 20  _next_stmt  DB  
10630 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  STMT.**.** Retur
10640 6e 20 74 68 65 20 6e 65 78 74 20 73 74 61 74 6d  n the next statm
10650 65 6e 74 20 69 6e 20 73 65 71 75 65 6e 63 65 20  ent in sequence 
10660 61 66 74 65 72 20 53 54 4d 54 2e 0a 2a 2f 0a 73  after STMT..*/.s
10670 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6e  tatic int test_n
10680 65 78 74 5f 73 74 6d 74 28 0a 20 20 76 6f 69 64  ext_stmt(.  void
10690 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
106a0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
106b0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
106c0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
106d0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
106e0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
106f0 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
10700 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75   = 0;.  char zBu
10710 66 5b 35 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62  f[50];..  if( ob
10720 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
10730 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
10740 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
10750 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
10760 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
10770 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
10780 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
10790 44 42 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20  DB STMT", 0);.  
107a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
107b0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
107c0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
107d0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
107e0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
107f0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
10800 52 4f 52 3b 0a 20 20 69 66 28 20 67 65 74 53 74  ROR;.  if( getSt
10810 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
10820 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
10830 6f 62 6a 76 5b 32 5d 29 2c 20 26 70 53 74 6d 74  objv[2]), &pStmt
10840 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
10850 52 52 4f 52 3b 0a 20 20 70 53 74 6d 74 20 3d 20  RROR;.  pStmt = 
10860 73 71 6c 69 74 65 33 5f 6e 65 78 74 5f 73 74 6d  sqlite3_next_stm
10870 74 28 64 62 2c 20 70 53 74 6d 74 29 3b 0a 20 20  t(db, pStmt);.  
10880 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20  if( pStmt ){.   
10890 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
108a0 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69  MakePointerStr(i
108b0 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74  nterp, zBuf, pSt
108c0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
108d0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f  _ERROR;.    Tcl_
108e0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
108f0 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  erp, zBuf, 0);. 
10900 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
10910 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
10920 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ge:  sqlite3_stm
10930 74 5f 72 65 61 64 6f 6e 6c 79 20 20 53 54 4d 54  t_readonly  STMT
10940 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  .**.** Return tr
10950 75 65 20 69 66 20 53 54 4d 54 20 69 73 20 61 20  ue if STMT is a 
10960 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 6f 72 20  NULL pointer or 
10970 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
10980 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 68 61 74  tatement.** that
10990 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
109a0 6f 20 6c 65 61 76 65 20 74 68 65 20 64 61 74 61  o leave the data
109b0 62 61 73 65 20 75 6e 6d 6f 64 69 66 69 65 64 2e  base unmodified.
109c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
109d0 65 73 74 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c  est_stmt_readonl
109e0 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  y(.  void * clie
109f0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
10a00 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
10a10 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
10a20 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
10a30 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
10a40 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
10a50 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
10a60 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
10a70 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
10a80 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
10a90 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
10aa0 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
10ab0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
10ac0 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53  objv[0], 0), " S
10ad0 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  TMT", 0);.    re
10ae0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10af0 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
10b00 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
10b10 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
10b20 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
10b30 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
10b40 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
10b50 69 74 65 33 5f 73 74 6d 74 5f 72 65 61 64 6f 6e  ite3_stmt_readon
10b60 6c 79 28 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c  ly(pStmt);.  Tcl
10b70 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
10b80 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f  terp, Tcl_NewBoo
10b90 6c 65 61 6e 4f 62 6a 28 72 63 29 29 3b 0a 20 20  leanObj(rc));.  
10ba0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
10bb0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
10bc0 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75 73  sqlite3_stmt_bus
10bd0 79 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65  y  STMT.**.** Re
10be0 74 75 72 6e 20 74 72 75 65 20 69 66 20 53 54 4d  turn true if STM
10bf0 54 20 69 73 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20  T is a non-NULL 
10c00 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 61  pointer to a sta
10c10 74 65 6d 65 6e 74 0a 2a 2a 20 74 68 61 74 20 68  tement.** that h
10c20 61 73 20 62 65 65 6e 20 73 74 65 70 70 65 64 20  as been stepped 
10c30 62 75 74 20 6e 6f 74 20 74 6f 20 63 6f 6d 70 6c  but not to compl
10c40 65 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  etion..*/.static
10c50 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 62   int test_stmt_b
10c60 75 73 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  usy(.  void * cl
10c70 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
10c80 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
10c90 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
10ca0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
10cb0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
10cc0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
10cd0 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
10ce0 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
10cf0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
10d00 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
10d10 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
10d20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
10d30 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
10d40 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
10d50 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20   STMT", 0);.    
10d60 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10d70 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
10d80 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
10d90 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
10da0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
10db0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
10dc0 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
10dd0 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75 73 79  qlite3_stmt_busy
10de0 28 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53  (pStmt);.  Tcl_S
10df0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
10e00 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65  rp, Tcl_NewBoole
10e10 61 6e 4f 62 6a 28 72 63 29 29 3b 0a 20 20 72 65  anObj(rc));.  re
10e20 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
10e30 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 75 73  /*.** Usage:  us
10e40 65 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 20  es_stmt_journal 
10e50 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75   STMT.**.** Retu
10e60 72 6e 20 74 72 75 65 20 69 66 20 53 54 4d 54 20  rn true if STMT 
10e70 75 73 65 73 20 61 20 73 74 61 74 65 6d 65 6e 74  uses a statement
10e80 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61   journal..*/.sta
10e90 74 69 63 20 69 6e 74 20 75 73 65 73 5f 73 74 6d  tic int uses_stm
10ea0 74 5f 6a 6f 75 72 6e 61 6c 28 0a 20 20 76 6f 69  t_journal(.  voi
10eb0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
10ec0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
10ed0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
10ee0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
10ef0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
10f00 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
10f10 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  mt;..  if( objc!
10f20 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
10f30 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
10f40 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
10f50 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
10f60 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
10f70 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
10f80 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d  jv[0], 0), " STM
10f90 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  T", 0);.    retu
10fa0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10fb0 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
10fc0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
10fd0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
10fe0 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
10ff0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
11000 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  OR;.  sqlite3_st
11010 6d 74 5f 72 65 61 64 6f 6e 6c 79 28 70 53 74 6d  mt_readonly(pStm
11020 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  t);.  Tcl_SetObj
11030 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
11040 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a  cl_NewBooleanObj
11050 28 28 28 56 64 62 65 20 2a 29 70 53 74 6d 74 29  (((Vdbe *)pStmt)
11060 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61  ->usesStmtJourna
11070 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  l));.  return TC
11080 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
11090 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
110a0 72 65 73 65 74 20 20 53 54 4d 54 20 0a 2a 2a 0a  reset  STMT .**.
110b0 2a 2a 20 52 65 73 65 74 20 61 20 73 74 61 74 65  ** Reset a state
110c0 6d 65 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  ment handle..*/.
110d0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
110e0 72 65 73 65 74 28 0a 20 20 76 6f 69 64 20 2a 20  reset(.  void * 
110f0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
11100 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
11110 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
11120 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
11130 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
11140 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
11150 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
11160 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
11170 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
11180 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
11190 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
111a0 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
111b0 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
111c0 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
111d0 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30 29 3b 0a   " <STMT>", 0);.
111e0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
111f0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
11200 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
11210 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
11220 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
11230 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
11240 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
11250 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
11260 74 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20  t(pStmt);.  if( 
11270 70 53 74 6d 74 20 26 26 20 73 71 6c 69 74 65 33  pStmt && sqlite3
11280 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
11290 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74  rp, StmtToDb(pSt
112a0 6d 74 29 2c 20 72 63 29 20 29 7b 0a 20 20 20 20  mt), rc) ){.    
112b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
112c0 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 52  ;.  }.  Tcl_SetR
112d0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
112e0 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
112f0 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
11300 43 29 3b 0a 2f 2a 0a 20 20 69 66 28 20 72 63 20  C);./*.  if( rc 
11310 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
11320 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 2a 2f 0a  L_ERROR;.  }.*/.
11330 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
11340 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
11350 20 20 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65    sqlite3_expire
11360 64 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65  d STMT .**.** Re
11370 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 20 72  turn TRUE if a r
11380 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20  ecompilation of 
11390 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
113a0 20 72 65 63 6f 6d 6d 65 6e 64 65 64 2e 0a 2a 2f   recommended..*/
113b0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
113c0 5f 65 78 70 69 72 65 64 28 0a 20 20 76 6f 69 64  _expired(.  void
113d0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
113e0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
113f0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
11400 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
11410 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e  T objv[].){.#ifn
11420 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11430 44 45 50 52 45 43 41 54 45 44 0a 20 20 73 71 6c  DEPRECATED.  sql
11440 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
11450 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ;.  if( objc!=2 
11460 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
11470 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
11480 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
11490 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
114a0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
114b0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
114c0 30 5d 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54 3e  0], 0), " <STMT>
114d0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
114e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
114f0 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
11500 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
11510 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
11520 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
11530 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11540 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
11550 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
11560 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 73  _NewBooleanObj(s
11570 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64 28 70  qlite3_expired(p
11580 53 74 6d 74 29 29 29 3b 0a 23 65 6e 64 69 66 0a  Stmt)));.#endif.
11590 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
115a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
115b0 20 20 73 71 6c 69 74 65 33 5f 74 72 61 6e 73 66    sqlite3_transf
115c0 65 72 5f 62 69 6e 64 69 6e 67 73 20 46 52 4f 4d  er_bindings FROM
115d0 53 54 4d 54 20 54 4f 53 54 4d 54 0a 2a 2a 0a 2a  STMT TOSTMT.**.*
115e0 2a 20 54 72 61 6e 73 66 65 72 20 61 6c 6c 20 62  * Transfer all b
115f0 69 6e 64 69 6e 67 73 20 66 72 6f 6d 20 46 52 4f  indings from FRO
11600 4d 53 54 4d 54 20 6f 76 65 72 20 74 6f 20 54 4f  MSTMT over to TO
11610 53 54 4d 54 0a 2a 2f 0a 73 74 61 74 69 63 20 69  STMT.*/.static i
11620 6e 74 20 74 65 73 74 5f 74 72 61 6e 73 66 65 72  nt test_transfer
11630 5f 62 69 6e 64 28 0a 20 20 76 6f 69 64 20 2a 20  _bind(.  void * 
11640 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
11650 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
11660 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
11670 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
11680 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66  bjv[].){.#ifndef
11690 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
116a0 52 45 43 41 54 45 44 0a 20 20 73 71 6c 69 74 65  RECATED.  sqlite
116b0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 31 2c 20  3_stmt *pStmt1, 
116c0 2a 70 53 74 6d 74 32 3b 0a 20 20 69 66 28 20 6f  *pStmt2;.  if( o
116d0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
116e0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
116f0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
11700 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
11710 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
11720 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
11730 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
11740 20 46 52 4f 4d 2d 53 54 4d 54 20 54 4f 2d 53 54   FROM-STMT TO-ST
11750 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  MT", 0);.    ret
11760 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
11770 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74   }.  if( getStmt
11780 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
11790 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
117a0 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 31 29  jv[1]), &pStmt1)
117b0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
117c0 4f 52 3b 0a 20 20 69 66 28 20 67 65 74 53 74 6d  OR;.  if( getStm
117d0 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
117e0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
117f0 62 6a 76 5b 32 5d 29 2c 20 26 70 53 74 6d 74 32  bjv[2]), &pStmt2
11800 29 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  )) return TCL_ER
11810 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ROR;.  Tcl_SetOb
11820 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
11830 0a 20 20 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74  .     Tcl_NewInt
11840 4f 62 6a 28 73 71 6c 69 74 65 33 5f 74 72 61 6e  Obj(sqlite3_tran
11850 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 28 70 53  sfer_bindings(pS
11860 74 6d 74 31 2c 70 53 74 6d 74 32 29 29 29 3b 0a  tmt1,pStmt2)));.
11870 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
11880 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
11890 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
118a0 5f 63 68 61 6e 67 65 73 20 44 42 0a 2a 2a 0a 2a  _changes DB.**.*
118b0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
118c0 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 6d  ber of changes m
118d0 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  ade to the datab
118e0 61 73 65 20 62 79 20 74 68 65 20 6c 61 73 74 20  ase by the last 
118f0 53 51 4c 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e  SQL.** execution
11900 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11910 74 65 73 74 5f 63 68 61 6e 67 65 73 28 0a 20 20  test_changes(.  
11920 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
11930 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
11940 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
11950 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
11960 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
11970 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
11980 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
11990 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
119a0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
119b0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
119c0 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
119d0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
119e0 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c  objv[0]), " DB",
119f0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
11a00 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
11a10 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
11a20 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
11a30 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
11a40 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
11a50 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c  TCL_ERROR;.  Tcl
11a60 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
11a70 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
11a80 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 68 61 6e  Obj(sqlite3_chan
11a90 67 65 73 28 64 62 29 29 29 3b 0a 20 20 72 65 74  ges(db)));.  ret
11aa0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
11ab0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
11ac0 20 22 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61   "static_bind_va
11ad0 6c 75 65 22 20 74 68 61 74 20 76 61 72 69 61 62  lue" that variab
11ae0 6c 65 73 20 61 72 65 20 62 6f 75 6e 64 20 74 6f  les are bound to
11af0 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 46 4c 41   when.** the FLA
11b00 47 20 6f 70 74 69 6f 6e 20 6f 66 20 73 71 6c 69  G option of sqli
11b10 74 65 33 5f 62 69 6e 64 20 69 73 20 22 73 74 61  te3_bind is "sta
11b20 74 69 63 22 0a 2a 2f 0a 73 74 61 74 69 63 20 63  tic".*/.static c
11b30 68 61 72 20 2a 73 71 6c 69 74 65 5f 73 74 61 74  har *sqlite_stat
11b40 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 20 3d 20  ic_bind_value = 
11b50 30 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  0;.static int sq
11b60 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64  lite_static_bind
11b70 5f 6e 62 79 74 65 20 3d 20 30 3b 0a 0a 2f 2a 0a  _nbyte = 0;../*.
11b80 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
11b90 65 33 5f 62 69 6e 64 20 20 56 4d 20 20 49 44 58  e3_bind  VM  IDX
11ba0 20 20 56 41 4c 55 45 20 20 46 4c 41 47 53 0a 2a    VALUE  FLAGS.*
11bb0 2a 0a 2a 2a 20 53 65 74 73 20 74 68 65 20 76 61  *.** Sets the va
11bc0 6c 75 65 20 6f 66 20 74 68 65 20 49 44 58 2d 74  lue of the IDX-t
11bd0 68 20 6f 63 63 75 72 61 6e 63 65 20 6f 66 20 22  h occurance of "
11be0 3f 22 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  ?" in the origin
11bf0 61 6c 20 53 51 4c 0a 2a 2a 20 73 74 72 69 6e 67  al SQL.** string
11c00 2e 20 20 56 41 4c 55 45 20 69 73 20 74 68 65 20  .  VALUE is the 
11c10 6e 65 77 20 76 61 6c 75 65 2e 20 20 49 66 20 46  new value.  If F
11c20 4c 41 47 53 3d 3d 22 6e 75 6c 6c 22 20 74 68 65  LAGS=="null" the
11c30 6e 20 56 41 4c 55 45 20 69 73 0a 2a 2a 20 69 67  n VALUE is.** ig
11c40 6e 6f 72 65 64 20 61 6e 64 20 74 68 65 20 76 61  nored and the va
11c50 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55  lue is set to NU
11c60 4c 4c 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d 22  LL.  If FLAGS=="
11c70 73 74 61 74 69 63 22 20 74 68 65 6e 0a 2a 2a 20  static" then.** 
11c80 74 68 65 20 76 61 6c 75 65 20 69 73 20 73 65 74  the value is set
11c90 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 6f 66   to the value of
11ca0 20 61 20 73 74 61 74 69 63 20 76 61 72 69 61 62   a static variab
11cb0 6c 65 20 6e 61 6d 65 64 0a 2a 2a 20 22 73 71 6c  le named.** "sql
11cc0 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f  ite_static_bind_
11cd0 76 61 6c 75 65 22 2e 20 20 49 66 20 46 4c 41 47  value".  If FLAG
11ce0 53 3d 3d 22 6e 6f 72 6d 61 6c 22 20 74 68 65 6e  S=="normal" then
11cf0 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 74 68   a copy.** of th
11d00 65 20 56 41 4c 55 45 20 69 73 20 6d 61 64 65 2e  e VALUE is made.
11d10 20 20 49 66 20 46 4c 41 47 53 3d 3d 22 62 6c 6f    If FLAGS=="blo
11d20 62 31 30 22 20 74 68 65 6e 20 61 20 56 41 4c 55  b10" then a VALU
11d30 45 20 69 73 20 69 67 6e 6f 72 65 64 0a 2a 2a 20  E is ignored.** 
11d40 61 6e 20 61 20 31 30 2d 62 79 74 65 20 62 6c 6f  an a 10-byte blo
11d50 62 20 22 61 62 63 5c 30 30 30 78 79 7a 5c 30 30  b "abc\000xyz\00
11d60 30 70 71 22 20 69 73 20 69 6e 73 65 72 74 65 64  0pq" is inserted
11d70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11d80 74 65 73 74 5f 62 69 6e 64 28 0a 20 20 76 6f 69  test_bind(.  voi
11d90 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
11da0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
11db0 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
11dc0 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
11dd0 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
11de0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
11df0 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
11e00 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
11e10 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
11e20 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
11e30 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
11e40 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
11e50 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
11e60 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
11e70 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a   rc;.  int idx;.
11e80 20 20 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b    if( argc!=5 ){
11e90 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
11ea0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
11eb0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
11ec0 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
11ed0 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 56  [0], .       " V
11ee0 4d 20 49 44 58 20 56 41 4c 55 45 20 28 6e 75 6c  M IDX VALUE (nul
11ef0 6c 7c 73 74 61 74 69 63 7c 6e 6f 72 6d 61 6c 29  l|static|normal)
11f00 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
11f10 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
11f20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74   }.  if( getStmt
11f30 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
11f40 61 72 67 76 5b 31 5d 2c 20 26 70 53 74 6d 74 29  argv[1], &pStmt)
11f50 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
11f60 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
11f70 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72  etInt(interp, ar
11f80 67 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72  gv[2], &idx) ) r
11f90 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11fa0 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72  .  if( strcmp(ar
11fb0 67 76 5b 34 5d 2c 22 6e 75 6c 6c 22 29 3d 3d 30  gv[4],"null")==0
11fc0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
11fd0 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70  ite3_bind_null(p
11fe0 53 74 6d 74 2c 20 69 64 78 29 3b 0a 20 20 7d 65  Stmt, idx);.  }e
11ff0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
12000 72 67 76 5b 34 5d 2c 22 73 74 61 74 69 63 22 29  rgv[4],"static")
12010 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
12020 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
12030 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 73 71  t(pStmt, idx, sq
12040 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64  lite_static_bind
12050 5f 76 61 6c 75 65 2c 20 2d 31 2c 20 30 29 3b 0a  _value, -1, 0);.
12060 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
12070 6d 70 28 61 72 67 76 5b 34 5d 2c 22 73 74 61 74  mp(argv[4],"stat
12080 69 63 2d 6e 62 79 74 65 73 22 29 3d 3d 30 20 29  ic-nbytes")==0 )
12090 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
120a0 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74  e3_bind_text(pSt
120b0 6d 74 2c 20 69 64 78 2c 20 73 71 6c 69 74 65 5f  mt, idx, sqlite_
120c0 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75  static_bind_valu
120d0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
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 73 71 6c 69 74 65            sqlite
12100 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62 79  _static_bind_nby
12110 74 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20  te, 0);.  }else 
12120 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
12130 34 5d 2c 22 6e 6f 72 6d 61 6c 22 29 3d 3d 30 20  4],"normal")==0 
12140 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
12150 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
12160 74 6d 74 2c 20 69 64 78 2c 20 61 72 67 76 5b 33  tmt, idx, argv[3
12170 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52  ], -1, SQLITE_TR
12180 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73  ANSIENT);.  }els
12190 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67  e if( strcmp(arg
121a0 76 5b 34 5d 2c 22 62 6c 6f 62 31 30 22 29 3d 3d  v[4],"blob10")==
121b0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 ){.    rc = sq
121c0 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
121d0 70 53 74 6d 74 2c 20 69 64 78 2c 20 22 61 62 63  pStmt, idx, "abc
121e0 5c 30 30 30 78 79 7a 5c 30 30 30 70 71 22 2c 20  \000xyz\000pq", 
121f0 31 30 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  10, SQLITE_STATI
12200 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  C);.  }else{.   
12210 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
12220 74 28 69 6e 74 65 72 70 2c 20 22 34 74 68 20 61  t(interp, "4th a
12230 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62  rgument should b
12240 65 20 22 0a 20 20 20 20 20 20 20 20 22 5c 22 6e  e ".        "\"n
12250 75 6c 6c 5c 22 20 6f 72 20 5c 22 73 74 61 74 69  ull\" or \"stati
12260 63 5c 22 20 6f 72 20 5c 22 6e 6f 72 6d 61 6c 5c  c\" or \"normal\
12270 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
12280 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
12290 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  }.  if( sqlite3T
122a0 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
122b0 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d  p, StmtToDb(pStm
122c0 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  t), rc) ) return
122d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
122e0 28 20 72 63 20 29 7b 0a 20 20 20 20 63 68 61 72  ( rc ){.    char
122f0 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 20 20 73   zBuf[50];.    s
12300 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 28 25  printf(zBuf, "(%
12310 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54  d) ", rc);.    T
12320 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
12330 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71  interp, zBuf, sq
12340 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29 2c  lite3ErrStr(rc),
12350 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
12360 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
12370 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
12380 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
12390 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a  E_OMIT_UTF16./*.
123a0 2a 2a 20 55 73 61 67 65 3a 20 61 64 64 5f 74 65  ** Usage: add_te
123b0 73 74 5f 63 6f 6c 6c 61 74 65 20 3c 64 62 20 70  st_collate <db p
123c0 74 72 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31  tr> <utf8> <utf1
123d0 36 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 0a 2a  6le> <utf16be>.*
123e0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
123f0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  on is used to te
12400 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 73  st that SQLite s
12410 65 6c 65 63 74 73 20 74 68 65 20 63 6f 72 72 65  elects the corre
12420 63 74 20 63 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20  ct collation.** 
12430 73 65 71 75 65 6e 63 65 20 63 61 6c 6c 62 61 63  sequence callbac
12440 6b 20 77 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20  k when multiple 
12450 76 65 72 73 69 6f 6e 73 20 28 66 6f 72 20 64 69  versions (for di
12460 66 66 65 72 65 6e 74 20 74 65 78 74 20 65 6e 63  fferent text enc
12470 6f 64 69 6e 67 73 29 0a 2a 2a 20 61 72 65 20 61  odings).** are a
12480 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  vailable..**.** 
12490 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  Calling this rou
124a0 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 20 74  tine registers t
124b0 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
124c0 75 65 6e 63 65 20 22 74 65 73 74 5f 63 6f 6c 6c  uence "test_coll
124d0 61 74 65 22 0a 2a 2a 20 77 69 74 68 20 64 61 74  ate".** with dat
124e0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 64 62  abase handle <db
124f0 3e 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  >. The second ar
12500 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 61  gument must be a
12510 20 6c 69 73 74 20 6f 66 20 74 68 72 65 65 0a 2a   list of three.*
12520 2a 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73  * boolean values
12530 2e 20 49 66 20 74 68 65 20 66 69 72 73 74 20 69  . If the first i
12540 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 20 76  s true, then a v
12550 65 72 73 69 6f 6e 20 6f 66 20 74 65 73 74 5f 63  ersion of test_c
12560 6f 6c 6c 61 74 65 20 69 73 0a 2a 2a 20 72 65 67  ollate is.** reg
12570 69 73 74 65 72 65 64 20 66 6f 72 20 55 54 46 2d  istered for UTF-
12580 38 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64  8, if the second
12590 20 69 73 20 74 72 75 65 2c 20 61 20 76 65 72 73   is true, a vers
125a0 69 6f 6e 20 69 73 20 72 65 67 69 73 74 65 72 65  ion is registere
125b0 64 20 66 6f 72 0a 2a 2a 20 55 54 46 2d 31 36 6c  d for.** UTF-16l
125c0 65 2c 20 69 66 20 74 68 65 20 74 68 69 72 64 20  e, if the third 
125d0 69 73 20 74 72 75 65 2c 20 61 20 55 54 46 2d 31  is true, a UTF-1
125e0 36 62 65 20 76 65 72 73 69 6f 6e 20 69 73 20 61  6be version is a
125f0 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 20 50 72 65  vailable..** Pre
12600 76 69 6f 75 73 20 76 65 72 73 69 6f 6e 73 20 6f  vious versions o
12610 66 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 61  f test_collate a
12620 72 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a  re deleted..**.*
12630 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  * The collation 
12640 73 65 71 75 65 6e 63 65 20 74 65 73 74 5f 63 6f  sequence test_co
12650 6c 6c 61 74 65 20 69 73 20 69 6d 70 6c 65 6d 65  llate is impleme
12660 6e 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20  nted by calling 
12670 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  the.** following
12680 20 54 43 4c 20 73 63 72 69 70 74 3a 0a 2a 2a 0a   TCL script:.**.
12690 2a 2a 20 20 20 22 74 65 73 74 5f 63 6f 6c 6c 61  **   "test_colla
126a0 74 65 20 3c 65 6e 63 3e 20 3c 6c 68 73 3e 20 3c  te <enc> <lhs> <
126b0 72 68 73 3e 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rhs>".**.** The 
126c0 3c 6c 68 73 3e 20 61 6e 64 20 3c 72 68 73 3e 20  <lhs> and <rhs> 
126d0 61 72 65 20 74 68 65 20 74 77 6f 20 76 61 6c 75  are the two valu
126e0 65 73 20 62 65 69 6e 67 20 63 6f 6d 70 61 72 65  es being compare
126f0 64 2c 20 65 6e 63 6f 64 65 64 20 69 6e 20 55 54  d, encoded in UT
12700 46 2d 38 2e 0a 2a 2a 20 54 68 65 20 3c 65 6e 63  F-8..** The <enc
12710 3e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  > parameter is t
12720 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74  he encoding of t
12730 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  he collation fun
12740 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 53 51  ction that.** SQ
12750 4c 69 74 65 20 73 65 6c 65 63 74 65 64 20 74 6f  Lite selected to
12760 20 63 61 6c 6c 2e 20 54 68 65 20 54 43 4c 20 74   call. The TCL t
12770 65 73 74 20 73 63 72 69 70 74 20 69 6d 70 6c 65  est script imple
12780 6d 65 6e 74 73 20 74 68 65 0a 2a 2a 20 22 74 65  ments the.** "te
12790 73 74 5f 63 6f 6c 6c 61 74 65 22 20 70 72 6f 63  st_collate" proc
127a0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
127b0 74 20 74 68 69 73 20 77 69 6c 6c 20 6f 6e 6c 79  t this will only
127c0 20 77 6f 72 6b 20 77 69 74 68 20 6f 6e 65 20 69   work with one i
127d0 6e 74 65 70 72 65 74 65 72 20 61 74 20 61 20 74  ntepreter at a t
127e0 69 6d 65 2c 20 61 73 20 74 68 65 0a 2a 2a 20 69  ime, as the.** i
127f0 6e 74 65 72 70 20 70 6f 69 6e 74 65 72 20 74 6f  nterp pointer to
12800 20 75 73 65 20 77 68 65 6e 20 65 76 61 6c 75 61   use when evalua
12810 74 69 6e 67 20 74 68 65 20 54 43 4c 20 73 63 72  ting the TCL scr
12820 69 70 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ipt is stored in
12830 0a 2a 2a 20 70 54 65 73 74 43 6f 6c 6c 61 74 65  .** pTestCollate
12840 49 6e 74 65 72 70 2e 0a 2a 2f 0a 73 74 61 74 69  Interp..*/.stati
12850 63 20 54 63 6c 5f 49 6e 74 65 72 70 2a 20 70 54  c Tcl_Interp* pT
12860 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70  estCollateInterp
12870 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  ;.static int tes
12880 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 28 0a  t_collate_func(.
12890 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20    void *pCtx, . 
128a0 20 69 6e 74 20 6e 41 2c 20 63 6f 6e 73 74 20 76   int nA, const v
128b0 6f 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e  oid *zA,.  int n
128c0 42 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  B, const void *z
128d0 42 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  B.){.  Tcl_Inter
128e0 70 20 2a 69 20 3d 20 70 54 65 73 74 43 6f 6c 6c  p *i = pTestColl
128f0 61 74 65 49 6e 74 65 72 70 3b 0a 20 20 69 6e 74  ateInterp;.  int
12900 20 65 6e 63 69 6e 20 3d 20 53 51 4c 49 54 45 5f   encin = SQLITE_
12910 50 54 52 5f 54 4f 5f 49 4e 54 28 70 43 74 78 29  PTR_TO_INT(pCtx)
12920 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 69  ;.  int res;.  i
12930 6e 74 20 6e 3b 0a 0a 20 20 73 71 6c 69 74 65 33  nt n;..  sqlite3
12940 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20  _value *pVal;.  
12950 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 0a 20 20  Tcl_Obj *pX;..  
12960 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  pX = Tcl_NewStri
12970 6e 67 4f 62 6a 28 22 74 65 73 74 5f 63 6f 6c 6c  ngObj("test_coll
12980 61 74 65 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  ate", -1);.  Tcl
12990 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58  _IncrRefCount(pX
129a0 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 65 6e  );..  switch( en
129b0 63 69 6e 20 29 7b 0a 20 20 20 20 63 61 73 65 20  cin ){.    case 
129c0 53 51 4c 49 54 45 5f 55 54 46 38 3a 0a 20 20 20  SQLITE_UTF8:.   
129d0 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
129e0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58  pendElement(i,pX
129f0 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62  ,Tcl_NewStringOb
12a00 6a 28 22 55 54 46 2d 38 22 2c 2d 31 29 29 3b 0a  j("UTF-8",-1));.
12a10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12a20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46   case SQLITE_UTF
12a30 31 36 4c 45 3a 0a 20 20 20 20 20 20 54 63 6c 5f  16LE:.      Tcl_
12a40 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
12a50 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e 65  ment(i,pX,Tcl_Ne
12a60 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d  wStringObj("UTF-
12a70 31 36 4c 45 22 2c 2d 31 29 29 3b 0a 20 20 20 20  16LE",-1));.    
12a80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
12a90 65 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  e SQLITE_UTF16BE
12aa0 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74  :.      Tcl_List
12ab0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
12ac0 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72  (i,pX,Tcl_NewStr
12ad0 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 42 45  ingObj("UTF-16BE
12ae0 22 2c 2d 31 29 29 3b 0a 20 20 20 20 20 20 62 72  ",-1));.      br
12af0 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
12b00 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 30  :.      assert(0
12b10 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
12b20 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
12b30 6f 63 28 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73  oc();.  pVal = s
12b40 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30  qlite3ValueNew(0
12b50 29 3b 0a 20 20 69 66 28 20 70 56 61 6c 20 29 7b  );.  if( pVal ){
12b60 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
12b70 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 6e 41  eSetStr(pVal, nA
12b80 2c 20 7a 41 2c 20 65 6e 63 69 6e 2c 20 53 51 4c  , zA, encin, SQL
12b90 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
12ba0 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   n = sqlite3_val
12bb0 75 65 5f 62 79 74 65 73 28 70 56 61 6c 29 3b 0a  ue_bytes(pVal);.
12bc0 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
12bd0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70  ppendElement(i,p
12be0 58 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4e  X,.        Tcl_N
12bf0 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61  ewStringObj((cha
12c00 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
12c10 5f 74 65 78 74 28 70 56 61 6c 29 2c 6e 29 29 3b  _text(pVal),n));
12c20 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
12c30 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 6e 42  eSetStr(pVal, nB
12c40 2c 20 7a 42 2c 20 65 6e 63 69 6e 2c 20 53 51 4c  , zB, encin, SQL
12c50 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
12c60 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   n = sqlite3_val
12c70 75 65 5f 62 79 74 65 73 28 70 56 61 6c 29 3b 0a  ue_bytes(pVal);.
12c80 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
12c90 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70  ppendElement(i,p
12ca0 58 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4e  X,.        Tcl_N
12cb0 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61  ewStringObj((cha
12cc0 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
12cd0 5f 74 65 78 74 28 70 56 61 6c 29 2c 6e 29 29 3b  _text(pVal),n));
12ce0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
12cf0 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 7d  eFree(pVal);.  }
12d00 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e  .  sqlite3EndBen
12d10 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20  ignMalloc();..  
12d20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 2c  Tcl_EvalObjEx(i,
12d30 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44   pX, 0);.  Tcl_D
12d40 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b  ecrRefCount(pX);
12d50 0a 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  .  Tcl_GetIntFro
12d60 6d 4f 62 6a 28 69 2c 20 54 63 6c 5f 47 65 74 4f  mObj(i, Tcl_GetO
12d70 62 6a 52 65 73 75 6c 74 28 69 29 2c 20 26 72 65  bjResult(i), &re
12d80 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73  s);.  return res
12d90 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 74  ;.}.static int t
12da0 65 73 74 5f 63 6f 6c 6c 61 74 65 28 0a 20 20 76  est_collate(.  v
12db0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
12dc0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
12dd0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
12de0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
12df0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
12e00 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
12e10 69 6e 74 20 76 61 6c 3b 0a 20 20 73 71 6c 69 74  int val;.  sqlit
12e20 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
12e30 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
12e40 20 6f 62 6a 63 21 3d 35 20 29 20 67 6f 74 6f 20   objc!=5 ) goto 
12e50 62 61 64 5f 61 72 67 73 3b 0a 20 20 70 54 65 73  bad_args;.  pTes
12e60 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 20 3d  tCollateInterp =
12e70 20 69 6e 74 65 72 70 3b 0a 20 20 69 66 28 20 67   interp;.  if( g
12e80 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
12e90 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
12ea0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
12eb0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
12ec0 52 4f 52 3b 0a 0a 20 20 69 66 28 20 54 43 4c 5f  ROR;..  if( TCL_
12ed0 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  OK!=Tcl_GetBoole
12ee0 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
12ef0 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61 6c 29  , objv[2], &val)
12f00 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
12f10 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
12f20 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
12f30 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 63  tion(db, "test_c
12f40 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f  ollate", SQLITE_
12f50 55 54 46 38 2c 20 0a 20 20 20 20 20 20 20 20 20  UTF8, .         
12f60 20 28 76 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f   (void *)SQLITE_
12f70 55 54 46 38 2c 20 76 61 6c 3f 74 65 73 74 5f 63  UTF8, val?test_c
12f80 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b 0a  ollate_func:0);.
12f90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
12fa0 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  _OK ){.    const
12fb0 20 76 6f 69 64 20 2a 7a 55 74 66 31 36 3b 0a 20   void *zUtf16;. 
12fc0 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54     if( TCL_OK!=T
12fd0 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
12fe0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
12ff0 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72 65  v[3], &val) ) re
13000 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13010 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13020 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
13030 6e 28 64 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c  n(db, "test_coll
13040 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  ate", SQLITE_UTF
13050 31 36 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 20  16LE, .         
13060 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c 49 54     (void *)SQLIT
13070 45 5f 55 54 46 31 36 4c 45 2c 20 76 61 6c 3f 74  E_UTF16LE, val?t
13080 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63  est_collate_func
13090 3a 30 29 3b 0a 20 20 20 20 69 66 28 20 54 43 4c  :0);.    if( TCL
130a0 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c  _OK!=Tcl_GetBool
130b0 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
130c0 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 76 61 6c  p, objv[4], &val
130d0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
130e0 52 52 4f 52 3b 0a 0a 23 69 66 20 30 0a 20 20 20  RROR;..#if 0.   
130f0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69 4d 61   if( sqlite3_iMa
13100 6c 6c 6f 63 46 61 69 6c 3e 30 20 29 7b 0a 20 20  llocFail>0 ){.  
13110 20 20 20 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c      sqlite3_iMal
13120 6c 6f 63 46 61 69 6c 2b 2b 3b 0a 20 20 20 20 7d  locFail++;.    }
13130 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
13140 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
13150 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
13160 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61  pVal = sqlite3Va
13170 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20 20  lueNew(db);.    
13180 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
13190 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 22 74 65  tr(pVal, -1, "te
131a0 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53 51 4c  st_collate", SQL
131b0 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
131c0 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7a 55  _STATIC);.    zU
131d0 74 66 31 36 20 3d 20 73 71 6c 69 74 65 33 56 61  tf16 = sqlite3Va
131e0 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51  lueText(pVal, SQ
131f0 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
13200 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
13210 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
13220 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
13230 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
13240 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
13250 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
13260 6c 61 74 69 6f 6e 31 36 28 64 62 2c 20 7a 55 74  lation16(db, zUt
13270 66 31 36 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  f16, SQLITE_UTF1
13280 36 42 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  6BE, .          
13290 28 76 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f 55  (void *)SQLITE_U
132a0 54 46 31 36 42 45 2c 20 76 61 6c 3f 74 65 73 74  TF16BE, val?test
132b0 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29  _collate_func:0)
132c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
132d0 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
132e0 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  l);.    sqlite3_
132f0 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
13300 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20 69 66  mutex);.  }.  if
13310 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
13320 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
13330 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
13340 4c 5f 45 52 52 4f 52 3b 0a 20 20 0a 20 20 69 66  L_ERROR;.  .  if
13350 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13360 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
13370 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
13380 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 6f 72  sqlite3TestError
13390 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20  Name(rc), 0);.  
133a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
133b0 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
133c0 20 54 43 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72   TCL_OK;..bad_ar
133d0 67 73 3a 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  gs:.  Tcl_Append
133e0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
133f0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
13400 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
13410 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
13420 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
13430 20 30 29 2c 20 22 20 3c 44 42 3e 20 3c 75 74 66   0), " <DB> <utf
13440 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74  8> <utf16le> <ut
13450 66 31 36 62 65 3e 22 2c 20 30 29 3b 0a 20 20 72  f16be>", 0);.  r
13460 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13470 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  .}../*.** When t
13480 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65  he collation nee
13490 64 65 64 20 63 61 6c 6c 62 61 63 6b 20 69 73 20  ded callback is 
134a0 69 6e 76 6f 6b 65 64 2c 20 72 65 63 6f 72 64 20  invoked, record 
134b0 74 68 65 20 6e 61 6d 65 20 6f 66 20 0a 2a 2a 20  the name of .** 
134c0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
134d0 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
134e0 20 68 65 72 65 2e 20 20 54 68 65 20 72 65 63 6f   here.  The reco
134f0 72 64 65 64 20 6e 61 6d 65 20 69 73 20 6c 69 6e  rded name is lin
13500 6b 65 64 0a 2a 2a 20 74 6f 20 61 20 54 43 4c 20  ked.** to a TCL 
13510 76 61 72 69 61 62 6c 65 20 61 6e 64 20 75 73 65  variable and use
13520 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
13530 68 61 74 20 74 68 65 20 72 65 71 75 65 73 74 65  hat the requeste
13540 64 20 63 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 6e  d collation.** n
13550 61 6d 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  ame is correct..
13560 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a  */.static char z
13570 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b  NeededCollation[
13580 32 30 30 5d 3b 0a 73 74 61 74 69 63 20 63 68 61  200];.static cha
13590 72 20 2a 70 7a 4e 65 65 64 65 64 43 6f 6c 6c 61  r *pzNeededColla
135a0 74 69 6f 6e 20 3d 20 7a 4e 65 65 64 65 64 43 6f  tion = zNeededCo
135b0 6c 6c 61 74 69 6f 6e 3b 0a 0a 0a 2f 2a 0a 2a 2a  llation;.../*.**
135c0 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63   Called when a c
135d0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
135e0 65 20 69 73 20 6e 65 65 64 65 64 2e 20 20 52 65  e is needed.  Re
135f0 67 69 73 74 65 72 65 64 20 75 73 69 6e 67 0a 2a  gistered using.*
13600 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74  * sqlite3_collat
13610 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 29 2e 0a  ion_needed16()..
13620 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
13630 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64  est_collate_need
13640 65 64 5f 63 62 28 0a 20 20 76 6f 69 64 20 2a 70  ed_cb(.  void *p
13650 43 74 78 2c 20 0a 20 20 73 71 6c 69 74 65 33 20  Ctx, .  sqlite3 
13660 2a 64 62 2c 0a 20 20 69 6e 74 20 65 54 65 78 74  *db,.  int eText
13670 52 65 70 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69  Rep,.  const voi
13680 64 20 2a 70 4e 61 6d 65 0a 29 7b 0a 20 20 69 6e  d *pName.){.  in
13690 74 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  t enc = ENC(db);
136a0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
136b0 20 2a 7a 3b 0a 20 20 66 6f 72 28 7a 20 3d 20 28   *z;.  for(z = (
136c0 63 68 61 72 2a 29 70 4e 61 6d 65 2c 20 69 3d 30  char*)pName, i=0
136d0 3b 20 2a 7a 20 7c 7c 20 7a 5b 31 5d 3b 20 7a 2b  ; *z || z[1]; z+
136e0 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 20 29  +){.    if( *z )
136f0 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f   zNeededCollatio
13700 6e 5b 69 2b 2b 5d 20 3d 20 2a 7a 3b 0a 20 20 7d  n[i++] = *z;.  }
13710 0a 20 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74  .  zNeededCollat
13720 69 6f 6e 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71  ion[i] = 0;.  sq
13730 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
13740 6c 61 74 69 6f 6e 28 0a 20 20 20 20 20 20 64 62  lation(.      db
13750 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  , "test_collate"
13760 2c 20 45 4e 43 28 64 62 29 2c 20 53 51 4c 49 54  , ENC(db), SQLIT
13770 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 65 6e 63  E_INT_TO_PTR(enc
13780 29 2c 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f  ), test_collate_
13790 66 75 6e 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  func);.}../*.** 
137a0 55 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f  Usage: add_test_
137b0 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 20 44  collate_needed D
137c0 42 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  B.*/.static int 
137d0 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65  test_collate_nee
137e0 64 65 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ded(.  void * cl
137f0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
13800 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
13810 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
13820 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
13830 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
13840 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
13850 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
13860 20 67 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a   goto bad_args;.
13870 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
13880 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
13890 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
138a0 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
138b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
138c0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61   = sqlite3_colla
138d0 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 64 62  tion_needed16(db
138e0 2c 20 30 2c 20 74 65 73 74 5f 63 6f 6c 6c 61 74  , 0, test_collat
138f0 65 5f 6e 65 65 64 65 64 5f 63 62 29 3b 0a 20 20  e_needed_cb);.  
13900 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e  zNeededCollation
13910 5b 30 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20 73  [0] = 0;.  if( s
13920 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
13930 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63  e(interp, db, rc
13940 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
13950 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54  RROR;.  return T
13960 43 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67 73  CL_OK;..bad_args
13970 3a 0a 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d  :.  Tcl_WrongNum
13980 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
13990 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 72  objv, "DB");.  r
139a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
139b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
139c0 3a 20 20 20 61 64 64 5f 61 6c 69 67 6e 6d 65 6e  :   add_alignmen
139d0 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e  t_test_collation
139e0 73 20 20 44 42 0a 2a 2a 0a 2a 2a 20 41 64 64 20  s  DB.**.** Add 
139f0 74 77 6f 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e  two new collatin
13a00 67 20 73 65 71 75 65 6e 63 65 73 20 74 6f 20 74  g sequences to t
13a10 68 65 20 64 61 74 61 62 61 73 65 20 44 42 0a 2a  he database DB.*
13a20 2a 0a 2a 2a 20 20 20 20 20 75 74 66 31 36 5f 61  *.**     utf16_a
13a30 6c 69 67 6e 65 64 0a 2a 2a 20 20 20 20 20 75 74  ligned.**     ut
13a40 66 31 36 5f 75 6e 61 6c 69 67 6e 65 64 0a 2a 2a  f16_unaligned.**
13a50 0a 2a 2a 20 42 6f 74 68 20 63 6f 6c 6c 61 74 69  .** Both collati
13a60 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75 73 65  ng sequences use
13a70 20 74 68 65 20 73 61 6d 65 20 73 6f 72 74 20 6f   the same sort o
13a80 72 64 65 72 20 61 73 20 42 49 4e 41 52 59 2e 0a  rder as BINARY..
13a90 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 64 69 66 66  ** The only diff
13aa0 65 72 65 6e 63 65 20 69 73 20 74 68 61 74 20 74  erence is that t
13ab0 68 65 20 75 74 66 31 36 5f 61 6c 69 67 6e 65 64  he utf16_aligned
13ac0 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65   collating.** se
13ad0 71 75 65 6e 63 65 20 69 73 20 64 65 63 6c 61 72  quence is declar
13ae0 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ed with the SQLI
13af0 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44  TE_UTF16_ALIGNED
13b00 20 66 6c 61 67 2e 0a 2a 2a 20 42 6f 74 68 20 63   flag..** Both c
13b10 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
13b20 6e 73 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  ns increment the
13b30 20 75 6e 61 6c 69 67 6e 65 64 20 75 74 66 31 36   unaligned utf16
13b40 20 63 6f 75 6e 74 65 72 0a 2a 2a 20 77 68 65 6e   counter.** when
13b50 65 76 65 72 20 74 68 65 79 20 73 65 65 20 61 20  ever they see a 
13b60 73 74 72 69 6e 67 20 74 68 61 74 20 62 65 67 69  string that begi
13b70 6e 73 20 6f 6e 20 61 6e 20 6f 64 64 20 62 79 74  ns on an odd byt
13b80 65 20 62 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a 73  e boundary..*/.s
13b90 74 61 74 69 63 20 69 6e 74 20 75 6e 61 6c 69 67  tatic int unalig
13ba0 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74  ned_string_count
13bb0 65 72 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69  er = 0;.static i
13bc0 6e 74 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c  nt alignmentColl
13bd0 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  Func(.  void *No
13be0 74 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b 65  tUsed,.  int nKe
13bf0 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
13c00 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65  pKey1,.  int nKe
13c10 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y2, const void *
13c20 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72  pKey2.){.  int r
13c30 63 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79  c, n;.  n = nKey
13c40 31 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20  1<nKey2 ? nKey1 
13c50 3a 20 6e 4b 65 79 32 3b 0a 20 20 69 66 28 20 6e  : nKey2;.  if( n
13c60 4b 65 79 31 3e 30 20 26 26 20 31 3d 3d 28 31 26  Key1>0 && 1==(1&
13c70 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49  (SQLITE_PTR_TO_I
13c80 4e 54 28 70 4b 65 79 31 29 29 29 20 29 20 75 6e  NT(pKey1))) ) un
13c90 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63  aligned_string_c
13ca0 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20  ounter++;.  if( 
13cb0 6e 4b 65 79 32 3e 30 20 26 26 20 31 3d 3d 28 31  nKey2>0 && 1==(1
13cc0 26 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  &(SQLITE_PTR_TO_
13cd0 49 4e 54 28 70 4b 65 79 32 29 29 29 20 29 20 75  INT(pKey2))) ) u
13ce0 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f  naligned_string_
13cf0 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 72 63 20  counter++;.  rc 
13d00 3d 20 6d 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20  = memcmp(pKey1, 
13d10 70 4b 65 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28  pKey2, n);.  if(
13d20 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63   rc==0 ){.    rc
13d30 20 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32   = nKey1 - nKey2
13d40 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
13d50 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  c;.}.static int 
13d60 61 64 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65  add_alignment_te
13d70 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73 28 0a 20  st_collations(. 
13d80 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
13d90 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
13da0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
13db0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
13dc0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
13dd0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
13de0 20 20 69 66 28 20 6f 62 6a 63 3e 3d 32 20 29 7b    if( objc>=2 ){
13df0 0a 20 20 20 20 69 66 28 20 67 65 74 44 62 50 6f  .    if( getDbPo
13e00 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
13e10 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
13e20 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
13e30 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
13e40 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
13e50 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  e_collation(db, 
13e60 22 75 74 66 31 36 5f 75 6e 61 6c 69 67 6e 65 64  "utf16_unaligned
13e70 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 2c  ", SQLITE_UTF16,
13e80 20 0a 20 20 20 20 20 20 20 20 30 2c 20 61 6c 69   .        0, ali
13e90 67 6e 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b  gnmentCollFunc);
13ea0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
13eb0 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62  ate_collation(db
13ec0 2c 20 22 75 74 66 31 36 5f 61 6c 69 67 6e 65 64  , "utf16_aligned
13ed0 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f  ", SQLITE_UTF16_
13ee0 41 4c 49 47 4e 45 44 2c 20 0a 20 20 20 20 20 20  ALIGNED, .      
13ef0 20 20 30 2c 20 61 6c 69 67 6e 6d 65 6e 74 43 6f    0, alignmentCo
13f00 6c 6c 46 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 72  llFunc);.  }.  r
13f10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13f20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
13f30 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
13f40 54 5f 55 54 46 31 36 29 20 2a 2f 0a 0a 2f 2a 0a  T_UTF16) */../*.
13f50 2a 2a 20 55 73 61 67 65 3a 20 61 64 64 5f 74 65  ** Usage: add_te
13f60 73 74 5f 66 75 6e 63 74 69 6f 6e 20 3c 64 62 20  st_function <db 
13f70 70 74 72 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66  ptr> <utf8> <utf
13f80 31 36 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 0a  16le> <utf16be>.
13f90 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
13fa0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 74  ion is used to t
13fb0 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20  est that SQLite 
13fc0 73 65 6c 65 63 74 73 20 74 68 65 20 63 6f 72 72  selects the corr
13fd0 65 63 74 20 75 73 65 72 0a 2a 2a 20 66 75 6e 63  ect user.** func
13fe0 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 77 68  tion callback wh
13ff0 65 6e 20 6d 75 6c 74 69 70 6c 65 20 76 65 72 73  en multiple vers
14000 69 6f 6e 73 20 28 66 6f 72 20 64 69 66 66 65 72  ions (for differ
14010 65 6e 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  ent text encodin
14020 67 73 29 0a 2a 2a 20 61 72 65 20 61 76 61 69 6c  gs).** are avail
14030 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  able..**.** Call
14040 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
14050 20 72 65 67 69 73 74 65 72 73 20 75 70 20 74 6f   registers up to
14060 20 74 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20   three versions 
14070 6f 66 20 74 68 65 20 75 73 65 72 20 66 75 6e 63  of the user func
14080 74 69 6f 6e 0a 2a 2a 20 22 74 65 73 74 5f 66 75  tion.** "test_fu
14090 6e 63 74 69 6f 6e 22 20 77 69 74 68 20 64 61 74  nction" with dat
140a0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 64 62  abase handle <db
140b0 3e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e  >.  If the secon
140c0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a  d argument is.**
140d0 20 74 72 75 65 2c 20 74 68 65 6e 20 61 20 76 65   true, then a ve
140e0 72 73 69 6f 6e 20 6f 66 20 74 65 73 74 5f 66 75  rsion of test_fu
140f0 6e 63 74 69 6f 6e 20 69 73 20 72 65 67 69 73 74  nction is regist
14100 65 72 65 64 20 66 6f 72 20 55 54 46 2d 38 2c 20  ered for UTF-8, 
14110 69 66 20 74 68 65 0a 2a 2a 20 74 68 69 72 64 20  if the.** third 
14120 69 73 20 74 72 75 65 2c 20 61 20 76 65 72 73 69  is true, a versi
14130 6f 6e 20 69 73 20 72 65 67 69 73 74 65 72 65 64  on is registered
14140 20 66 6f 72 20 55 54 46 2d 31 36 6c 65 2c 20 69   for UTF-16le, i
14150 66 20 74 68 65 20 66 6f 75 72 74 68 20 69 73 0a  f the fourth is.
14160 2a 2a 20 74 72 75 65 2c 20 61 20 55 54 46 2d 31  ** true, a UTF-1
14170 36 62 65 20 76 65 72 73 69 6f 6e 20 69 73 20 61  6be version is a
14180 76 61 69 6c 61 62 6c 65 2e 20 20 50 72 65 76 69  vailable.  Previ
14190 6f 75 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 0a  ous versions of.
141a0 2a 2a 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  ** test_function
141b0 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2a   are deleted..**
141c0 0a 2a 2a 20 54 68 65 20 75 73 65 72 20 66 75 6e  .** The user fun
141d0 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65  ction is impleme
141e0 6e 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20  nted by calling 
141f0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 54 43  the following TC
14200 4c 20 73 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20  L script:.**.** 
14210 20 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e    "test_function
14220 20 3c 65 6e 63 3e 20 3c 61 72 67 3e 22 0a 2a 2a   <enc> <arg>".**
14230 0a 2a 2a 20 57 68 65 72 65 20 3c 65 6e 63 3e 20  .** Where <enc> 
14240 69 73 20 6f 6e 65 20 6f 66 20 55 54 46 2d 38 2c  is one of UTF-8,
14250 20 55 54 46 2d 31 36 4c 45 20 6f 72 20 55 54 46   UTF-16LE or UTF
14260 31 36 42 45 2c 20 61 6e 64 20 3c 61 72 67 3e 20  16BE, and <arg> 
14270 69 73 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65  is the.** single
14280 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
14290 20 74 6f 20 74 68 65 20 53 51 4c 20 66 75 6e 63   to the SQL func
142a0 74 69 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65 20  tion. The value 
142b0 72 65 74 75 72 6e 65 64 20 62 79 0a 2a 2a 20 74  returned by.** t
142c0 68 65 20 54 43 4c 20 73 63 72 69 70 74 20 69 73  he TCL script is
142d0 20 75 73 65 64 20 61 73 20 74 68 65 20 72 65 74   used as the ret
142e0 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 65  urn value of the
142f0 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 49   SQL function. I
14300 74 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 74  t.** is passed t
14310 6f 20 53 51 4c 69 74 65 20 75 73 69 6e 67 20 55  o SQLite using U
14320 54 46 2d 31 36 42 45 20 66 6f 72 20 61 20 55 54  TF-16BE for a UT
14330 46 2d 38 20 74 65 73 74 5f 66 75 6e 63 74 69 6f  F-8 test_functio
14340 6e 28 29 2c 20 55 54 46 2d 38 0a 2a 2a 20 66 6f  n(), UTF-8.** fo
14350 72 20 61 20 55 54 46 2d 31 36 4c 45 20 74 65 73  r a UTF-16LE tes
14360 74 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e  t_function(), an
14370 64 20 55 54 46 2d 31 36 4c 45 20 66 6f 72 20 61  d UTF-16LE for a
14380 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  n implementation
14390 20 74 68 61 74 0a 2a 2a 20 70 72 65 66 65 72 73   that.** prefers
143a0 20 55 54 46 2d 31 36 42 45 2e 0a 2a 2f 0a 23 69   UTF-16BE..*/.#i
143b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
143c0 54 5f 55 54 46 31 36 0a 73 74 61 74 69 63 20 76  T_UTF16.static v
143d0 6f 69 64 20 74 65 73 74 5f 66 75 6e 63 74 69 6f  oid test_functio
143e0 6e 5f 75 74 66 38 28 0a 20 20 73 71 6c 69 74 65  n_utf8(.  sqlite
143f0 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
14400 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
14410 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
14420 61 72 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e  argv.){.  Tcl_In
14430 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20  terp *interp;.  
14440 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73  Tcl_Obj *pX;.  s
14450 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
14460 61 6c 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 28  al;.  interp = (
14470 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c  Tcl_Interp *)sql
14480 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70  ite3_user_data(p
14490 43 74 78 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c  Ctx);.  pX = Tcl
144a0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74  _NewStringObj("t
144b0 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d  est_function", -
144c0 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  1);.  Tcl_IncrRe
144d0 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63  fCount(pX);.  Tc
144e0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
144f0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
14500 58 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  X, Tcl_NewString
14510 4f 62 6a 28 22 55 54 46 2d 38 22 2c 20 2d 31 29  Obj("UTF-8", -1)
14520 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
14530 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
14540 74 65 72 70 2c 20 70 58 2c 20 0a 20 20 20 20 20  terp, pX, .     
14550 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
14560 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  j((char*)sqlite3
14570 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
14580 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63  [0]), -1));.  Tc
14590 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65  l_EvalObjEx(inte
145a0 72 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63  rp, pX, 0);.  Tc
145b0 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
145c0 58 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  X);.  sqlite3_re
145d0 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20  sult_text(pCtx, 
145e0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
145f0 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 2d 31 2c  ult(interp), -1,
14600 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
14610 54 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c  T);.  pVal = sql
14620 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b  ite3ValueNew(0);
14630 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53  .  sqlite3ValueS
14640 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20  etStr(pVal, -1, 
14650 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
14660 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a 20 20  ult(interp), .  
14670 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c      SQLITE_UTF8,
14680 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
14690 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
146a0 74 5f 74 65 78 74 31 36 62 65 28 70 43 74 78 2c  t_text16be(pCtx,
146b0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
146c0 65 78 74 31 36 62 65 28 70 56 61 6c 29 2c 0a 20  ext16be(pVal),. 
146d0 20 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f       -1, SQLITE_
146e0 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71  TRANSIENT);.  sq
146f0 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
14700 56 61 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  Val);.}.static v
14710 6f 69 64 20 74 65 73 74 5f 66 75 6e 63 74 69 6f  oid test_functio
14720 6e 5f 75 74 66 31 36 6c 65 28 0a 20 20 73 71 6c  n_utf16le(.  sql
14730 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
14740 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c  tx, .  int nArg,
14750 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
14760 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54 63 6c   **argv.){.  Tcl
14770 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
14780 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a  .  Tcl_Obj *pX;.
14790 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
147a0 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72 70 20  *pVal;.  interp 
147b0 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29  = (Tcl_Interp *)
147c0 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
147d0 61 28 70 43 74 78 29 3b 0a 20 20 70 58 20 3d 20  a(pCtx);.  pX = 
147e0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
147f0 28 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22  ("test_function"
14800 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  , -1);.  Tcl_Inc
14810 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20  rRefCount(pX);. 
14820 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
14830 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
14840 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53 74 72  , pX, Tcl_NewStr
14850 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 4c 45  ingObj("UTF-16LE
14860 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  ", -1));.  Tcl_L
14870 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
14880 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20  ent(interp, pX, 
14890 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  .      Tcl_NewSt
148a0 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73  ringObj((char*)s
148b0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
148c0 74 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29  t(argv[0]), -1))
148d0 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  ;.  Tcl_EvalObjE
148e0 78 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 30 29  x(interp, pX, 0)
148f0 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
14900 6f 75 6e 74 28 70 58 29 3b 0a 20 20 70 56 61 6c  ount(pX);.  pVal
14910 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
14920 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  ew(0);.  sqlite3
14930 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c  ValueSetStr(pVal
14940 2c 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72  , -1, Tcl_GetStr
14950 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ingResult(interp
14960 29 2c 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45  ), .      SQLITE
14970 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54  _UTF8, SQLITE_ST
14980 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33  ATIC);.  sqlite3
14990 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74  _result_text(pCt
149a0 78 2c 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  x,(char*)sqlite3
149b0 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c  _value_text(pVal
149c0 29 2c 2d 31 2c 53 51 4c 49 54 45 5f 54 52 41 4e  ),-1,SQLITE_TRAN
149d0 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65  SIENT);.  sqlite
149e0 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
149f0 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
14a00 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74  test_function_ut
14a10 66 31 36 62 65 28 0a 20 20 73 71 6c 69 74 65 33  f16be(.  sqlite3
14a20 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
14a30 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73  .  int nArg,.  s
14a40 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
14a50 72 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74  rgv.){.  Tcl_Int
14a60 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54  erp *interp;.  T
14a70 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71  cl_Obj *pX;.  sq
14a80 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
14a90 6c 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 28 54  l;.  interp = (T
14aa0 63 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c 69  cl_Interp *)sqli
14ab0 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43  te3_user_data(pC
14ac0 74 78 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f  tx);.  pX = Tcl_
14ad0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65  NewStringObj("te
14ae0 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31  st_function", -1
14af0 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
14b00 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c  Count(pX);.  Tcl
14b10 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
14b20 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58  ement(interp, pX
14b30 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
14b40 62 6a 28 22 55 54 46 2d 31 36 42 45 22 2c 20 2d  bj("UTF-16BE", -
14b50 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  1));.  Tcl_ListO
14b60 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
14b70 69 6e 74 65 72 70 2c 20 70 58 2c 20 0a 20 20 20  interp, pX, .   
14b80 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
14b90 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74  Obj((char*)sqlit
14ba0 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
14bb0 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20  gv[0]), -1));.  
14bc0 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e  Tcl_EvalObjEx(in
14bd0 74 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20  terp, pX, 0);.  
14be0 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
14bf0 28 70 58 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73  (pX);.  pVal = s
14c00 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30  qlite3ValueNew(0
14c10 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
14c20 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31  eSetStr(pVal, -1
14c30 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  , Tcl_GetStringR
14c40 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a  esult(interp), .
14c50 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46        SQLITE_UTF
14c60 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  8, SQLITE_STATIC
14c70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
14c80 75 6c 74 5f 74 65 78 74 31 36 28 70 43 74 78 2c  ult_text16(pCtx,
14c90 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
14ca0 65 78 74 31 36 6c 65 28 70 56 61 6c 29 2c 0a 20  ext16le(pVal),. 
14cb0 20 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f       -1, SQLITE_
14cc0 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71  TRANSIENT);.  sq
14cd0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
14ce0 74 31 36 62 65 28 70 43 74 78 2c 20 73 71 6c 69  t16be(pCtx, sqli
14cf0 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36  te3_value_text16
14d00 6c 65 28 70 56 61 6c 29 2c 0a 20 20 20 20 20 20  le(pVal),.      
14d10 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
14d20 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  IENT);.  sqlite3
14d30 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36 6c 65  _result_text16le
14d40 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76  (pCtx, sqlite3_v
14d50 61 6c 75 65 5f 74 65 78 74 31 36 6c 65 28 70 56  alue_text16le(pV
14d60 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53  al),.      -1, S
14d70 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
14d80 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
14d90 46 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 23 65  Free(pVal);.}.#e
14da0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
14db0 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 73 74 61  MIT_UTF16 */.sta
14dc0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 66 75 6e  tic int test_fun
14dd0 63 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20  ction(.  void * 
14de0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
14df0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
14e00 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
14e10 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
14e20 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66  bjv[].){.#ifndef
14e30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
14e40 31 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  16.  sqlite3 *db
14e50 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 0a 20 20  ;.  int val;..  
14e60 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 20 67 6f  if( objc!=5 ) go
14e70 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 69  to bad_args;.  i
14e80 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
14e90 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
14ea0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
14eb0 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
14ec0 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20  L_ERROR;..  if( 
14ed0 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42  TCL_OK!=Tcl_GetB
14ee0 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
14ef0 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
14f00 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  val) ) return TC
14f10 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 76  L_ERROR;.  if( v
14f20 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
14f30 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
14f40 6e 28 64 62 2c 20 22 74 65 73 74 5f 66 75 6e 63  n(db, "test_func
14f50 74 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45  tion", 1, SQLITE
14f60 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20 20 20  _UTF8, .        
14f70 69 6e 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e  interp, test_fun
14f80 63 74 69 6f 6e 5f 75 74 66 38 2c 20 30 2c 20 30  ction_utf8, 0, 0
14f90 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 43 4c  );.  }.  if( TCL
14fa0 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c  _OK!=Tcl_GetBool
14fb0 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
14fc0 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c  p, objv[3], &val
14fd0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
14fe0 52 52 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c 20  RROR;.  if( val 
14ff0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  ){.    sqlite3_c
15000 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
15010 62 2c 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f  b, "test_functio
15020 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54  n", 1, SQLITE_UT
15030 46 31 36 4c 45 2c 20 0a 20 20 20 20 20 20 20 20  F16LE, .        
15040 69 6e 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e  interp, test_fun
15050 63 74 69 6f 6e 5f 75 74 66 31 36 6c 65 2c 20 30  ction_utf16le, 0
15060 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
15070 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42  TCL_OK!=Tcl_GetB
15080 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
15090 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26  terp, objv[4], &
150a0 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  val) ) return TC
150b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 76  L_ERROR;.  if( v
150c0 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
150d0 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
150e0 6e 28 64 62 2c 20 22 74 65 73 74 5f 66 75 6e 63  n(db, "test_func
150f0 74 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45  tion", 1, SQLITE
15100 5f 55 54 46 31 36 42 45 2c 20 0a 20 20 20 20 20  _UTF16BE, .     
15110 20 20 20 69 6e 74 65 72 70 2c 20 74 65 73 74 5f     interp, test_
15120 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 62 65  function_utf16be
15130 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 0, 0);.  }..  
15140 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 62  return TCL_OK;.b
15150 61 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 41  ad_args:.  Tcl_A
15160 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
15170 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
15180 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
15190 2c 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  ,.      Tcl_GetS
151a0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
151b0 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 44 42 3e  v[0], 0), " <DB>
151c0 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65   <utf8> <utf16le
151d0 3e 20 3c 75 74 66 31 36 62 65 3e 22 2c 20 30 29  > <utf16be>", 0)
151e0 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
151f0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
15200 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  .  return TCL_ER
15210 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  ROR;.}../*.** Us
15220 61 67 65 3a 20 20 20 20 20 20 20 20 20 73 71 6c  age:         sql
15230 69 74 65 33 5f 74 65 73 74 5f 65 72 72 73 74 72  ite3_test_errstr
15240 20 3c 65 72 72 20 63 6f 64 65 3e 0a 2a 2a 0a 2a   <err code>.**.*
15250 2a 20 54 65 73 74 20 74 68 61 74 20 74 68 65 20  * Test that the 
15260 65 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65  english language
15270 20 73 74 72 69 6e 67 20 65 71 75 69 76 61 6c 65   string equivale
15280 6e 74 73 20 66 6f 72 20 73 71 6c 69 74 65 20 65  nts for sqlite e
15290 72 72 6f 72 20 63 6f 64 65 73 0a 2a 2a 20 61 72  rror codes.** ar
152a0 65 20 73 61 6e 65 2e 20 54 68 65 20 70 61 72 61  e sane. The para
152b0 6d 65 74 65 72 20 69 73 20 61 6e 20 69 6e 74 65  meter is an inte
152c0 67 65 72 20 72 65 70 72 65 73 65 6e 74 69 6e 67  ger representing
152d0 20 61 6e 20 73 71 6c 69 74 65 20 65 72 72 6f 72   an sqlite error
152e0 20 63 6f 64 65 2e 0a 2a 2a 20 54 68 65 20 72 65   code..** The re
152f0 73 75 6c 74 20 69 73 20 61 20 6c 69 73 74 20 6f  sult is a list o
15300 66 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 2c 20  f two elements, 
15310 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65  the string repre
15320 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
15330 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 61  .** error code a
15340 6e 64 20 74 68 65 20 65 6e 67 6c 69 73 68 20 6c  nd the english l
15350 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74  anguage explanat
15360 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
15370 6e 74 20 74 65 73 74 5f 65 72 72 73 74 72 28 0a  nt test_errstr(.
15380 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
15390 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
153a0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
153b0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
153c0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
153d0 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 64 65 3b  {.  char *zCode;
153e0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
153f0 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54  objc!=1 ){.    T
15400 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
15410 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
15420 20 22 3c 65 72 72 6f 72 20 63 6f 64 65 3e 22 29   "<error code>")
15430 3b 0a 20 20 7d 0a 0a 20 20 7a 43 6f 64 65 20 3d  ;.  }..  zCode =
15440 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
15450 62 6a 76 5b 31 5d 29 3b 0a 20 20 66 6f 72 28 69  bjv[1]);.  for(i
15460 3d 30 3b 20 69 3c 32 30 30 3b 20 69 2b 2b 29 7b  =0; i<200; i++){
15470 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63  .    if( 0==strc
15480 6d 70 28 74 31 45 72 72 6f 72 4e 61 6d 65 28 69  mp(t1ErrorName(i
15490 29 2c 20 7a 43 6f 64 65 29 20 29 20 62 72 65 61  ), zCode) ) brea
154a0 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74  k;.  }.  Tcl_Set
154b0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
154c0 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72  char *)sqlite3Er
154d0 72 53 74 72 28 69 29 2c 20 30 29 3b 0a 20 20 72  rStr(i), 0);.  r
154e0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
154f0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
15500 20 62 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a   breakpoint.**.*
15510 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  * This routine e
15520 78 69 73 74 73 20 66 6f 72 20 6f 6e 65 20 70 75  xists for one pu
15530 72 70 6f 73 65 20 2d 20 74 6f 20 70 72 6f 76 69  rpose - to provi
15540 64 65 20 61 20 70 6c 61 63 65 20 74 6f 20 70 75  de a place to pu
15550 74 20 61 0a 2a 2a 20 62 72 65 61 6b 70 6f 69 6e  t a.** breakpoin
15560 74 20 77 69 74 68 20 47 44 42 20 74 68 61 74 20  t with GDB that 
15570 63 61 6e 20 62 65 20 74 72 69 67 67 65 72 65 64  can be triggered
15580 20 75 73 69 6e 67 20 54 43 4c 20 63 6f 64 65 2e   using TCL code.
15590 20 20 54 68 65 20 75 73 65 0a 2a 2a 20 66 6f 72    The use.** for
155a0 20 74 68 69 73 20 69 73 20 77 68 65 6e 20 61 20   this is when a 
155b0 70 61 72 74 69 63 75 6c 61 72 20 74 65 73 74 20  particular test 
155c0 66 61 69 6c 73 20 6f 6e 20 28 73 61 79 29 20 74  fails on (say) t
155d0 68 65 20 31 34 38 35 74 68 20 69 74 65 72 61 74  he 1485th iterat
155e0 69 6f 6e 2e 0a 2a 2a 20 49 6e 20 74 68 65 20 54  ion..** In the T
155f0 43 4c 20 74 65 73 74 20 73 63 72 69 70 74 2c 20  CL test script, 
15600 77 65 20 63 61 6e 20 61 64 64 20 63 6f 64 65 20  we can add code 
15610 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
15620 20 20 20 20 20 69 66 20 7b 24 69 3d 3d 31 34 38       if {$i==148
15630 35 7d 20 62 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a  5} breakpoint.**
15640 0a 2a 2a 20 54 68 65 6e 20 72 75 6e 20 74 65 73  .** Then run tes
15650 74 66 69 78 74 75 72 65 20 69 6e 20 74 68 65 20  tfixture in the 
15660 64 65 62 75 67 67 65 72 20 61 6e 64 20 77 61 69  debugger and wai
15670 74 20 66 6f 72 20 74 68 65 20 62 72 65 61 6b 70  t for the breakp
15680 6f 69 6e 74 20 74 6f 0a 2a 2a 20 66 69 72 65 2e  oint to.** fire.
15690 20 20 54 68 65 6e 20 61 64 64 69 74 69 6f 6e 61    Then additiona
156a0 6c 20 62 72 65 61 6b 70 6f 69 6e 74 73 20 63 61  l breakpoints ca
156b0 6e 20 62 65 20 73 65 74 20 74 6f 20 74 72 61 63  n be set to trac
156c0 65 20 64 6f 77 6e 20 74 68 65 20 62 75 67 2e 0a  e down the bug..
156d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
156e0 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 0a 20  st_breakpoint(. 
156f0 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
15700 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
15710 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
15720 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
15730 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
15740 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
15750 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
15760 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
15770 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
15780 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
15790 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
157a0 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
157b0 74 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e  t */.){.  return
157c0 20 54 43 4c 5f 4f 4b 3b 20 20 20 20 20 20 20 20   TCL_OK;        
157d0 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a   /* Do nothing *
157e0 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  /.}../*.** Usage
157f0 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
15800 5f 7a 65 72 6f 62 6c 6f 62 20 20 53 54 4d 54 20  _zeroblob  STMT 
15810 49 44 58 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74  IDX N.**.** Test
15820 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e   the sqlite3_bin
15830 64 5f 7a 65 72 6f 62 6c 6f 62 20 69 6e 74 65 72  d_zeroblob inter
15840 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61  face.  STMT is a
15850 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
15860 65 6e 74 2e 0a 2a 2a 20 49 44 58 20 69 73 20 74  ent..** IDX is t
15870 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69  he index of a wi
15880 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72  ldcard in the pr
15890 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
158a0 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a  .  This command.
158b0 2a 2a 20 62 69 6e 64 73 20 61 20 4e 2d 62 79 74  ** binds a N-byt
158c0 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 42 4c  e zero-filled BL
158d0 4f 42 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61  OB to the wildca
158e0 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rd..*/.static in
158f0 74 20 74 65 73 74 5f 62 69 6e 64 5f 7a 65 72 6f  t test_bind_zero
15900 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20 63  blob(.  void * c
15910 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
15920 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
15930 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
15940 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
15950 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
15960 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
15970 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20   int idx;.  int 
15980 6e 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  n;.  int rc;..  
15990 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
159a0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
159b0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
159c0 62 6a 76 2c 20 22 53 54 4d 54 20 49 44 58 20 4e  bjv, "STMT IDX N
159d0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
159e0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
159f0 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
15a00 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
15a10 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
15a20 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
15a30 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15a40 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
15a50 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
15a60 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29  objv[2], &idx) )
15a70 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
15a80 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
15a90 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
15aa0 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29 20  p, objv[3], &n) 
15ab0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
15ac0 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
15ad0 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f  te3_bind_zeroblo
15ae0 62 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 6e 29  b(pStmt, idx, n)
15af0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
15b00 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
15b10 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d  p, StmtToDb(pStm
15b20 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  t), rc) ) return
15b30 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
15b40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15b50 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
15b60 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
15b70 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
15b80 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
15b90 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
15ba0 74 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a  t  STMT N VALUE.
15bb0 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73  **.** Test the s
15bc0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20  qlite3_bind_int 
15bd0 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54  interface.  STMT
15be0 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73   is a prepared s
15bf0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69  tatement..** N i
15c00 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  s the index of a
15c10 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65   wildcard in the
15c20 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
15c30 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61  ent.  This comma
15c40 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 33 32  nd.** binds a 32
15c50 2d 62 69 74 20 69 6e 74 65 67 65 72 20 56 41 4c  -bit integer VAL
15c60 55 45 20 74 6f 20 74 68 61 74 20 77 69 6c 64 63  UE to that wildc
15c70 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ard..*/.static i
15c80 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74  nt test_bind_int
15c90 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
15ca0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
15cb0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
15cc0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
15cd0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
15ce0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
15cf0 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
15d00 20 69 64 78 3b 0a 20 20 69 6e 74 20 76 61 6c 75   idx;.  int valu
15d10 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  e;.  int rc;..  
15d20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
15d30 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
15d40 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
15d50 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
15d60 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
15d70 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
15d80 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
15d90 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c  0), " STMT N VAL
15da0 55 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  UE", 0);.    ret
15db0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
15dc0 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
15dd0 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
15de0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
15df0 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
15e00 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
15e10 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
15e20 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
15e30 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69  erp, objv[2], &i
15e40 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  dx) ) return TCL
15e50 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
15e60 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
15e70 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
15e80 20 26 76 61 6c 75 65 29 20 29 20 72 65 74 75 72   &value) ) retur
15e90 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
15ea0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
15eb0 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 69 64 78  d_int(pStmt, idx
15ec0 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69 66 28 20  , value);.  if( 
15ed0 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
15ee0 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54  de(interp, StmtT
15ef0 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20  oDb(pStmt), rc) 
15f00 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
15f10 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  OR;.  if( rc!=SQ
15f20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
15f30 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
15f40 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
15f50 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  CL_OK;.}.../*.**
15f60 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
15f70 33 5f 62 69 6e 64 5f 69 6e 74 36 34 20 20 53 54  3_bind_int64  ST
15f80 4d 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a  MT N VALUE.**.**
15f90 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65   Test the sqlite
15fa0 33 5f 62 69 6e 64 5f 69 6e 74 36 34 20 69 6e 74  3_bind_int64 int
15fb0 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73  erface.  STMT is
15fc0 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
15fd0 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74  ement..** N is t
15fe0 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69  he index of a wi
15ff0 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72  ldcard in the pr
16000 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
16010 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a  .  This command.
16020 2a 2a 20 62 69 6e 64 73 20 61 20 36 34 2d 62 69  ** binds a 64-bi
16030 74 20 69 6e 74 65 67 65 72 20 56 41 4c 55 45 20  t integer VALUE 
16040 74 6f 20 74 68 61 74 20 77 69 6c 64 63 61 72 64  to that wildcard
16050 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16060 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74 36 34 28  test_bind_int64(
16070 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
16080 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
16090 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
160a0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
160b0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
160c0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
160d0 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
160e0 69 64 78 3b 0a 20 20 69 36 34 20 76 61 6c 75 65  idx;.  i64 value
160f0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
16100 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
16110 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
16120 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
16130 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
16140 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
16150 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
16160 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
16170 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55  ), " STMT N VALU
16180 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  E", 0);.    retu
16190 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
161a0 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
161b0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
161c0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
161d0 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
161e0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
161f0 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
16200 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
16210 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64  rp, objv[2], &id
16220 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  x) ) return TCL_
16230 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
16240 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f  _GetWideIntFromO
16250 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
16260 33 5d 2c 20 26 76 61 6c 75 65 29 20 29 20 72 65  3], &value) ) re
16270 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
16280 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
16290 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74  bind_int64(pStmt
162a0 2c 20 69 64 78 2c 20 76 61 6c 75 65 29 3b 0a 20  , idx, value);. 
162b0 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
162c0 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
162d0 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c  StmtToDb(pStmt),
162e0 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
162f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
16300 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16310 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
16320 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  RROR;.  }..  ret
16330 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
16340 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
16350 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62  qlite3_bind_doub
16360 6c 65 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45  le  STMT N VALUE
16370 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20  .**.** Test the 
16380 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75  sqlite3_bind_dou
16390 62 6c 65 20 69 6e 74 65 72 66 61 63 65 2e 20 20  ble interface.  
163a0 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72  STMT is a prepar
163b0 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  ed statement..**
163c0 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20   N is the index 
163d0 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e  of a wildcard in
163e0 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
163f0 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63  atement.  This c
16400 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20  ommand.** binds 
16410 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  a 64-bit integer
16420 20 56 41 4c 55 45 20 74 6f 20 74 68 61 74 20 77   VALUE to that w
16430 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74  ildcard..*/.stat
16440 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
16450 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20  _double(.  void 
16460 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
16470 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
16480 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
16490 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
164a0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
164b0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
164c0 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 64  ;.  int idx;.  d
164d0 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20 69  ouble value;.  i
164e0 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63  nt rc;.  const c
164f0 68 61 72 20 2a 7a 56 61 6c 3b 0a 20 20 69 6e 74  har *zVal;.  int
16500 20 69 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   i;.  static con
16510 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
16520 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
16530 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  e;     /* Name o
16540 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 66 6c  f the special fl
16550 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
16560 75 65 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e  ue */.    unsign
16570 65 64 20 69 6e 74 20 69 55 70 70 65 72 3b 20 20  ed int iUpper;  
16580 20 2f 2a 20 55 70 70 65 72 20 33 32 20 62 69 74   /* Upper 32 bit
16590 73 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65  s */.    unsigne
165a0 64 20 69 6e 74 20 69 4c 6f 77 65 72 3b 20 20 20  d int iLower;   
165b0 2f 2a 20 4c 6f 77 65 72 20 33 32 20 62 69 74 73  /* Lower 32 bits
165c0 20 2a 2f 0a 20 20 7d 20 61 53 70 65 63 69 61 6c   */.  } aSpecial
165d0 46 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 20  Fp[] = {.    {  
165e0 22 4e 61 4e 22 2c 20 20 20 20 20 20 30 78 37 66  "NaN",      0x7f
165f0 66 66 66 66 66 66 2c 20 30 78 66 66 66 66 66 66  ffffff, 0xffffff
16600 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22 53 4e  ff },.    {  "SN
16610 61 4e 22 2c 20 20 20 20 20 30 78 37 66 66 37 66  aN",     0x7ff7f
16620 66 66 66 2c 20 30 78 66 66 66 66 66 66 66 66 20  fff, 0xffffffff 
16630 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 4e 61 4e 22  },.    {  "-NaN"
16640 2c 20 20 20 20 20 30 78 66 66 66 66 66 66 66 66  ,     0xffffffff
16650 2c 20 30 78 66 66 66 66 66 66 66 66 20 7d 2c 0a  , 0xffffffff },.
16660 20 20 20 20 7b 20 20 22 2d 53 4e 61 4e 22 2c 20      {  "-SNaN", 
16670 20 20 20 30 78 66 66 66 37 66 66 66 66 2c 20 30     0xfff7ffff, 0
16680 78 66 66 66 66 66 66 66 66 20 7d 2c 0a 20 20 20  xffffffff },.   
16690 20 7b 20 20 22 2b 49 6e 66 22 2c 20 20 20 20 20   {  "+Inf",     
166a0 30 78 37 66 66 30 30 30 30 30 2c 20 30 78 30 30  0x7ff00000, 0x00
166b0 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20  000000 },.    { 
166c0 20 22 2d 49 6e 66 22 2c 20 20 20 20 20 30 78 66   "-Inf",     0xf
166d0 66 66 30 30 30 30 30 2c 20 30 78 30 30 30 30 30  ff00000, 0x00000
166e0 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 20 22 45  000 },.    {  "E
166f0 70 73 69 6c 6f 6e 22 2c 20 20 30 78 30 30 30 30  psilon",  0x0000
16700 30 30 30 30 2c 20 30 78 30 30 30 30 30 30 30 31  0000, 0x00000001
16710 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 45 70 73   },.    {  "-Eps
16720 69 6c 6f 6e 22 2c 20 30 78 38 30 30 30 30 30 30  ilon", 0x8000000
16730 30 2c 20 30 78 30 30 30 30 30 30 30 31 20 7d 2c  0, 0x00000001 },
16740 0a 20 20 20 20 7b 20 20 22 4e 61 4e 30 22 2c 20  .    {  "NaN0", 
16750 20 20 20 20 30 78 37 66 66 38 30 30 30 30 2c 20      0x7ff80000, 
16760 30 78 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20  0x00000000 },.  
16770 20 20 7b 20 20 22 2d 4e 61 4e 30 22 2c 20 20 20    {  "-NaN0",   
16780 20 30 78 66 66 66 38 30 30 30 30 2c 20 30 78 30   0xfff80000, 0x0
16790 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 7d 3b 0a  0000000 },.  };.
167a0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29  .  if( objc!=4 )
167b0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
167c0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
167d0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
167e0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
167f0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
16800 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
16810 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20  ], 0), " STMT N 
16820 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20 20  VALUE", 0);.    
16830 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16840 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
16850 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
16860 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
16870 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
16880 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
16890 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
168a0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
168b0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
168c0 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20   &idx) ) return 
168d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a  TCL_ERROR;..  /*
168e0 20 49 6e 74 65 72 63 65 70 74 20 74 68 65 20 73   Intercept the s
168f0 74 72 69 6e 67 20 22 4e 61 4e 22 20 61 6e 64 20  tring "NaN" and 
16900 67 65 6e 65 72 61 74 65 20 61 20 4e 61 4e 20 76  generate a NaN v
16910 61 6c 75 65 20 66 6f 72 20 69 74 2e 0a 20 20 2a  alue for it..  *
16920 2a 20 41 6c 6c 20 6f 74 68 65 72 20 73 74 72 69  * All other stri
16930 6e 67 73 20 61 72 65 20 70 61 73 73 65 64 20 74  ngs are passed t
16940 68 72 6f 75 67 68 20 74 6f 20 54 63 6c 5f 47 65  hrough to Tcl_Ge
16950 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 29  tDoubleFromObj()
16960 2e 0a 20 20 2a 2a 20 54 63 6c 5f 47 65 74 44 6f  ..  ** Tcl_GetDo
16970 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 29 20 73 68  ubleFromObj() sh
16980 6f 75 6c 64 20 75 6e 64 65 72 73 74 61 6e 64 20  ould understand 
16990 22 4e 61 4e 22 20 62 75 74 20 73 6f 6d 65 20 76  "NaN" but some v
169a0 65 72 73 69 6f 6e 73 0a 20 20 2a 2a 20 63 6f 6e  ersions.  ** con
169b0 74 61 69 6e 20 61 20 62 75 67 2e 0a 20 20 2a 2f  tain a bug..  */
169c0 0a 20 20 7a 56 61 6c 20 3d 20 54 63 6c 5f 47 65  .  zVal = Tcl_Ge
169d0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29  tString(objv[3])
169e0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
169f0 69 7a 65 6f 66 28 61 53 70 65 63 69 61 6c 46 70  izeof(aSpecialFp
16a00 29 2f 73 69 7a 65 6f 66 28 61 53 70 65 63 69 61  )/sizeof(aSpecia
16a10 6c 46 70 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  lFp[0]); i++){. 
16a20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 53     if( strcmp(aS
16a30 70 65 63 69 61 6c 46 70 5b 69 5d 2e 7a 4e 61 6d  pecialFp[i].zNam
16a40 65 2c 20 7a 56 61 6c 29 3d 3d 30 20 29 7b 0a 20  e, zVal)==0 ){. 
16a50 20 20 20 20 20 73 71 6c 69 74 65 33 5f 75 69 6e       sqlite3_uin
16a60 74 36 34 20 78 3b 0a 20 20 20 20 20 20 78 20 3d  t64 x;.      x =
16a70 20 61 53 70 65 63 69 61 6c 46 70 5b 69 5d 2e 69   aSpecialFp[i].i
16a80 55 70 70 65 72 3b 0a 20 20 20 20 20 20 78 20 3c  Upper;.      x <
16a90 3c 3d 20 33 32 3b 0a 20 20 20 20 20 20 78 20 7c  <= 32;.      x |
16aa0 3d 20 61 53 70 65 63 69 61 6c 46 70 5b 69 5d 2e  = aSpecialFp[i].
16ab0 69 4c 6f 77 65 72 3b 0a 20 20 20 20 20 20 61 73  iLower;.      as
16ac0 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 61 6c  sert( sizeof(val
16ad0 75 65 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20  ue)==8 );.      
16ae0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78  assert( sizeof(x
16af0 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 6d 65  )==8 );.      me
16b00 6d 63 70 79 28 26 76 61 6c 75 65 2c 20 26 78 2c  mcpy(&value, &x,
16b10 20 38 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   8);.      break
16b20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
16b30 28 20 69 3e 3d 73 69 7a 65 6f 66 28 61 53 70 65  ( i>=sizeof(aSpe
16b40 63 69 61 6c 46 70 29 2f 73 69 7a 65 6f 66 28 61  cialFp)/sizeof(a
16b50 53 70 65 63 69 61 6c 46 70 5b 30 5d 29 20 26 26  SpecialFp[0]) &&
16b60 0a 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  .         Tcl_Ge
16b70 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 69  tDoubleFromObj(i
16b80 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
16b90 26 76 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 72  &value) ){.    r
16ba0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16bb0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
16bc0 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28  te3_bind_double(
16bd0 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75  pStmt, idx, valu
16be0 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  e);.  if( sqlite
16bf0 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
16c00 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53  erp, StmtToDb(pS
16c10 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75  tmt), rc) ) retu
16c20 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16c30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16c40 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
16c50 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
16c60 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
16c70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
16c80 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
16c90 6e 75 6c 6c 20 20 53 54 4d 54 20 4e 0a 2a 2a 0a  null  STMT N.**.
16ca0 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69  ** Test the sqli
16cb0 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 69 6e  te3_bind_null in
16cc0 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69  terface.  STMT i
16cd0 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  s a prepared sta
16ce0 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20  tement..** N is 
16cf0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77  the index of a w
16d00 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70  ildcard in the p
16d10 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
16d20 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  t.  This command
16d30 0a 2a 2a 20 62 69 6e 64 73 20 61 20 4e 55 4c 4c  .** binds a NULL
16d40 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64   to the wildcard
16d50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16d60 74 65 73 74 5f 62 69 6e 64 5f 6e 75 6c 6c 28 0a  test_bind_null(.
16d70 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
16d80 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
16d90 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
16da0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
16db0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
16dc0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
16dd0 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69   *pStmt;.  int i
16de0 64 78 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  dx;.  int rc;.. 
16df0 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
16e00 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
16e10 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
16e20 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
16e30 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
16e40 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
16e50 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
16e60 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 22 2c 20   0), " STMT N", 
16e70 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
16e80 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
16e90 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
16ea0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
16eb0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
16ec0 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
16ed0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
16ee0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
16ef0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
16f00 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29  objv[2], &idx) )
16f10 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16f20 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
16f30 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74  e3_bind_null(pSt
16f40 6d 74 2c 20 69 64 78 29 3b 0a 20 20 69 66 28 20  mt, idx);.  if( 
16f50 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
16f60 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54  de(interp, StmtT
16f70 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20  oDb(pStmt), rc) 
16f80 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
16f90 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  OR;.  if( rc!=SQ
16fa0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
16fb0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16fc0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
16fd0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
16fe0 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
16ff0 5f 62 69 6e 64 5f 74 65 78 74 20 20 53 54 4d 54  _bind_text  STMT
17000 20 4e 20 53 54 52 49 4e 47 20 42 59 54 45 53 0a   N STRING BYTES.
17010 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73  **.** Test the s
17020 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
17030 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d   interface.  STM
17040 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20  T is a prepared 
17050 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20  statement..** N 
17060 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
17070 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68  a wildcard in th
17080 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
17090 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d  ment.  This comm
170a0 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 55  and.** binds a U
170b0 54 46 2d 38 20 73 74 72 69 6e 67 20 53 54 52 49  TF-8 string STRI
170c0 4e 47 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61  NG to the wildca
170d0 72 64 2e 20 20 54 68 65 20 73 74 72 69 6e 67 20  rd.  The string 
170e0 69 73 20 42 59 54 45 53 20 62 79 74 65 73 0a 2a  is BYTES bytes.*
170f0 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  * long..*/.stati
17100 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f  c int test_bind_
17110 74 65 78 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  text(.  void * c
17120 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
17130 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
17140 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
17150 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
17160 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
17170 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
17180 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20   int idx;.  int 
17190 62 79 74 65 73 3b 0a 20 20 63 68 61 72 20 2a 76  bytes;.  char *v
171a0 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  alue;.  int rc;.
171b0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29  .  if( objc!=5 )
171c0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
171d0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
171e0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
171f0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
17200 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
17210 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
17220 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20  ], 0), " STMT N 
17230 56 41 4c 55 45 20 42 59 54 45 53 22 2c 20 30 29  VALUE BYTES", 0)
17240 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
17250 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
17260 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
17270 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
17280 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
17290 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
172a0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
172b0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
172c0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
172d0 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72  jv[2], &idx) ) r
172e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
172f0 0a 20 20 76 61 6c 75 65 20 3d 20 28 63 68 61 72  .  value = (char
17300 2a 29 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  *)Tcl_GetByteArr
17310 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33  ayFromObj(objv[3
17320 5d 2c 20 26 62 79 74 65 73 29 3b 0a 20 20 69 66  ], &bytes);.  if
17330 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
17340 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
17350 5b 34 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72  [4], &bytes) ) r
17360 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17370 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
17380 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74  _bind_text(pStmt
17390 2c 20 69 64 78 2c 20 76 61 6c 75 65 2c 20 62 79  , idx, value, by
173a0 74 65 73 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  tes, SQLITE_TRAN
173b0 53 49 45 4e 54 29 3b 0a 20 20 69 66 28 20 73 71  SIENT);.  if( sq
173c0 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
173d0 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44  (interp, StmtToD
173e0 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20  b(pStmt), rc) ) 
173f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17400 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
17410 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  TE_OK ){.    Tcl
17420 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
17430 74 65 72 70 2c 20 73 71 6c 69 74 65 33 54 65 73  terp, sqlite3Tes
17440 74 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  tErrorName(rc), 
17450 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
17460 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
17470 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
17480 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
17490 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
174a0 65 78 74 31 36 20 3f 2d 73 74 61 74 69 63 3f 20  ext16 ?-static? 
174b0 53 54 4d 54 20 4e 20 53 54 52 49 4e 47 20 42 59  STMT N STRING BY
174c0 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  TES.**.** Test t
174d0 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  he sqlite3_bind_
174e0 74 65 78 74 31 36 20 69 6e 74 65 72 66 61 63 65  text16 interface
174f0 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65  .  STMT is a pre
17500 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
17510 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64  .** N is the ind
17520 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64  ex of a wildcard
17530 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64   in the prepared
17540 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69   statement.  Thi
17550 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e  s command.** bin
17560 64 73 20 61 20 55 54 46 2d 31 36 20 73 74 72 69  ds a UTF-16 stri
17570 6e 67 20 53 54 52 49 4e 47 20 74 6f 20 74 68 65  ng STRING to the
17580 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20   wildcard.  The 
17590 73 74 72 69 6e 67 20 69 73 20 42 59 54 45 53 20  string is BYTES 
175a0 62 79 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a  bytes.** long..*
175b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
175c0 74 5f 62 69 6e 64 5f 74 65 78 74 31 36 28 0a 20  t_bind_text16(. 
175d0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
175e0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
175f0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
17600 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
17610 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
17620 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17630 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c  OMIT_UTF16.  sql
17640 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
17650 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69  ;.  int idx;.  i
17660 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 68 61 72  nt bytes;.  char
17670 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72   *value;.  int r
17680 63 3b 0a 0a 20 20 76 6f 69 64 20 28 2a 78 44 65  c;..  void (*xDe
17690 6c 29 28 29 20 3d 20 28 6f 62 6a 63 3d 3d 36 3f  l)() = (objc==6?
176a0 53 51 4c 49 54 45 5f 53 54 41 54 49 43 3a 53 51  SQLITE_STATIC:SQ
176b0 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
176c0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 53 74 6d  .  Tcl_Obj *oStm
176d0 74 20 20 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63  t    = objv[objc
176e0 2d 34 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  -4];.  Tcl_Obj *
176f0 6f 4e 20 20 20 20 20 20 20 3d 20 6f 62 6a 76 5b  oN       = objv[
17700 6f 62 6a 63 2d 33 5d 3b 0a 20 20 54 63 6c 5f 4f  objc-3];.  Tcl_O
17710 62 6a 20 2a 6f 53 74 72 69 6e 67 20 20 3d 20 6f  bj *oString  = o
17720 62 6a 76 5b 6f 62 6a 63 2d 32 5d 3b 0a 20 20 54  bjv[objc-2];.  T
17730 63 6c 5f 4f 62 6a 20 2a 6f 42 79 74 65 73 20 20  cl_Obj *oBytes  
17740 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b   = objv[objc-1];
17750 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20  ..  if( objc!=5 
17760 26 26 20 6f 62 6a 63 21 3d 36 29 7b 0a 20 20 20  && objc!=6){.   
17770 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
17780 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
17790 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
177a0 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
177b0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
177c0 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
177d0 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45  , " STMT N VALUE
177e0 20 42 59 54 45 53 22 2c 20 30 29 3b 0a 20 20 20   BYTES", 0);.   
177f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17800 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
17810 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
17820 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
17830 6e 67 28 6f 53 74 6d 74 29 2c 20 26 70 53 74 6d  ng(oStmt), &pStm
17840 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
17850 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
17860 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
17870 6e 74 65 72 70 2c 20 6f 4e 2c 20 26 69 64 78 29  nterp, oN, &idx)
17880 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
17890 52 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d 20 28  ROR;.  value = (
178a0 63 68 61 72 2a 29 54 63 6c 5f 47 65 74 42 79 74  char*)Tcl_GetByt
178b0 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 53  eArrayFromObj(oS
178c0 74 72 69 6e 67 2c 20 30 29 3b 0a 20 20 69 66 28  tring, 0);.  if(
178d0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
178e0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 42 79 74 65  bj(interp, oByte
178f0 73 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74  s, &bytes) ) ret
17900 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
17910 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
17920 69 6e 64 5f 74 65 78 74 31 36 28 70 53 74 6d 74  ind_text16(pStmt
17930 2c 20 69 64 78 2c 20 28 76 6f 69 64 20 2a 29 76  , idx, (void *)v
17940 61 6c 75 65 2c 20 62 79 74 65 73 2c 20 78 44 65  alue, bytes, xDe
17950 6c 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  l);.  if( sqlite
17960 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
17970 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53  erp, StmtToDb(pS
17980 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75  tmt), rc) ) retu
17990 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
179a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
179b0 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  K ){.    Tcl_App
179c0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
179d0 2c 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  , sqlite3TestErr
179e0 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a  orName(rc), 0);.
179f0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
17a00 52 52 4f 52 3b 0a 20 20 7d 0a 0a 23 65 6e 64 69  RROR;.  }..#endi
17a10 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
17a20 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75  _UTF16 */.  retu
17a30 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
17a40 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
17a50 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 20 3f  ite3_bind_blob ?
17a60 2d 73 74 61 74 69 63 3f 20 53 54 4d 54 20 4e 20  -static? STMT N 
17a70 44 41 54 41 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a  DATA BYTES.**.**
17a80 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65   Test the sqlite
17a90 33 5f 62 69 6e 64 5f 62 6c 6f 62 20 69 6e 74 65  3_bind_blob inte
17aa0 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20  rface.  STMT is 
17ab0 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
17ac0 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68  ment..** N is th
17ad0 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c  e index of a wil
17ae0 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65  dcard in the pre
17af0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
17b00 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a    This command.*
17b10 2a 20 62 69 6e 64 73 20 61 20 42 4c 4f 42 20 74  * binds a BLOB t
17b20 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e 20  o the wildcard. 
17b30 20 54 68 65 20 42 4c 4f 42 20 69 73 20 42 59 54   The BLOB is BYT
17b40 45 53 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ES bytes in size
17b50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17b60 74 65 73 74 5f 62 69 6e 64 5f 62 6c 6f 62 28 0a  test_bind_blob(.
17b70 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
17b80 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
17b90 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
17ba0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
17bb0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
17bc0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
17bd0 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69   *pStmt;.  int i
17be0 64 78 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b  dx;.  int bytes;
17bf0 0a 20 20 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a  .  char *value;.
17c00 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
17c10 74 65 33 5f 64 65 73 74 72 75 63 74 6f 72 5f 74  te3_destructor_t
17c20 79 70 65 20 78 44 65 73 74 72 75 63 74 6f 72 20  ype xDestructor 
17c30 3d 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  = SQLITE_TRANSIE
17c40 4e 54 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  NT;..  if( objc!
17c50 3d 35 20 26 26 20 6f 62 6a 63 21 3d 36 20 29 7b  =5 && objc!=6 ){
17c60 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
17c70 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
17c80 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
17c90 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
17ca0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
17cb0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
17cc0 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 44  , 0), " STMT N D
17cd0 41 54 41 20 42 59 54 45 53 22 2c 20 30 29 3b 0a  ATA BYTES", 0);.
17ce0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
17cf0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
17d00 20 6f 62 6a 63 3d 3d 36 20 29 7b 0a 20 20 20 20   objc==6 ){.    
17d10 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 53 51  xDestructor = SQ
17d20 4c 49 54 45 5f 53 54 41 54 49 43 3b 0a 20 20 20  LITE_STATIC;.   
17d30 20 6f 62 6a 76 2b 2b 3b 0a 20 20 7d 0a 0a 20 20   objv++;.  }..  
17d40 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
17d50 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
17d60 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
17d70 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
17d80 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17d90 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
17da0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
17db0 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  bjv[2], &idx) ) 
17dc0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17dd0 3b 0a 20 20 76 61 6c 75 65 20 3d 20 54 63 6c 5f  ;.  value = Tcl_
17de0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33  GetString(objv[3
17df0 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  ]);.  if( Tcl_Ge
17e00 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
17e10 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79  rp, objv[4], &by
17e20 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43  tes) ) return TC
17e30 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
17e40 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
17e50 6f 62 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76  ob(pStmt, idx, v
17e60 61 6c 75 65 2c 20 62 79 74 65 73 2c 20 78 44 65  alue, bytes, xDe
17e70 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 69 66 28  structor);.  if(
17e80 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
17e90 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74  ode(interp, Stmt
17ea0 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29  ToDb(pStmt), rc)
17eb0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
17ec0 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ROR;.  if( rc!=S
17ed0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17ee0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17ef0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
17f00 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
17f10 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
17f20 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
17f30 5f 63 6f 75 6e 74 20 20 53 54 4d 54 0a 2a 2a 0a  _count  STMT.**.
17f40 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
17f50 6d 62 65 72 20 6f 66 20 77 69 6c 64 63 61 72 64  mber of wildcard
17f60 73 20 69 6e 20 74 68 65 20 67 69 76 65 6e 20 73  s in the given s
17f70 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  tatement..*/.sta
17f80 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
17f90 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e  d_parameter_coun
17fa0 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
17fb0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
17fc0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
17fd0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
17fe0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
17ff0 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
18000 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69  tmt *pStmt;..  i
18010 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
18020 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
18030 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
18040 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20  jv, "STMT");.   
18050 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
18060 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
18070 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
18080 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
18090 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
180a0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
180b0 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65  _ERROR;.  Tcl_Se
180c0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
180d0 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
180e0 28 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61  (sqlite3_bind_pa
180f0 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53  rameter_count(pS
18100 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  tmt)));.  return
18110 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
18120 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
18130 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
18140 72 5f 6e 61 6d 65 20 20 53 54 4d 54 20 20 4e 0a  r_name  STMT  N.
18150 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
18160 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4e 74 68   name of the Nth
18170 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20   wildcard.  The 
18180 66 69 72 73 74 20 77 69 6c 64 63 61 72 64 20 69  first wildcard i
18190 73 20 31 2e 0a 2a 2a 20 41 6e 20 65 6d 70 74 79  s 1..** An empty
181a0 20 73 74 72 69 6e 67 20 69 73 20 72 65 74 75 72   string is retur
181b0 6e 65 64 20 69 66 20 4e 20 69 73 20 6f 75 74 20  ned if N is out 
181c0 6f 66 20 72 61 6e 67 65 20 6f 72 20 69 66 20 74  of range or if t
181d0 68 65 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69  he wildcard.** i
181e0 73 20 6e 61 6d 65 6c 65 73 73 2e 0a 2a 2f 0a 73  s nameless..*/.s
181f0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
18200 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61  ind_parameter_na
18210 6d 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  me(.  void * cli
18220 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
18230 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
18240 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
18250 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
18260 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
18270 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
18280 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  nt i;..  if( obj
18290 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
182a0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
182b0 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
182c0 54 4d 54 20 4e 22 29 3b 0a 20 20 20 20 72 65 74  TMT N");.    ret
182d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
182e0 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74   }.  if( getStmt
182f0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
18300 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
18310 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
18320 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
18330 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
18340 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
18350 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 29  rp, objv[2], &i)
18360 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
18370 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ROR;.  Tcl_SetOb
18380 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
18390 0a 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  .     Tcl_NewStr
183a0 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f 62  ingObj(sqlite3_b
183b0 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61  ind_parameter_na
183c0 6d 65 28 70 53 74 6d 74 2c 69 29 2c 2d 31 29 0a  me(pStmt,i),-1).
183d0 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43    );.  return TC
183e0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
183f0 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
18400 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69  bind_parameter_i
18410 6e 64 65 78 20 20 53 54 4d 54 20 20 4e 41 4d 45  ndex  STMT  NAME
18420 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
18430 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 77  e index of the w
18440 69 6c 64 63 61 72 64 20 63 61 6c 6c 65 64 20 4e  ildcard called N
18450 41 4d 45 2e 20 20 52 65 74 75 72 6e 20 30 20 69  AME.  Return 0 i
18460 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f  f there is.** no
18470 20 73 75 63 68 20 77 69 6c 64 63 61 72 64 2e 0a   such wildcard..
18480 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
18490 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  st_bind_paramete
184a0 72 5f 69 6e 64 65 78 28 0a 20 20 76 6f 69 64 20  r_index(.  void 
184b0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
184c0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
184d0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
184e0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
184f0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
18500 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
18510 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
18520 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
18530 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
18540 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20   1, objv, "STMT 
18550 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75  NAME");.    retu
18560 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
18570 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
18580 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
18590 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
185a0 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
185b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
185c0 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  R;.  Tcl_SetObjR
185d0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20  esult(interp, . 
185e0 20 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62      Tcl_NewIntOb
185f0 6a 28 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65  j(.       sqlite
18600 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
18610 5f 69 6e 64 65 78 28 70 53 74 6d 74 2c 54 63 6c  _index(pStmt,Tcl
18620 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
18630 32 5d 29 29 0a 20 20 20 20 20 29 0a 20 20 29 3b  2])).     ).  );
18640 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
18650 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
18660 3a 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 65 61  :   sqlite3_clea
18670 72 5f 62 69 6e 64 69 6e 67 73 20 53 54 4d 54 0a  r_bindings STMT.
18680 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  **.*/.static int
18690 20 74 65 73 74 5f 63 6c 65 61 72 5f 62 69 6e 64   test_clear_bind
186a0 69 6e 67 73 28 0a 20 20 76 6f 69 64 20 2a 20 63  ings(.  void * c
186b0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
186c0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
186d0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
186e0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
186f0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
18700 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a  3_stmt *pStmt;..
18710 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
18720 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
18730 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
18740 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a   objv, "STMT");.
18750 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
18760 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
18770 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
18780 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
18790 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
187a0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
187b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c  TCL_ERROR;.  Tcl
187c0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
187d0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
187e0 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6c 65 61  Obj(sqlite3_clea
187f0 72 5f 62 69 6e 64 69 6e 67 73 28 70 53 74 6d 74  r_bindings(pStmt
18800 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )));.  return TC
18810 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
18820 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
18830 73 6c 65 65 70 20 4d 49 4c 4c 49 53 45 43 4f 4e  sleep MILLISECON
18840 44 53 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  DS.*/.static int
18850 20 74 65 73 74 5f 73 6c 65 65 70 28 0a 20 20 76   test_sleep(.  v
18860 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
18870 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
18880 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
18890 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
188a0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
188b0 20 69 6e 74 20 6d 73 3b 0a 0a 20 20 69 66 28 20   int ms;..  if( 
188c0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
188d0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
188e0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
188f0 20 22 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 22 29   "MILLISECONDS")
18900 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
18910 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
18920 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
18930 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
18940 5b 31 5d 2c 20 26 6d 73 29 20 29 7b 0a 20 20 20  [1], &ms) ){.   
18950 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
18960 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74  R;.  }.  Tcl_Set
18970 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
18980 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
18990 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 6d 73  sqlite3_sleep(ms
189a0 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )));.  return TC
189b0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
189c0 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 78  sage: sqlite3_ex
189d0 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 20 44  tended_errcode D
189e0 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  B.**.** Return t
189f0 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  he string repres
18a00 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
18a10 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69  most recent sqli
18a20 74 65 33 5f 2a 20 41 50 49 0a 2a 2a 20 65 72 72  te3_* API.** err
18a30 6f 72 20 63 6f 64 65 2e 20 65 2e 67 2e 20 22 53  or code. e.g. "S
18a40 51 4c 49 54 45 5f 45 52 52 4f 52 22 2e 0a 2a 2f  QLITE_ERROR"..*/
18a50 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
18a60 5f 65 78 5f 65 72 72 63 6f 64 65 28 0a 20 20 76  _ex_errcode(.  v
18a70 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
18a80 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
18a90 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
18aa0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
18ab0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
18ac0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
18ad0 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
18ae0 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
18af0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
18b00 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
18b10 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
18b20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
18b30 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
18b40 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a  0]), " DB", 0);.
18b50 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
18b60 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
18b70 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
18b80 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
18b90 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
18ba0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
18bb0 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
18bc0 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72  ite3_extended_er
18bd0 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 54 63 6c  rcode(db);.  Tcl
18be0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
18bf0 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
18c00 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30  ErrorName(rc), 0
18c10 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
18c20 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73  OK;.}.../*.** Us
18c30 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 72 72  age: sqlite3_err
18c40 63 6f 64 65 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65  code DB.**.** Re
18c50 74 75 72 6e 20 74 68 65 20 73 74 72 69 6e 67 20  turn the string 
18c60 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
18c70 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
18c80 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 0a  t sqlite3_* API.
18c90 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 65  ** error code. e
18ca0 2e 67 2e 20 22 53 51 4c 49 54 45 5f 45 52 52 4f  .g. "SQLITE_ERRO
18cb0 52 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  R"..*/.static in
18cc0 74 20 74 65 73 74 5f 65 72 72 63 6f 64 65 28 0a  t test_errcode(.
18cd0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
18ce0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
18cf0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
18d00 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
18d10 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
18d20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
18d30 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
18d40 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
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 22 77 72 6f 6e 67  t(interp, "wrong
18d70 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
18d80 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
18d90 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
18da0 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30  jv[0]), " DB", 0
18db0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
18dc0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
18dd0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
18de0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
18df0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
18e00 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
18e10 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
18e20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
18e30 64 62 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  db);.  Tcl_Appen
18e40 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
18e50 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
18e60 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72  ame(rc), 0);.  r
18e70 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
18e80 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
18e90 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 20 44  sqlite3_errmsg D
18ea0 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  B.**.** Returns 
18eb0 74 68 65 20 55 54 46 2d 38 20 72 65 70 72 65 73  the UTF-8 repres
18ec0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
18ed0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74  error message st
18ee0 72 69 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ring for the.** 
18ef0 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69  most recent sqli
18f00 74 65 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e 0a  te3_* API call..
18f10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
18f20 73 74 5f 65 72 72 6d 73 67 28 0a 20 20 76 6f 69  st_errmsg(.  voi
18f30 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
18f40 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
18f50 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
18f60 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
18f70 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
18f80 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
18f90 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a  nst char *zErr;.
18fa0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
18fb0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
18fc0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
18fd0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
18fe0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
18ff0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
19000 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44  ng(objv[0]), " D
19010 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
19020 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
19030 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
19040 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
19050 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
19060 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
19070 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
19080 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f   zErr = sqlite3_
19090 65 72 72 6d 73 67 28 64 62 29 3b 0a 20 20 54 63  errmsg(db);.  Tc
190a0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
190b0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
190c0 72 69 6e 67 4f 62 6a 28 7a 45 72 72 2c 20 2d 31  ringObj(zErr, -1
190d0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
190e0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
190f0 61 67 65 3a 20 20 20 74 65 73 74 5f 65 72 72 6d  age:   test_errm
19100 73 67 31 36 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65  sg16 DB.**.** Re
19110 74 75 72 6e 73 20 74 68 65 20 55 54 46 2d 31 36  turns the UTF-16
19120 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
19130 6f 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  of the error mes
19140 73 61 67 65 20 73 74 72 69 6e 67 20 66 6f 72 20  sage string for 
19150 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65  the.** most rece
19160 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49  nt sqlite3_* API
19170 20 63 61 6c 6c 2e 20 54 68 69 73 20 69 73 20 61   call. This is a
19180 20 62 79 74 65 20 61 72 72 61 79 20 6f 62 6a 65   byte array obje
19190 63 74 20 61 74 20 74 68 65 20 54 43 4c 20 0a 2a  ct at the TCL .*
191a0 2a 20 6c 65 76 65 6c 2c 20 61 6e 64 20 69 74 20  * level, and it 
191b0 69 6e 63 6c 75 64 65 73 20 74 68 65 20 30 78 30  includes the 0x0
191c0 30 20 30 78 30 30 20 74 65 72 6d 69 6e 61 74 6f  0 0x00 terminato
191d0 72 20 62 79 74 65 73 20 61 74 20 74 68 65 20 65  r bytes at the e
191e0 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 55 54 46  nd of the.** UTF
191f0 2d 31 36 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  -16 string..*/.s
19200 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65  tatic int test_e
19210 72 72 6d 73 67 31 36 28 0a 20 20 76 6f 69 64 20  rrmsg16(.  void 
19220 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
19230 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
19240 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
19250 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
19260 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64   objv[].){.#ifnd
19270 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
19280 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33 20 2a  TF16.  sqlite3 *
19290 64 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  db;.  const void
192a0 20 2a 7a 45 72 72 3b 0a 20 20 63 6f 6e 73 74 20   *zErr;.  const 
192b0 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 62  char *z;.  int b
192c0 79 74 65 73 20 3d 20 30 3b 0a 0a 20 20 69 66 28  ytes = 0;..  if(
192d0 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
192e0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
192f0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
19300 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
19310 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
19320 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
19330 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29  v[0]), " DB", 0)
19340 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
19350 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
19360 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
19370 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
19380 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
19390 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
193a0 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20  _ERROR;..  zErr 
193b0 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  = sqlite3_errmsg
193c0 31 36 28 64 62 29 3b 0a 20 20 69 66 28 20 7a 45  16(db);.  if( zE
193d0 72 72 20 29 7b 0a 20 20 20 20 7a 20 3d 20 7a 45  rr ){.    z = zE
193e0 72 72 3b 0a 20 20 20 20 66 6f 72 28 62 79 74 65  rr;.    for(byte
193f0 73 3d 30 3b 20 7a 5b 62 79 74 65 73 5d 20 7c 7c  s=0; z[bytes] ||
19400 20 7a 5b 62 79 74 65 73 2b 31 5d 3b 20 62 79 74   z[bytes+1]; byt
19410 65 73 2b 3d 32 29 7b 7d 0a 20 20 7d 0a 20 20 54  es+=2){}.  }.  T
19420 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
19430 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
19440 79 74 65 41 72 72 61 79 4f 62 6a 28 7a 45 72 72  yteArrayObj(zErr
19450 2c 20 62 79 74 65 73 29 29 3b 0a 23 65 6e 64 69  , bytes));.#endi
19460 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
19470 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75  _UTF16 */.  retu
19480 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
19490 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
194a0 65 33 5f 70 72 65 70 61 72 65 20 44 42 20 73 71  e3_prepare DB sq
194b0 6c 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72  l bytes ?tailvar
194c0 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20  ?.**.** Compile 
194d0 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79  up to <bytes> by
194e0 74 65 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c  tes of the suppl
194f0 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c  ied SQL string <
19500 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61  sql> using.** da
19510 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44  tabase handle <D
19520 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65  B>. The paramete
19530 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74  r <tailval> is t
19540 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f  he name of a glo
19550 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  bal.** variable 
19560 74 68 61 74 20 69 73 20 73 65 74 20 74 6f 20 74  that is set to t
19570 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f  he unused portio
19580 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61  n of <sql> (if a
19590 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68  ny). A.** STMT h
195a0 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65  andle is returne
195b0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
195c0 20 74 65 73 74 5f 70 72 65 70 61 72 65 28 0a 20   test_prepare(. 
195d0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
195e0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
195f0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
19600 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
19610 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
19620 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
19630 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
19640 71 6c 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b  ql;.  int bytes;
19650 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
19660 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Tail = 0;.  sqli
19670 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
19680 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  = 0;.  char zBuf
19690 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  [50];.  int rc;.
196a0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26  .  if( objc!=5 &
196b0 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  & objc!=4 ){.   
196c0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
196d0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
196e0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
196f0 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
19700 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
19710 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c  jv[0]), " DB sql
19720 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f   bytes ?tailvar?
19730 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
19740 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
19750 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
19760 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
19770 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
19780 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
19790 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
197a0 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Sql = Tcl_GetStr
197b0 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
197c0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
197d0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
197e0 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29  jv[3], &bytes) )
197f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19800 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
19810 65 33 5f 70 72 65 70 61 72 65 28 64 62 2c 20 7a  e3_prepare(db, z
19820 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74  Sql, bytes, &pSt
19830 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a  mt, objc>=5 ? &z
19840 54 61 69 6c 20 3a 20 30 29 3b 0a 20 20 54 63 6c  Tail : 0);.  Tcl
19850 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
19860 65 72 70 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  erp);.  if( sqli
19870 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
19880 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
19890 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
198a0 52 3b 0a 20 20 69 66 28 20 7a 54 61 69 6c 20 26  R;.  if( zTail &
198b0 26 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20  & objc>=5 ){.   
198c0 20 69 66 28 20 62 79 74 65 73 3e 3d 30 20 29 7b   if( bytes>=0 ){
198d0 0a 20 20 20 20 20 20 62 79 74 65 73 20 3d 20 62  .      bytes = b
198e0 79 74 65 73 20 2d 20 28 7a 54 61 69 6c 2d 7a 53  ytes - (zTail-zS
198f0 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ql);.    }.    i
19900 66 28 20 73 74 72 6c 65 6e 28 7a 54 61 69 6c 29  f( strlen(zTail)
19910 3c 62 79 74 65 73 20 29 7b 0a 20 20 20 20 20 20  <bytes ){.      
19920 62 79 74 65 73 20 3d 20 73 74 72 6c 65 6e 28 7a  bytes = strlen(z
19930 54 61 69 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Tail);.    }.   
19940 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
19950 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
19960 20 30 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e   0, Tcl_NewStrin
19970 67 4f 62 6a 28 7a 54 61 69 6c 2c 20 62 79 74 65  gObj(zTail, byte
19980 73 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  s), 0);.  }.  if
19990 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
199a0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
199b0 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73  Stmt==0 );.    s
199c0 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 28 25  printf(zBuf, "(%
199d0 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54  d) ", rc);.    T
199e0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
199f0 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71  interp, zBuf, sq
19a00 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
19a10 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
19a20 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
19a30 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a  .  if( pStmt ){.
19a40 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54      if( sqlite3T
19a50 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
19a60 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  r(interp, zBuf, 
19a70 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
19a80 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54  TCL_ERROR;.    T
19a90 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
19aa0 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
19ab0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
19ac0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
19ad0 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70  Usage: sqlite3_p
19ae0 72 65 70 61 72 65 5f 76 32 20 44 42 20 73 71 6c  repare_v2 DB sql
19af0 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f   bytes ?tailvar?
19b00 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75  .**.** Compile u
19b10 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74  p to <bytes> byt
19b20 65 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69  es of the suppli
19b30 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73  ed SQL string <s
19b40 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74  ql> using.** dat
19b50 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42  abase handle <DB
19b60 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  >. The parameter
19b70 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68   <tailval> is th
19b80 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62  e name of a glob
19b90 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74  al.** variable t
19ba0 68 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  hat is set to th
19bb0 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e  e unused portion
19bc0 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e   of <sql> (if an
19bd0 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61  y). A.** STMT ha
19be0 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64  ndle is returned
19bf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19c00 74 65 73 74 5f 70 72 65 70 61 72 65 5f 76 32 28  test_prepare_v2(
19c10 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
19c20 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
19c30 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
19c40 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
19c50 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
19c60 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
19c70 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
19c80 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 62 79 74 65  zSql;.  int byte
19c90 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  s;.  const char 
19ca0 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71  *zTail = 0;.  sq
19cb0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
19cc0 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42  t = 0;.  char zB
19cd0 75 66 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63  uf[50];.  int rc
19ce0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35  ;..  if( objc!=5
19cf0 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20   && objc!=4 ){. 
19d00 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
19d10 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
19d20 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
19d30 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
19d40 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
19d50 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73  objv[0]), " DB s
19d60 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61 72  ql bytes tailvar
19d70 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
19d80 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
19d90 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
19da0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
19db0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
19dc0 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
19dd0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
19de0 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Sql = Tcl_GetStr
19df0 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
19e00 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
19e10 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
19e20 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29  jv[3], &bytes) )
19e30 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19e40 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
19e50 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
19e60 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26  , zSql, bytes, &
19e70 70 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f  pStmt, objc>=5 ?
19e80 20 26 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20 20   &zTail : 0);.  
19e90 61 73 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54  assert(rc==SQLIT
19ea0 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d 30  E_OK || pStmt==0
19eb0 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65  );.  Tcl_ResetRe
19ec0 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
19ed0 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
19ee0 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
19ef0 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
19f00 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
19f10 20 7a 54 61 69 6c 20 26 26 20 6f 62 6a 63 3e 3d   zTail && objc>=
19f20 35 20 29 7b 0a 20 20 20 20 69 66 28 20 62 79 74  5 ){.    if( byt
19f30 65 73 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 62  es>=0 ){.      b
19f40 79 74 65 73 20 3d 20 62 79 74 65 73 20 2d 20 28  ytes = bytes - (
19f50 7a 54 61 69 6c 2d 7a 53 71 6c 29 3b 0a 20 20 20  zTail-zSql);.   
19f60 20 7d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65   }.    Tcl_ObjSe
19f70 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f 62  tVar2(interp, ob
19f80 6a 76 5b 34 5d 2c 20 30 2c 20 54 63 6c 5f 4e 65  jv[4], 0, Tcl_Ne
19f90 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 61 69 6c  wStringObj(zTail
19fa0 2c 20 62 79 74 65 73 29 2c 20 30 29 3b 0a 20 20  , bytes), 0);.  
19fb0 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
19fc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
19fd0 65 72 74 28 20 70 53 74 6d 74 3d 3d 30 20 29 3b  ert( pStmt==0 );
19fe0 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
19ff0 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b  f, "(%d) ", rc);
1a000 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1a010 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
1a020 75 66 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  uf, sqlite3_errm
1a030 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20  sg(db), 0);.    
1a040 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1a050 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74  ;.  }..  if( pSt
1a060 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  mt ){.    if( sq
1a070 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
1a080 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
1a090 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72  zBuf, pStmt) ) r
1a0a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1a0b0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1a0c0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
1a0d0 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  uf, 0);.  }.  re
1a0e0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1a0f0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1a100 69 74 65 33 5f 70 72 65 70 61 72 65 5f 74 6b 74  ite3_prepare_tkt
1a110 33 31 33 34 20 44 42 0a 2a 2a 0a 2a 2a 20 47 65  3134 DB.**.** Ge
1a120 6e 65 72 61 74 65 20 61 20 70 72 65 70 61 72 65  nerate a prepare
1a130 64 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20  d statement for 
1a140 61 20 7a 65 72 6f 2d 62 79 74 65 20 73 74 72 69  a zero-byte stri
1a150 6e 67 20 61 73 20 61 20 74 65 73 74 0a 2a 2a 20  ng as a test.** 
1a160 66 6f 72 20 74 69 63 6b 65 74 20 23 33 31 33 34  for ticket #3134
1a170 2e 20 20 54 68 65 20 73 74 72 69 6e 67 20 73 68  .  The string sh
1a180 6f 75 6c 64 20 62 65 20 70 72 65 63 65 65 64 65  ould be preceede
1a190 64 20 62 79 20 61 20 7a 65 72 6f 20 62 79 74 65  d by a zero byte
1a1a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a1b0 74 65 73 74 5f 70 72 65 70 61 72 65 5f 74 6b 74  test_prepare_tkt
1a1c0 33 31 33 34 28 0a 20 20 76 6f 69 64 20 2a 20 63  3134(.  void * c
1a1d0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1a1e0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1a1f0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1a200 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1a210 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
1a220 33 20 2a 64 62 3b 0a 20 20 73 74 61 74 69 63 20  3 *db;.  static 
1a230 63 6f 6e 73 74 20 63 68 61 72 20 7a 53 71 6c 5b  const char zSql[
1a240 5d 20 3d 20 22 5c 30 30 30 53 45 4c 45 43 54 20  ] = "\000SELECT 
1a250 31 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  1";.  sqlite3_st
1a260 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
1a270 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
1a280 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
1a290 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
1a2a0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1a2b0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1a2c0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1a2d0 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
1a2e0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1a2f0 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20  v[0]), " DB sql 
1a300 62 79 74 65 73 20 74 61 69 6c 76 61 72 22 2c 20  bytes tailvar", 
1a310 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1a320 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1a330 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
1a340 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1a350 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1a360 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
1a370 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
1a380 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
1a390 5f 76 32 28 64 62 2c 20 26 7a 53 71 6c 5b 31 5d  _v2(db, &zSql[1]
1a3a0 2c 20 30 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b  , 0, &pStmt, 0);
1a3b0 0a 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51  .  assert(rc==SQ
1a3c0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74  LITE_OK || pStmt
1a3d0 3d 3d 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  ==0);.  if( sqli
1a3e0 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
1a3f0 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
1a400 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1a410 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  R;.  if( rc!=SQL
1a420 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
1a430 73 65 72 74 28 20 70 53 74 6d 74 3d 3d 30 20 29  sert( pStmt==0 )
1a440 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42  ;.    sprintf(zB
1a450 75 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29  uf, "(%d) ", rc)
1a460 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
1a470 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
1a480 42 75 66 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  Buf, sqlite3_err
1a490 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20  msg(db), 0);.   
1a4a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1a4b0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53  R;.  }..  if( pS
1a4c0 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73  tmt ){.    if( s
1a4d0 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f  qlite3TestMakePo
1a4e0 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c  interStr(interp,
1a4f0 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20   zBuf, pStmt) ) 
1a500 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1a510 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
1a520 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
1a530 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Buf, 0);.  }.  r
1a540 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1a550 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1a560 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 20  lite3_prepare16 
1a570 44 42 20 73 71 6c 20 62 79 74 65 73 20 74 61 69  DB sql bytes tai
1a580 6c 76 61 72 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69  lvar.**.** Compi
1a590 6c 65 20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e  le up to <bytes>
1a5a0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 73 75   bytes of the su
1a5b0 70 70 6c 69 65 64 20 53 51 4c 20 73 74 72 69 6e  pplied SQL strin
1a5c0 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a  g <sql> using.**
1a5d0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
1a5e0 20 3c 44 42 3e 2e 20 54 68 65 20 70 61 72 61 6d   <DB>. The param
1a5f0 65 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69  eter <tailval> i
1a600 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
1a610 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62  global.** variab
1a620 6c 65 20 74 68 61 74 20 69 73 20 73 65 74 20 74  le that is set t
1a630 6f 20 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72  o the unused por
1a640 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69  tion of <sql> (i
1a650 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d  f any). A.** STM
1a660 54 20 68 61 6e 64 6c 65 20 69 73 20 72 65 74 75  T handle is retu
1a670 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1a680 69 6e 74 20 74 65 73 74 5f 70 72 65 70 61 72 65  int test_prepare
1a690 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  16(.  void * cli
1a6a0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1a6b0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1a6c0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1a6d0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1a6e0 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  [].){.#ifndef SQ
1a6f0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
1a700 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1a710 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71   const void *zSq
1a720 6c 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  l;.  const void 
1a730 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 54 63  *zTail = 0;.  Tc
1a740 6c 5f 4f 62 6a 20 2a 70 54 61 69 6c 20 3d 20 30  l_Obj *pTail = 0
1a750 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
1a760 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63   *pStmt = 0;.  c
1a770 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 20 0a 20  har zBuf[50]; . 
1a780 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62   int rc;.  int b
1a790 79 74 65 73 3b 20 20 20 20 20 20 20 20 20 20 20  ytes;           
1a7a0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65       /* The inte
1a7b0 67 65 72 20 73 70 65 63 69 66 69 65 64 20 61 73  ger specified as
1a7c0 20 61 72 67 20 33 20 2a 2f 0a 20 20 69 6e 74 20   arg 3 */.  int 
1a7d0 6f 62 6a 6c 65 6e 3b 20 20 20 20 20 20 20 20 20  objlen;         
1a7e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74        /* The byt
1a7f0 65 2d 61 72 72 61 79 20 6c 65 6e 67 74 68 20 6f  e-array length o
1a800 66 20 61 72 67 20 32 20 2a 2f 0a 0a 20 20 69 66  f arg 2 */..  if
1a810 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a  ( objc!=5 && obj
1a820 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
1a830 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1a840 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1a850 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1a860 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
1a870 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
1a880 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74 65  ), " DB sql byte
1a890 73 20 3f 74 61 69 6c 76 61 72 3f 22 2c 20 30 29  s ?tailvar?", 0)
1a8a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1a8b0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
1a8c0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
1a8d0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1a8e0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1a8f0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
1a900 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d  _ERROR;.  zSql =
1a910 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
1a920 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  yFromObj(objv[2]
1a930 2c 20 26 6f 62 6a 6c 65 6e 29 3b 0a 20 20 69 66  , &objlen);.  if
1a940 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
1a950 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
1a960 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72  [3], &bytes) ) r
1a970 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1a980 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
1a990 5f 70 72 65 70 61 72 65 31 36 28 64 62 2c 20 7a  _prepare16(db, z
1a9a0 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74  Sql, bytes, &pSt
1a9b0 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a  mt, objc>=5 ? &z
1a9c0 54 61 69 6c 20 3a 20 30 29 3b 0a 20 20 69 66 28  Tail : 0);.  if(
1a9d0 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
1a9e0 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20  ode(interp, db, 
1a9f0 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
1aa00 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
1aa10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
1aa20 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1aa30 20 69 66 28 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a   if( objc>=5 ){.
1aa40 20 20 20 20 69 66 28 20 7a 54 61 69 6c 20 29 7b      if( zTail ){
1aa50 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20  .      objlen = 
1aa60 6f 62 6a 6c 65 6e 20 2d 20 28 28 75 38 20 2a 29  objlen - ((u8 *)
1aa70 7a 54 61 69 6c 2d 28 75 38 20 2a 29 7a 53 71 6c  zTail-(u8 *)zSql
1aa80 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1aa90 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 30 3b 0a      objlen = 0;.
1aaa0 20 20 20 20 7d 0a 20 20 20 20 70 54 61 69 6c 20      }.    pTail 
1aab0 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  = Tcl_NewByteArr
1aac0 61 79 4f 62 6a 28 28 75 38 20 2a 29 7a 54 61 69  ayObj((u8 *)zTai
1aad0 6c 2c 20 6f 62 6a 6c 65 6e 29 3b 0a 20 20 20 20  l, objlen);.    
1aae0 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
1aaf0 28 70 54 61 69 6c 29 3b 0a 20 20 20 20 54 63 6c  (pTail);.    Tcl
1ab00 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65  _ObjSetVar2(inte
1ab10 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20  rp, objv[4], 0, 
1ab20 70 54 61 69 6c 2c 20 30 29 3b 0a 20 20 20 20 54  pTail, 0);.    T
1ab30 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
1ab40 70 54 61 69 6c 29 3b 0a 20 20 7d 0a 0a 20 20 69  pTail);.  }..  i
1ab50 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  f( pStmt ){.    
1ab60 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d  if( sqlite3TestM
1ab70 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e  akePointerStr(in
1ab80 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d  terp, zBuf, pStm
1ab90 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
1aba0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c  ERROR;.  }.  Tcl
1abb0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1abc0 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
1abd0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1abe0 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20  _OMIT_UTF16 */. 
1abf0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1ac00 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1ac10 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31  sqlite3_prepare1
1ac20 36 5f 76 32 20 44 42 20 73 71 6c 20 62 79 74 65  6_v2 DB sql byte
1ac30 73 20 3f 74 61 69 6c 76 61 72 3f 0a 2a 2a 0a 2a  s ?tailvar?.**.*
1ac40 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20  * Compile up to 
1ac50 3c 62 79 74 65 73 3e 20 62 79 74 65 73 20 6f 66  <bytes> bytes of
1ac60 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 53 51   the supplied SQ
1ac70 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75  L string <sql> u
1ac80 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65  sing.** database
1ac90 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68   handle <DB>. Th
1aca0 65 20 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69  e parameter <tai
1acb0 6c 76 61 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d  lval> is the nam
1acc0 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a  e of a global.**
1acd0 20 76 61 72 69 61 62 6c 65 20 74 68 61 74 20 69   variable that i
1ace0 73 20 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75  s set to the unu
1acf0 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c  sed portion of <
1ad00 73 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20 41  sql> (if any). A
1ad10 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65 20  .** STMT handle 
1ad20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1ad30 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1ad40 70 72 65 70 61 72 65 31 36 5f 76 32 28 0a 20 20  prepare16_v2(.  
1ad50 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1ad60 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1ad70 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1ad80 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1ad90 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1ada0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1adb0 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69  MIT_UTF16.  sqli
1adc0 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
1add0 20 76 6f 69 64 20 2a 7a 53 71 6c 3b 0a 20 20 63   void *zSql;.  c
1ade0 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 54 61 69 6c  onst void *zTail
1adf0 20 3d 20 30 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20   = 0;.  Tcl_Obj 
1ae00 2a 70 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71  *pTail = 0;.  sq
1ae10 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1ae20 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42  t = 0;.  char zB
1ae30 75 66 5b 35 30 5d 3b 20 0a 20 20 69 6e 74 20 72  uf[50]; .  int r
1ae40 63 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 20  c;.  int bytes; 
1ae50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ae60 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20 73 70  * The integer sp
1ae70 65 63 69 66 69 65 64 20 61 73 20 61 72 67 20 33  ecified as arg 3
1ae80 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 6c 65 6e   */.  int objlen
1ae90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1aea0 2f 2a 20 54 68 65 20 62 79 74 65 2d 61 72 72 61  /* The byte-arra
1aeb0 79 20 6c 65 6e 67 74 68 20 6f 66 20 61 72 67 20  y length of arg 
1aec0 32 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63  2 */..  if( objc
1aed0 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34 20 29  !=5 && objc!=4 )
1aee0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1aef0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1af00 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1af10 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
1af20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
1af30 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44  ng(objv[0]), " D
1af40 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74 61 69  B sql bytes ?tai
1af50 6c 76 61 72 3f 22 2c 20 30 29 3b 0a 20 20 20 20  lvar?", 0);.    
1af60 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1af70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
1af80 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
1af90 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1afa0 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
1afb0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1afc0 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47  ;.  zSql = Tcl_G
1afd0 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
1afe0 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6f 62 6a  bj(objv[2], &obj
1aff0 6c 65 6e 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f  len);.  if( Tcl_
1b000 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
1b010 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
1b020 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20  bytes) ) return 
1b030 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
1b040 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
1b050 72 65 31 36 5f 76 32 28 64 62 2c 20 7a 53 71 6c  re16_v2(db, zSql
1b060 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c  , bytes, &pStmt,
1b070 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54 61 69   objc>=5 ? &zTai
1b080 6c 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 73 71  l : 0);.  if( sq
1b090 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
1b0a0 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
1b0b0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1b0c0 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ROR;.  if( rc ){
1b0d0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1b0e0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
1b0f0 28 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20  ( objc>=5 ){.   
1b100 20 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20 20   if( zTail ){.  
1b110 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 6f 62 6a      objlen = obj
1b120 6c 65 6e 20 2d 20 28 28 75 38 20 2a 29 7a 54 61  len - ((u8 *)zTa
1b130 69 6c 2d 28 75 38 20 2a 29 7a 53 71 6c 29 3b 0a  il-(u8 *)zSql);.
1b140 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b150 20 6f 62 6a 6c 65 6e 20 3d 20 30 3b 0a 20 20 20   objlen = 0;.   
1b160 20 7d 0a 20 20 20 20 70 54 61 69 6c 20 3d 20 54   }.    pTail = T
1b170 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
1b180 62 6a 28 28 75 38 20 2a 29 7a 54 61 69 6c 2c 20  bj((u8 *)zTail, 
1b190 6f 62 6a 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c  objlen);.    Tcl
1b1a0 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 54  _IncrRefCount(pT
1b1b0 61 69 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  ail);.    Tcl_Ob
1b1c0 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  jSetVar2(interp,
1b1d0 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 70 54 61   objv[4], 0, pTa
1b1e0 69 6c 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f  il, 0);.    Tcl_
1b1f0 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 54 61  DecrRefCount(pTa
1b200 69 6c 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  il);.  }..  if( 
1b210 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28  pStmt ){.    if(
1b220 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65   sqlite3TestMake
1b230 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72  PointerStr(inter
1b240 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20  p, zBuf, pStmt) 
1b250 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1b260 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70  OR;.  }.  Tcl_Ap
1b270 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1b280 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 23 65 6e  p, zBuf, 0);.#en
1b290 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1b2a0 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65  IT_UTF16 */.  re
1b2b0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1b2c0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1b2d0 69 74 65 33 5f 6f 70 65 6e 20 66 69 6c 65 6e 61  ite3_open filena
1b2e0 6d 65 20 3f 6f 70 74 69 6f 6e 73 2d 6c 69 73 74  me ?options-list
1b2f0 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ?.*/.static int 
1b300 74 65 73 74 5f 6f 70 65 6e 28 0a 20 20 76 6f 69  test_open(.  voi
1b310 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1b320 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1b330 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1b340 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1b350 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63  ST objv[].){.  c
1b360 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1b370 6e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 20  name;.  sqlite3 
1b380 2a 64 62 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  *db;.  char zBuf
1b390 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62  [100];..  if( ob
1b3a0 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 32  jc!=3 && objc!=2
1b3b0 20 26 26 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20   && objc!=1 ){. 
1b3c0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1b3d0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1b3e0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1b3f0 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
1b400 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
1b410 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65  objv[0]), " file
1b420 6e 61 6d 65 20 6f 70 74 69 6f 6e 73 2d 6c 69 73  name options-lis
1b430 74 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  t", 0);.    retu
1b440 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1b450 7d 0a 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  }..  zFilename =
1b460 20 6f 62 6a 63 3e 31 20 3f 20 54 63 6c 5f 47 65   objc>1 ? Tcl_Ge
1b470 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1b480 20 3a 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   : 0;.  sqlite3_
1b490 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  open(zFilename, 
1b4a0 26 64 62 29 3b 0a 20 20 0a 20 20 69 66 28 20 73  &db);.  .  if( s
1b4b0 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f  qlite3TestMakePo
1b4c0 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c  interStr(interp,
1b4d0 20 7a 42 75 66 2c 20 64 62 29 20 29 20 72 65 74   zBuf, db) ) ret
1b4e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1b4f0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1b500 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
1b510 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
1b520 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1b530 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65  age: sqlite3_ope
1b540 6e 5f 76 32 20 46 49 4c 45 4e 41 4d 45 20 46 4c  n_v2 FILENAME FL
1b550 41 47 53 20 56 46 53 0a 2a 2f 0a 73 74 61 74 69  AGS VFS.*/.stati
1b560 63 20 69 6e 74 20 74 65 73 74 5f 6f 70 65 6e 5f  c int test_open_
1b570 76 32 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  v2(.  void * cli
1b580 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1b590 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1b5a0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1b5b0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1b5c0 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  [].){.  const ch
1b5d0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  ar *zFilename;. 
1b5e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66   const char *zVf
1b5f0 73 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  s;.  int flags =
1b600 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   0;.  sqlite3 *d
1b610 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  b;.  int rc;.  c
1b620 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a  har zBuf[100];..
1b630 20 20 69 6e 74 20 6e 46 6c 61 67 3b 0a 20 20 54    int nFlag;.  T
1b640 63 6c 5f 4f 62 6a 20 2a 2a 61 70 46 6c 61 67 3b  cl_Obj **apFlag;
1b650 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28  .  int i;..  if(
1b660 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
1b670 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
1b680 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
1b690 2c 20 22 46 49 4c 45 4e 41 4d 45 20 46 4c 41 47  , "FILENAME FLAG
1b6a0 53 20 56 46 53 22 29 3b 0a 20 20 20 20 72 65 74  S VFS");.    ret
1b6b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1b6c0 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d   }.  zFilename =
1b6d0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1b6e0 62 6a 76 5b 31 5d 29 3b 0a 20 20 7a 56 66 73 20  bjv[1]);.  zVfs 
1b6f0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
1b700 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20  objv[3]);.  if( 
1b710 7a 56 66 73 5b 30 5d 3d 3d 30 78 30 30 20 29 20  zVfs[0]==0x00 ) 
1b720 7a 56 66 73 20 3d 20 30 3b 0a 0a 20 20 72 63 20  zVfs = 0;..  rc 
1b730 3d 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74  = Tcl_ListObjGet
1b740 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c  Elements(interp,
1b750 20 6f 62 6a 76 5b 32 5d 2c 20 26 6e 46 6c 61 67   objv[2], &nFlag
1b760 2c 20 26 61 70 46 6c 61 67 29 3b 0a 20 20 69 66  , &apFlag);.  if
1b770 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72  ( rc!=TCL_OK ) r
1b780 65 74 75 72 6e 20 72 63 3b 0a 20 20 66 6f 72 28  eturn rc;.  for(
1b790 69 3d 30 3b 20 69 3c 6e 46 6c 61 67 3b 20 69 2b  i=0; i<nFlag; i+
1b7a0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 46 6c 61  +){.    int iFla
1b7b0 67 3b 0a 20 20 20 20 73 74 72 75 63 74 20 4f 70  g;.    struct Op
1b7c0 65 6e 46 6c 61 67 20 7b 0a 20 20 20 20 20 20 63  enFlag {.      c
1b7d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6c 61 67  onst char *zFlag
1b7e0 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67  ;.      int flag
1b7f0 3b 0a 20 20 20 20 7d 20 61 46 6c 61 67 5b 5d 20  ;.    } aFlag[] 
1b800 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 53 51 4c  = {.      { "SQL
1b810 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
1b820 59 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  Y", SQLITE_OPEN_
1b830 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20  READONLY },.    
1b840 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1b850 5f 52 45 41 44 57 52 49 54 45 22 2c 20 53 51 4c  _READWRITE", SQL
1b860 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
1b870 54 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  TE },.      { "S
1b880 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
1b890 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E", SQLITE_OPEN_
1b8a0 43 52 45 41 54 45 20 7d 2c 0a 20 20 20 20 20 20  CREATE },.      
1b8b0 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44  { "SQLITE_OPEN_D
1b8c0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 22 2c 20 53  ELETEONCLOSE", S
1b8d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
1b8e0 45 4f 4e 43 4c 4f 53 45 20 7d 2c 0a 20 20 20 20  EONCLOSE },.    
1b8f0 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1b900 5f 45 58 43 4c 55 53 49 56 45 22 2c 20 53 51 4c  _EXCLUSIVE", SQL
1b910 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
1b920 56 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  VE },.      { "S
1b930 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50  QLITE_OPEN_AUTOP
1b940 52 4f 58 59 22 2c 20 53 51 4c 49 54 45 5f 4f 50  ROXY", SQLITE_OP
1b950 45 4e 5f 41 55 54 4f 50 52 4f 58 59 20 7d 2c 0a  EN_AUTOPROXY },.
1b960 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
1b970 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 22 2c 20 53  OPEN_MAIN_DB", S
1b980 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
1b990 44 42 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  DB },.      { "S
1b9a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
1b9b0 44 42 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  DB", SQLITE_OPEN
1b9c0 5f 54 45 4d 50 5f 44 42 20 7d 2c 0a 20 20 20 20  _TEMP_DB },.    
1b9d0 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1b9e0 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 22 2c 20  _TRANSIENT_DB", 
1b9f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e  SQLITE_OPEN_TRAN
1ba00 53 49 45 4e 54 5f 44 42 20 7d 2c 0a 20 20 20 20  SIENT_DB },.    
1ba10 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1ba20 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 22 2c 20  _MAIN_JOURNAL", 
1ba30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
1ba40 5f 4a 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20 20  _JOURNAL },.    
1ba50 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1ba60 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 22 2c 20  _TEMP_JOURNAL", 
1ba70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
1ba80 5f 4a 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20 20  _JOURNAL },.    
1ba90 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1baa0 5f 53 55 42 4a 4f 55 52 4e 41 4c 22 2c 20 53 51  _SUBJOURNAL", SQ
1bab0 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
1bac0 52 4e 41 4c 20 7d 2c 0a 20 20 20 20 20 20 7b 20  RNAL },.      { 
1bad0 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  "SQLITE_OPEN_MAS
1bae0 54 45 52 5f 4a 4f 55 52 4e 41 4c 22 2c 20 53 51  TER_JOURNAL", SQ
1baf0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
1bb00 5f 4a 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20 20  _JOURNAL },.    
1bb10 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1bb20 5f 4e 4f 4d 55 54 45 58 22 2c 20 53 51 4c 49 54  _NOMUTEX", SQLIT
1bb30 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 7d  E_OPEN_NOMUTEX }
1bb40 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  ,.      { "SQLIT
1bb50 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
1bb60 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46  ", SQLITE_OPEN_F
1bb70 55 4c 4c 4d 55 54 45 58 20 7d 2c 0a 20 20 20 20  ULLMUTEX },.    
1bb80 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1bb90 5f 53 48 41 52 45 44 43 41 43 48 45 22 2c 20 53  _SHAREDCACHE", S
1bba0 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
1bbb0 44 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20  DCACHE },.      
1bbc0 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50  { "SQLITE_OPEN_P
1bbd0 52 49 56 41 54 45 43 41 43 48 45 22 2c 20 53 51  RIVATECACHE", SQ
1bbe0 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54  LITE_OPEN_PRIVAT
1bbf0 45 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20  ECACHE },.      
1bc00 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  { "SQLITE_OPEN_W
1bc10 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  AL", SQLITE_OPEN
1bc20 5f 57 41 4c 20 7d 2c 0a 20 20 20 20 20 20 7b 20  _WAL },.      { 
1bc30 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49  "SQLITE_OPEN_URI
1bc40 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55  ", SQLITE_OPEN_U
1bc50 52 49 20 7d 2c 0a 20 20 20 20 20 20 7b 20 30 2c  RI },.      { 0,
1bc60 20 30 20 7d 0a 20 20 20 20 7d 3b 0a 20 20 20 20   0 }.    };.    
1bc70 72 63 20 3d 20 54 63 6c 5f 47 65 74 49 6e 64 65  rc = Tcl_GetInde
1bc80 78 46 72 6f 6d 4f 62 6a 53 74 72 75 63 74 28 69  xFromObjStruct(i
1bc90 6e 74 65 72 70 2c 20 61 70 46 6c 61 67 5b 69 5d  nterp, apFlag[i]
1bca0 2c 20 61 46 6c 61 67 2c 20 73 69 7a 65 6f 66 28  , aFlag, sizeof(
1bcb0 61 46 6c 61 67 5b 30 5d 29 2c 20 0a 20 20 20 20  aFlag[0]), .    
1bcc0 20 20 20 20 22 66 6c 61 67 22 2c 20 30 2c 20 26      "flag", 0, &
1bcd0 69 46 6c 61 67 0a 20 20 20 20 29 3b 0a 20 20 20  iFlag.    );.   
1bce0 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20   if( rc!=TCL_OK 
1bcf0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1bd00 20 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67 5b   flags |= aFlag[
1bd10 69 46 6c 61 67 5d 2e 66 6c 61 67 3b 0a 20 20 7d  iFlag].flag;.  }
1bd20 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
1bd30 5f 6f 70 65 6e 5f 76 32 28 7a 46 69 6c 65 6e 61  _open_v2(zFilena
1bd40 6d 65 2c 20 26 64 62 2c 20 66 6c 61 67 73 2c 20  me, &db, flags, 
1bd50 7a 56 66 73 29 3b 0a 20 20 69 66 28 20 73 71 6c  zVfs);.  if( sql
1bd60 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e  ite3TestMakePoin
1bd70 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a  terStr(interp, z
1bd80 42 75 66 2c 20 64 62 29 20 29 20 72 65 74 75 72  Buf, db) ) retur
1bd90 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
1bda0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1bdb0 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
1bdc0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1bdd0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1bde0 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  e: sqlite3_open1
1bdf0 36 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f  6 filename optio
1be00 6e 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ns.*/.static int
1be10 20 74 65 73 74 5f 6f 70 65 6e 31 36 28 0a 20 20   test_open16(.  
1be20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1be30 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1be40 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1be50 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1be60 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1be70 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1be80 4d 49 54 5f 55 54 46 31 36 0a 20 20 63 6f 6e 73  MIT_UTF16.  cons
1be90 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d  t void *zFilenam
1bea0 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e;.  sqlite3 *db
1beb0 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30  ;.  char zBuf[10
1bec0 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  0];..  if( objc!
1bed0 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
1bee0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1bef0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1bf00 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1bf10 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
1bf20 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
1bf30 20 22 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69   " filename opti
1bf40 6f 6e 73 2d 6c 69 73 74 22 2c 20 30 29 3b 0a 20  ons-list", 0);. 
1bf50 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1bf60 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69 6c  ROR;.  }..  zFil
1bf70 65 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 42  ename = Tcl_GetB
1bf80 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
1bf90 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 73  objv[1], 0);.  s
1bfa0 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 7a 46  qlite3_open16(zF
1bfb0 69 6c 65 6e 61 6d 65 2c 20 26 64 62 29 3b 0a 20  ilename, &db);. 
1bfc0 20 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54   .  if( sqlite3T
1bfd0 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
1bfe0 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  r(interp, zBuf, 
1bff0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
1c000 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70  _ERROR;.  Tcl_Ap
1c010 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1c020 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 23 65 6e  p, zBuf, 0);.#en
1c030 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1c040 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65  IT_UTF16 */.  re
1c050 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1c060 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1c070 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 20  ite3_complete16 
1c080 3c 55 54 46 2d 31 36 20 73 74 72 69 6e 67 3e 0a  <UTF-16 string>.
1c090 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69  **.** Return 1 i
1c0a0 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 61  f the supplied a
1c0b0 72 67 75 6d 65 6e 74 20 69 73 20 61 20 63 6f 6d  rgument is a com
1c0c0 70 6c 65 74 65 20 53 51 4c 20 73 74 61 74 65 6d  plete SQL statem
1c0d0 65 6e 74 2c 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20  ent, or zero.** 
1c0e0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
1c0f0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f  atic int test_co
1c100 6d 70 6c 65 74 65 31 36 28 0a 20 20 76 6f 69 64  mplete16(.  void
1c110 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1c120 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1c130 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1c140 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1c150 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 20  T objv[].){.#if 
1c160 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1c170 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 29 20 26  OMIT_COMPLETE) &
1c180 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
1c190 45 5f 4f 4d 49 54 5f 55 54 46 31 36 29 0a 20 20  E_OMIT_UTF16).  
1c1a0 63 68 61 72 20 2a 7a 42 75 66 3b 0a 0a 20 20 69  char *zBuf;..  i
1c1b0 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
1c1c0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
1c1d0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
1c1e0 6a 76 2c 20 22 3c 75 74 66 2d 31 36 20 73 71 6c  jv, "<utf-16 sql
1c1f0 3e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  >");.    return 
1c200 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1c210 20 20 7a 42 75 66 20 3d 20 28 63 68 61 72 2a 29    zBuf = (char*)
1c220 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
1c230 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
1c240 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62   0);.  Tcl_SetOb
1c250 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
1c260 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71  Tcl_NewIntObj(sq
1c270 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36  lite3_complete16
1c280 28 7a 42 75 66 29 29 29 3b 0a 23 65 6e 64 69 66  (zBuf)));.#endif
1c290 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1c2a0 43 4f 4d 50 4c 45 54 45 20 26 26 20 53 51 4c 49  COMPLETE && SQLI
1c2b0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
1c2c0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1c2d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1c2e0 3a 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 53  : sqlite3_step S
1c2f0 54 4d 54 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e 63  TMT.**.** Advanc
1c300 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  e the statement 
1c310 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77 2e  to the next row.
1c320 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1c330 65 73 74 5f 73 74 65 70 28 0a 20 20 76 6f 69 64  est_step(.  void
1c340 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1c350 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1c360 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1c370 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1c380 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
1c390 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1c3a0 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  t;.  int rc;..  
1c3b0 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
1c3c0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1c3d0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1c3e0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1c3f0 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
1c400 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
1c410 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54  objv[0]), " STMT
1c420 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1c430 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1c440 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
1c450 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
1c460 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1c470 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
1c480 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1c490 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
1c4a0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 0a  3_step(pStmt);..
1c4b0 20 20 2f 2a 20 69 66 28 20 72 63 21 3d 53 51 4c    /* if( rc!=SQL
1c4c0 49 54 45 5f 44 4f 4e 45 20 26 26 20 72 63 21 3d  ITE_DONE && rc!=
1c4d0 53 51 4c 49 54 45 5f 52 4f 57 20 29 20 72 65 74  SQLITE_ROW ) ret
1c4e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 20 2a  urn TCL_ERROR; *
1c4f0 2f 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  /.  Tcl_SetResul
1c500 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
1c510 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
1c520 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  ), 0);.  return 
1c530 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69  TCL_OK;.}..stati
1c540 63 20 69 6e 74 20 74 65 73 74 5f 73 71 6c 28 0a  c int test_sql(.
1c550 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1c560 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1c570 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1c580 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1c590 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1c5a0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
1c5b0 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20   *pStmt;..  if( 
1c5c0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1c5d0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
1c5e0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
1c5f0 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65   "STMT");.    re
1c600 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1c610 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
1c620 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
1c630 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1c640 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
1c650 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1c660 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 52  RROR;.  Tcl_SetR
1c670 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
1c680 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 73 71  har *)sqlite3_sq
1c690 6c 28 70 53 74 6d 74 29 2c 20 54 43 4c 5f 56 4f  l(pStmt), TCL_VO
1c6a0 4c 41 54 49 4c 45 29 3b 0a 20 20 72 65 74 75 72  LATILE);.  retur
1c6b0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1c6c0 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1c6d0 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 53  3_column_count S
1c6e0 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  TMT .**.** Retur
1c6f0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1c700 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64  columns returned
1c710 20 62 79 20 74 68 65 20 73 71 6c 20 73 74 61 74   by the sql stat
1c720 65 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73  ement STMT..*/.s
1c730 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63  tatic int test_c
1c740 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 0a 20 20 76  olumn_count(.  v
1c750 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1c760 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1c770 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1c780 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1c790 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1c7a0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1c7b0 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  Stmt;..  if( obj
1c7c0 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1c7d0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1c7e0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1c7f0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1c800 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
1c810 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
1c820 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  ), " STMT column
1c830 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1c840 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1c850 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
1c860 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
1c870 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1c880 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
1c890 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1c8a0 52 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  R;..  Tcl_SetObj
1c8b0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1c8c0 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c  cl_NewIntObj(sql
1c8d0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
1c8e0 74 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 72 65  t(pStmt)));.  re
1c8f0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1c900 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1c910 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
1c920 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a   STMT column.**.
1c930 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 79  ** Return the ty
1c940 70 65 20 6f 66 20 74 68 65 20 64 61 74 61 20 69  pe of the data i
1c950 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e  n column 'column
1c960 27 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  ' of the current
1c970 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   row..*/.static 
1c980 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f  int test_column_
1c990 74 79 70 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  type(.  void * c
1c9a0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1c9b0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1c9c0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1c9d0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1c9e0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
1c9f0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
1ca00 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 6e 74 20   int col;.  int 
1ca10 74 70 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  tp;..  if( objc!
1ca20 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
1ca30 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1ca40 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1ca50 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1ca60 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
1ca70 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
1ca80 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
1ca90 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1caa0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1cab0 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
1cac0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1cad0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1cae0 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
1caf0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1cb00 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
1cb10 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
1cb20 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20   objv[2], &col) 
1cb30 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1cb40 4f 52 3b 0a 0a 20 20 74 70 20 3d 20 73 71 6c 69  OR;..  tp = sqli
1cb50 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28  te3_column_type(
1cb60 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 73  pStmt, col);.  s
1cb70 77 69 74 63 68 28 20 74 70 20 29 7b 0a 20 20 20  witch( tp ){.   
1cb80 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54   case SQLITE_INT
1cb90 45 47 45 52 3a 20 0a 20 20 20 20 20 20 54 63 6c  EGER: .      Tcl
1cba0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
1cbb0 70 2c 20 22 49 4e 54 45 47 45 52 22 2c 20 54 43  p, "INTEGER", TC
1cbc0 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20  L_STATIC); .    
1cbd0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1cbe0 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 0a 20  e SQLITE_NULL:. 
1cbf0 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75       Tcl_SetResu
1cc00 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 55 4c 4c  lt(interp, "NULL
1cc10 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20  ", TCL_STATIC); 
1cc20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1cc30 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c    case SQLITE_FL
1cc40 4f 41 54 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53  OAT:.      Tcl_S
1cc50 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
1cc60 20 22 46 4c 4f 41 54 22 2c 20 54 43 4c 5f 53 54   "FLOAT", TCL_ST
1cc70 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72  ATIC); .      br
1cc80 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
1cc90 4c 49 54 45 5f 54 45 58 54 3a 0a 20 20 20 20 20  LITE_TEXT:.     
1cca0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
1ccb0 6e 74 65 72 70 2c 20 22 54 45 58 54 22 2c 20 54  nterp, "TEXT", T
1ccc0 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20  CL_STATIC); .   
1ccd0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1cce0 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 0a  se SQLITE_BLOB:.
1ccf0 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73        Tcl_SetRes
1cd00 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 42 4c 4f  ult(interp, "BLO
1cd10 42 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  B", TCL_STATIC);
1cd20 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
1cd30 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
1cd40 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 7d    assert(0);.  }
1cd50 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
1cd60 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1cd70 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
1cd80 6e 5f 69 6e 74 36 34 20 53 54 4d 54 20 63 6f 6c  n_int64 STMT col
1cd90 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  umn.**.** Return
1cda0 20 74 68 65 20 64 61 74 61 20 69 6e 20 63 6f 6c   the data in col
1cdb0 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20  umn 'column' of 
1cdc0 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
1cdd0 63 61 73 74 20 61 73 20 61 6e 0a 2a 2a 20 77 69  cast as an.** wi
1cde0 64 65 20 28 36 34 2d 62 69 74 29 20 69 6e 74 65  de (64-bit) inte
1cdf0 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ger..*/.static i
1ce00 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69  nt test_column_i
1ce10 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 20 63  nt64(.  void * c
1ce20 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1ce30 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1ce40 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1ce50 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1ce60 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
1ce70 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
1ce80 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 36 34 20   int col;.  i64 
1ce90 69 56 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  iVal;..  if( obj
1cea0 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
1ceb0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1cec0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1ced0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1cee0 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
1cef0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
1cf00 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  ), " STMT column
1cf10 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1cf20 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1cf30 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
1cf40 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
1cf50 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1cf60 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
1cf70 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1cf80 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
1cf90 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
1cfa0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c  p, objv[2], &col
1cfb0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1cfc0 52 52 4f 52 3b 0a 0a 20 20 69 56 61 6c 20 3d 20  RROR;..  iVal = 
1cfd0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
1cfe0 6e 74 36 34 28 70 53 74 6d 74 2c 20 63 6f 6c 29  nt64(pStmt, col)
1cff0 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
1d000 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
1d010 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 69  _NewWideIntObj(i
1d020 56 61 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  Val));.  return 
1d030 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1d040 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1d050 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20 53 54 4d 54  column_blob STMT
1d060 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69   column.*/.stati
1d070 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d  c int test_colum
1d080 6e 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a  n_blob(.  void *
1d090 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1d0a0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1d0b0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1d0c0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1d0d0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
1d0e0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
1d0f0 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 0a 20 20 69  .  int col;..  i
1d100 6e 74 20 6c 65 6e 3b 0a 20 20 63 6f 6e 73 74 20  nt len;.  const 
1d110 76 6f 69 64 20 2a 70 42 6c 6f 62 3b 0a 0a 20 20  void *pBlob;..  
1d120 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
1d130 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1d140 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1d150 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1d160 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
1d170 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
1d180 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54  objv[0]), " STMT
1d190 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20   column", 0);.  
1d1a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1d1b0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
1d1c0 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
1d1d0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1d1e0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
1d1f0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
1d200 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
1d210 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
1d220 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
1d230 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72  ], &col) ) retur
1d240 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
1d250 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  len = sqlite3_co
1d260 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74  lumn_bytes(pStmt
1d270 2c 20 63 6f 6c 29 3b 0a 20 20 70 42 6c 6f 62 20  , col);.  pBlob 
1d280 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
1d290 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 63 6f 6c  _blob(pStmt, col
1d2a0 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
1d2b0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
1d2c0 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
1d2d0 6a 28 70 42 6c 6f 62 2c 20 6c 65 6e 29 29 3b 0a  j(pBlob, len));.
1d2e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1d2f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1d300 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1d310 64 6f 75 62 6c 65 20 53 54 4d 54 20 63 6f 6c 75  double STMT colu
1d320 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  mn.**.** Return 
1d330 74 68 65 20 64 61 74 61 20 69 6e 20 63 6f 6c 75  the data in colu
1d340 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74  mn 'column' of t
1d350 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 63  he current row c
1d360 61 73 74 20 61 73 20 61 20 64 6f 75 62 6c 65 2e  ast as a double.
1d370 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1d380 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c  est_column_doubl
1d390 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
1d3a0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1d3b0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1d3c0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1d3d0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1d3e0 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
1d3f0 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
1d400 74 20 63 6f 6c 3b 0a 20 20 64 6f 75 62 6c 65 20  t col;.  double 
1d410 72 56 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  rVal;..  if( obj
1d420 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
1d430 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1d440 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1d450 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1d460 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
1d470 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
1d480 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  ), " STMT column
1d490 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1d4a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1d4b0 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
1d4c0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
1d4d0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1d4e0 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
1d4f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1d500 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
1d510 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
1d520 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c  p, objv[2], &col
1d530 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1d540 52 52 4f 52 3b 0a 0a 20 20 72 56 61 6c 20 3d 20  RROR;..  rVal = 
1d550 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
1d560 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 63 6f 6c  ouble(pStmt, col
1d570 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
1d580 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
1d590 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72  l_NewDoubleObj(r
1d5a0 56 61 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  Val));.  return 
1d5b0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1d5c0 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1d5d0 64 61 74 61 5f 63 6f 75 6e 74 20 53 54 4d 54 20  data_count STMT 
1d5e0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
1d5f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
1d600 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  mns returned by 
1d610 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d 65 6e  the sql statemen
1d620 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69  t STMT..*/.stati
1d630 63 20 69 6e 74 20 74 65 73 74 5f 64 61 74 61 5f  c int test_data_
1d640 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20  count(.  void * 
1d650 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1d660 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1d670 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1d680 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1d690 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
1d6a0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
1d6b0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
1d6c0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1d6d0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1d6e0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1d6f0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
1d700 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
1d710 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53  ng(objv[0]), " S
1d720 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b  TMT column", 0);
1d730 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1d740 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
1d750 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
1d760 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1d770 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1d780 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
1d790 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
1d7a0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
1d7b0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
1d7c0 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 64  IntObj(sqlite3_d
1d7d0 61 74 61 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  ata_count(pStmt)
1d7e0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
1d7f0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1d800 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
1d810 75 6d 6e 5f 74 65 78 74 20 53 54 4d 54 20 63 6f  umn_text STMT co
1d820 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65  lumn.**.** Usage
1d830 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
1d840 5f 64 65 63 6c 74 79 70 65 20 53 54 4d 54 20 63  _decltype STMT c
1d850 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67  olumn.**.** Usag
1d860 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
1d870 6e 5f 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c 75  n_name STMT colu
1d880 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  mn.*/.static int
1d890 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 28   test_stmt_utf8(
1d8a0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1d8b0 44 61 74 61 2c 20 20 20 20 20 20 20 20 2f 2a 20  Data,        /* 
1d8c0 50 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c 69 74  Pointer to SQLit
1d8d0 65 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 74  e API function t
1d8e0 6f 20 62 65 20 69 6e 76 6f 6b 65 20 2a 2f 0a 20  o be invoke */. 
1d8f0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1d900 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1d910 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1d920 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
1d930 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1d940 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20  t;.  int col;.  
1d950 63 6f 6e 73 74 20 63 68 61 72 20 2a 28 2a 78 46  const char *(*xF
1d960 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d  unc)(sqlite3_stm
1d970 74 2a 2c 20 69 6e 74 29 3b 0a 20 20 63 6f 6e 73  t*, int);.  cons
1d980 74 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20  t char *zRet;.. 
1d990 20 78 46 75 6e 63 20 3d 20 28 63 6f 6e 73 74 20   xFunc = (const 
1d9a0 63 68 61 72 20 2a 28 2a 29 28 73 71 6c 69 74 65  char *(*)(sqlite
1d9b0 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 29 63 6c  3_stmt*, int))cl
1d9c0 69 65 6e 74 44 61 74 61 3b 0a 20 20 69 66 28 20  ientData;.  if( 
1d9d0 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
1d9e0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1d9f0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1da00 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1da10 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
1da20 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1da30 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c  [0]), " STMT col
1da40 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  umn", 0);.    re
1da50 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1da60 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
1da70 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
1da80 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1da90 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
1daa0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1dab0 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
1dac0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
1dad0 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
1dae0 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  col) ) return TC
1daf0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 52 65 74 20  L_ERROR;.  zRet 
1db00 3d 20 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63  = xFunc(pStmt, c
1db10 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 52 65 74 20  ol);.  if( zRet 
1db20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
1db30 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
1db40 61 72 20 2a 29 7a 52 65 74 2c 20 30 29 3b 0a 20  ar *)zRet, 0);. 
1db50 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
1db60 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  OK;.}..static in
1db70 74 20 74 65 73 74 5f 67 6c 6f 62 61 6c 5f 72 65  t test_global_re
1db80 63 6f 76 65 72 28 0a 20 20 76 6f 69 64 20 2a 20  cover(.  void * 
1db90 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1dba0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1dbb0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1dbc0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1dbd0 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66  bjv[].){.#ifndef
1dbe0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
1dbf0 52 45 43 41 54 45 44 0a 20 20 69 6e 74 20 72 63  RECATED.  int rc
1dc00 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20  ;.  if( objc!=1 
1dc10 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
1dc20 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
1dc30 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20  1, objv, "");.  
1dc40 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1dc50 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  OR;.  }.  rc = s
1dc60 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65  qlite3_global_re
1dc70 63 6f 76 65 72 28 29 3b 0a 20 20 54 63 6c 5f 53  cover();.  Tcl_S
1dc80 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
1dc90 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
1dca0 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54  Name(rc), TCL_ST
1dcb0 41 54 49 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ATIC);.#endif.  
1dcc0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1dcd0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1dce0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
1dcf0 78 74 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  xt STMT column.*
1dd00 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1dd10 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74  te3_column_declt
1dd20 79 70 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a  ype STMT column.
1dd30 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  **.** Usage: sql
1dd40 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  ite3_column_name
1dd50 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a   STMT column.*/.
1dd60 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1dd70 73 74 6d 74 5f 75 74 66 31 36 28 0a 20 20 76 6f  stmt_utf16(.  vo
1dd80 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1dd90 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1dda0 74 6f 20 53 51 4c 69 74 65 20 41 50 49 20 66 75  to SQLite API fu
1ddb0 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76  nction to be inv
1ddc0 6f 6b 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  oked */.  Tcl_In
1ddd0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1dde0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1ddf0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1de00 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ].){.#ifndef SQL
1de10 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
1de20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1de30 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b  Stmt;.  int col;
1de40 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74  .  Tcl_Obj *pRet
1de50 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ;.  const void *
1de60 7a 4e 61 6d 65 31 36 3b 0a 20 20 63 6f 6e 73 74  zName16;.  const
1de70 20 76 6f 69 64 20 2a 28 2a 78 46 75 6e 63 29 28   void *(*xFunc)(
1de80 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69  sqlite3_stmt*, i
1de90 6e 74 29 3b 0a 0a 20 20 78 46 75 6e 63 20 3d 20  nt);..  xFunc = 
1dea0 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 28 2a 29  (const void *(*)
1deb0 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20  (sqlite3_stmt*, 
1dec0 69 6e 74 29 29 63 6c 69 65 6e 74 44 61 74 61 3b  int))clientData;
1ded0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
1dee0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1def0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1df00 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1df10 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
1df20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
1df30 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53  ng(objv[0]), " S
1df40 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b  TMT column", 0);
1df50 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1df60 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
1df70 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
1df80 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1df90 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1dfa0 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
1dfb0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
1dfc0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
1dfd0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
1dfe0 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65  v[2], &col) ) re
1dff0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1e000 0a 20 20 7a 4e 61 6d 65 31 36 20 3d 20 78 46 75  .  zName16 = xFu
1e010 6e 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a  nc(pStmt, col);.
1e020 20 20 69 66 28 20 7a 4e 61 6d 65 31 36 20 29 7b    if( zName16 ){
1e030 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
1e040 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
1e050 7a 4e 61 6d 65 31 36 3b 0a 20 20 20 20 66 6f 72  zName16;.    for
1e060 28 6e 3d 30 3b 20 7a 5b 6e 5d 20 7c 7c 20 7a 5b  (n=0; z[n] || z[
1e070 6e 2b 31 5d 3b 20 6e 2b 3d 32 29 7b 7d 0a 20 20  n+1]; n+=2){}.  
1e080 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77    pRet = Tcl_New
1e090 42 79 74 65 41 72 72 61 79 4f 62 6a 28 7a 4e 61  ByteArrayObj(zNa
1e0a0 6d 65 31 36 2c 20 6e 2b 32 29 3b 0a 20 20 20 20  me16, n+2);.    
1e0b0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
1e0c0 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a  (interp, pRet);.
1e0d0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
1e0e0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
1e0f0 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  */..  return TCL
1e100 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1e110 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
1e120 75 6d 6e 5f 69 6e 74 20 53 54 4d 54 20 63 6f 6c  umn_int STMT col
1e130 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a  umn.**.** Usage:
1e140 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1e150 62 79 74 65 73 20 53 54 4d 54 20 63 6f 6c 75 6d  bytes STMT colum
1e160 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  n.**.** Usage: s
1e170 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
1e180 74 65 73 31 36 20 53 54 4d 54 20 63 6f 6c 75 6d  tes16 STMT colum
1e190 6e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n.**.*/.static i
1e1a0 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74  nt test_stmt_int
1e1b0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1e1c0 74 44 61 74 61 2c 20 20 20 20 2f 2a 20 50 6f 69  tData,    /* Poi
1e1d0 6e 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20 41  nter to SQLite A
1e1e0 50 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62  PI function to b
1e1f0 65 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 54  e invoked */.  T
1e200 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1e210 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1e220 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1e230 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
1e240 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
1e250 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 6e  .  int col;.  in
1e260 74 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74  t (*xFunc)(sqlit
1e270 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 3b 0a  e3_stmt*, int);.
1e280 0a 20 20 78 46 75 6e 63 20 3d 20 28 69 6e 74 20  .  xFunc = (int 
1e290 28 2a 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  (*)(sqlite3_stmt
1e2a0 2a 2c 20 69 6e 74 29 29 63 6c 69 65 6e 74 44 61  *, int))clientDa
1e2b0 74 61 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ta;.  if( objc!=
1e2c0 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
1e2d0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1e2e0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1e2f0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1e300 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
1e310 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
1e320 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20  " STMT column", 
1e330 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1e340 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1e350 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
1e360 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
1e370 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1e380 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
1e390 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1e3a0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1e3b0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1e3c0 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29  objv[2], &col) )
1e3d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1e3e0 52 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  R;..  Tcl_SetObj
1e3f0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1e400 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 78 46 75  cl_NewIntObj(xFu
1e410 6e 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29 29 29  nc(pStmt, col)))
1e420 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1e430 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1e440 65 3a 20 20 73 71 6c 69 74 65 5f 73 65 74 5f 6d  e:  sqlite_set_m
1e450 61 67 69 63 20 20 44 42 20 20 4d 41 47 49 43 2d  agic  DB  MAGIC-
1e460 4e 55 4d 42 45 52 0a 2a 2a 0a 2a 2a 20 53 65 74  NUMBER.**.** Set
1e470 20 74 68 65 20 64 62 2d 3e 6d 61 67 69 63 20 76   the db->magic v
1e480 61 6c 75 65 2e 20 20 54 68 69 73 20 69 73 20 75  alue.  This is u
1e490 73 65 64 20 74 6f 20 74 65 73 74 20 65 72 72 6f  sed to test erro
1e4a0 72 20 72 65 63 6f 76 65 72 79 20 6c 6f 67 69 63  r recovery logic
1e4b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e4c0 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63  sqlite_set_magic
1e4d0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1e4e0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1e4f0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1e500 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20  nt argc,.  char 
1e510 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69  **argv.){.  sqli
1e520 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61  te3 *db;.  if( a
1e530 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
1e540 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1e550 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1e560 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1e570 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
1e580 20 20 20 20 20 20 20 22 20 44 42 20 4d 41 47 49         " DB MAGI
1e590 43 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  C", 0);.    retu
1e5a0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1e5b0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
1e5c0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
1e5d0 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
1e5e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1e5f0 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
1e600 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47  [2], "SQLITE_MAG
1e610 49 43 5f 4f 50 45 4e 22 29 3d 3d 30 20 29 7b 0a  IC_OPEN")==0 ){.
1e620 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20      db->magic = 
1e630 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45  SQLITE_MAGIC_OPE
1e640 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  N;.  }else if( s
1e650 74 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22  trcmp(argv[2], "
1e660 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f  SQLITE_MAGIC_CLO
1e670 53 45 44 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  SED")==0 ){.    
1e680 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
1e690 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b  TE_MAGIC_CLOSED;
1e6a0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
1e6b0 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51  cmp(argv[2], "SQ
1e6c0 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 22  LITE_MAGIC_BUSY"
1e6d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  )==0 ){.    db->
1e6e0 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
1e6f0 41 47 49 43 5f 42 55 53 59 3b 0a 20 20 7d 65 6c  AGIC_BUSY;.  }el
1e700 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72  se if( strcmp(ar
1e710 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d  gv[2], "SQLITE_M
1e720 41 47 49 43 5f 45 52 52 4f 52 22 29 3d 3d 30 20  AGIC_ERROR")==0 
1e730 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63  ){.    db->magic
1e740 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
1e750 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 20 69  ERROR;.  }else i
1e760 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
1e770 74 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 28  terp, argv[2], (
1e780 69 6e 74 2a 29 26 64 62 2d 3e 6d 61 67 69 63 29  int*)&db->magic)
1e790 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
1e7a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1e7b0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1e7c0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
1e7d0 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
1e7e0 74 20 20 44 42 20 0a 2a 2a 0a 2a 2a 20 54 72 69  t  DB .**.** Tri
1e7f0 67 67 65 72 20 61 6e 20 69 6e 74 65 72 72 75 70  gger an interrup
1e800 74 20 6f 6e 20 44 42 0a 2a 2f 0a 73 74 61 74 69  t on DB.*/.stati
1e810 63 20 69 6e 74 20 74 65 73 74 5f 69 6e 74 65 72  c int test_inter
1e820 72 75 70 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  rupt(.  void * c
1e830 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1e840 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1e850 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63  .  int argc,.  c
1e860 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  har **argv.){.  
1e870 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
1e880 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
1e890 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1e8a0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1e8b0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1e8c0 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
1e8d0 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20  , " DB", 0);.   
1e8e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1e8f0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
1e900 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
1e910 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
1e920 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1e930 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  OR;.  sqlite3_in
1e940 74 65 72 72 75 70 74 28 64 62 29 3b 0a 20 20 72  terrupt(db);.  r
1e950 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1e960 0a 73 74 61 74 69 63 20 75 38 20 2a 73 71 6c 69  .static u8 *sqli
1e970 74 65 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69  te3_stack_baseli
1e980 6e 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 46  ne = 0;../*.** F
1e990 69 6c 6c 20 74 68 65 20 73 74 61 63 6b 20 77 69  ill the stack wi
1e9a0 74 68 20 61 20 6b 6e 6f 77 6e 20 62 69 74 70 61  th a known bitpa
1e9b0 74 74 65 72 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ttern..*/.static
1e9c0 20 76 6f 69 64 20 70 72 65 70 53 74 61 63 6b 28   void prepStack(
1e9d0 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  void){.  int i;.
1e9e0 20 20 75 33 32 20 62 69 67 42 75 66 5b 36 35 35    u32 bigBuf[655
1e9f0 33 36 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  36];.  for(i=0; 
1ea00 69 3c 73 69 7a 65 6f 66 28 62 69 67 42 75 66 29  i<sizeof(bigBuf)
1ea10 2f 73 69 7a 65 6f 66 28 62 69 67 42 75 66 5b 30  /sizeof(bigBuf[0
1ea20 5d 29 3b 20 69 2b 2b 29 20 62 69 67 42 75 66 5b  ]); i++) bigBuf[
1ea30 69 5d 20 3d 20 30 78 64 65 61 64 62 65 65 66 3b  i] = 0xdeadbeef;
1ea40 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 61 63 6b  .  sqlite3_stack
1ea50 5f 62 61 73 65 6c 69 6e 65 20 3d 20 28 75 38 2a  _baseline = (u8*
1ea60 29 26 62 69 67 42 75 66 5b 36 35 35 33 36 5d 3b  )&bigBuf[65536];
1ea70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 74 68  .}../*.** Get th
1ea80 65 20 63 75 72 72 65 6e 74 20 73 74 61 63 6b 20  e current stack 
1ea90 64 65 70 74 68 2e 20 20 55 73 65 64 20 66 6f 72  depth.  Used for
1eaa0 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
1eab0 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33 53  .*/.u64 sqlite3S
1eac0 74 61 63 6b 44 65 70 74 68 28 76 6f 69 64 29 7b  tackDepth(void){
1ead0 0a 20 20 75 38 20 78 3b 0a 20 20 72 65 74 75 72  .  u8 x;.  retur
1eae0 6e 20 28 75 36 34 29 28 73 71 6c 69 74 65 33 5f  n (u64)(sqlite3_
1eaf0 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65 20 2d  stack_baseline -
1eb00 20 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55   &x);.}../*.** U
1eb10 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73  sage:  sqlite3_s
1eb20 74 61 63 6b 5f 75 73 65 64 20 44 42 20 53 51 4c  tack_used DB SQL
1eb30 0a 2a 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6d 65  .**.** Try to me
1eb40 61 73 75 72 65 20 74 68 65 20 61 6d 6f 75 6e 74  asure the amount
1eb50 20 6f 66 20 73 74 61 63 6b 20 73 70 61 63 65 20   of stack space 
1eb60 75 73 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74  used by a call t
1eb70 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63 0a 2a  o sqlite3_exec.*
1eb80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1eb90 74 5f 73 74 61 63 6b 5f 75 73 65 64 28 0a 20 20  t_stack_used(.  
1eba0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1ebb0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1ebc0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61  *interp,.  int a
1ebd0 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72  rgc,.  char **ar
1ebe0 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  gv.){.  sqlite3 
1ebf0 2a 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *db;.  int i;.  
1ec00 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
1ec10 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1ec20 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1ec30 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1ec40 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
1ec50 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44 42  ], .        " DB
1ec60 20 53 51 4c 22 2c 20 30 29 3b 0a 20 20 20 20 72   SQL", 0);.    r
1ec70 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1ec80 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
1ec90 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1eca0 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
1ecb0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1ecc0 3b 0a 20 20 70 72 65 70 53 74 61 63 6b 28 29 3b  ;.  prepStack();
1ecd0 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33  .  (void)sqlite3
1ece0 5f 65 78 65 63 28 64 62 2c 20 61 72 67 76 5b 32  _exec(db, argv[2
1ecf0 5d 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 66  ], 0, 0, 0);.  f
1ed00 6f 72 28 69 3d 36 35 35 33 35 3b 20 69 3e 3d 30  or(i=65535; i>=0
1ed10 20 26 26 20 28 28 75 33 32 2a 29 73 71 6c 69 74   && ((u32*)sqlit
1ed20 65 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e  e3_stack_baselin
1ed30 65 29 5b 2d 69 5d 3d 3d 30 78 64 65 61 64 62 65  e)[-i]==0xdeadbe
1ed40 65 66 3b 20 69 2d 2d 29 7b 7d 0a 20 20 54 63 6c  ef; i--){}.  Tcl
1ed50 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
1ed60 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
1ed70 4f 62 6a 28 69 2a 34 29 29 3b 0a 20 20 72 65 74  Obj(i*4));.  ret
1ed80 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1ed90 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1eda0 74 65 5f 64 65 6c 65 74 65 5f 66 75 6e 63 74 69  te_delete_functi
1edb0 6f 6e 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e  on DB function-n
1edc0 61 6d 65 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65  ame.**.** Delete
1edd0 20 74 68 65 20 75 73 65 72 20 66 75 6e 63 74 69   the user functi
1ede0 6f 6e 20 27 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d  on 'function-nam
1edf0 65 27 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65  e' from database
1ee00 20 68 61 6e 64 6c 65 20 44 42 2e 20 49 74 0a 2a   handle DB. It.*
1ee10 2a 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  * is assumed tha
1ee20 74 20 74 68 65 20 75 73 65 72 20 66 75 6e 63 74  t the user funct
1ee30 69 6f 6e 20 77 61 73 20 63 72 65 61 74 65 64 20  ion was created 
1ee40 61 73 20 55 54 46 38 2c 20 61 6e 79 20 6e 75 6d  as UTF8, any num
1ee50 62 65 72 20 6f 66 0a 2a 2a 20 61 72 67 75 6d 65  ber of.** argume
1ee60 6e 74 73 20 28 74 68 65 20 77 61 79 20 74 68 65  nts (the way the
1ee70 20 54 43 4c 20 69 6e 74 65 72 66 61 63 65 20 64   TCL interface d
1ee80 6f 65 73 20 69 74 29 2e 0a 2a 2f 0a 73 74 61 74  oes it)..*/.stat
1ee90 69 63 20 69 6e 74 20 64 65 6c 65 74 65 5f 66 75  ic int delete_fu
1eea0 6e 63 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a  nction(.  void *
1eeb0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1eec0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1eed0 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  p,.  int argc,. 
1eee0 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a   char **argv.){.
1eef0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
1ef00 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61  te3 *db;.  if( a
1ef10 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
1ef20 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1ef30 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1ef40 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1ef50 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
1ef60 20 20 20 20 20 20 20 22 20 44 42 20 66 75 6e 63         " DB func
1ef70 74 69 6f 6e 2d 6e 61 6d 65 22 2c 20 30 29 3b 0a  tion-name", 0);.
1ef80 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1ef90 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1efa0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1efb0 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
1efc0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1efd0 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
1efe0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
1eff0 63 74 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32  ction(db, argv[2
1f000 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  ], -1, SQLITE_UT
1f010 46 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  F8, 0, 0, 0, 0);
1f020 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
1f030 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
1f040 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
1f050 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
1f060 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1f070 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1f080 73 71 6c 69 74 65 5f 64 65 6c 65 74 65 5f 63 6f  sqlite_delete_co
1f090 6c 6c 61 74 69 6f 6e 20 44 42 20 63 6f 6c 6c 61  llation DB colla
1f0a0 74 69 6f 6e 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20  tion-name.**.** 
1f0b0 44 65 6c 65 74 65 20 74 68 65 20 63 6f 6c 6c 61  Delete the colla
1f0c0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 27 63  tion sequence 'c
1f0d0 6f 6c 6c 61 74 69 6f 6e 2d 6e 61 6d 65 27 20 66  ollation-name' f
1f0e0 72 6f 6d 20 64 61 74 61 62 61 73 65 20 68 61 6e  rom database han
1f0f0 64 6c 65 20 0a 2a 2a 20 44 42 2e 20 49 74 20 69  dle .** DB. It i
1f100 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
1f110 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
1f120 75 65 6e 63 65 20 77 61 73 20 63 72 65 61 74 65  uence was create
1f130 64 20 61 73 20 55 54 46 38 20 28 74 68 65 20 0a  d as UTF8 (the .
1f140 2a 2a 20 77 61 79 20 74 68 65 20 54 43 4c 20 69  ** way the TCL i
1f150 6e 74 65 72 66 61 63 65 20 64 6f 65 73 20 69 74  nterface does it
1f160 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1f170 20 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f   delete_collatio
1f180 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  n(.  void * clie
1f190 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1f1a0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1f1b0 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72  int argc,.  char
1f1c0 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74   **argv.){.  int
1f1d0 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   rc;.  sqlite3 *
1f1e0 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  db;.  if( argc!=
1f1f0 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
1f200 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1f210 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1f220 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1f230 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
1f240 20 20 22 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d    " DB function-
1f250 6e 61 6d 65 22 2c 20 30 29 3b 0a 20 20 20 20 72  name", 0);.    r
1f260 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1f270 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
1f280 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1f290 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
1f2a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1f2b0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1f2c0 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
1f2d0 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 53  n(db, argv[2], S
1f2e0 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30  QLITE_UTF8, 0, 0
1f2f0 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  );.  Tcl_SetResu
1f300 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
1f310 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
1f320 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  c), TCL_STATIC);
1f330 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1f340 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1f350 3a 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75  : sqlite3_get_au
1f360 74 6f 63 6f 6d 6d 69 74 20 44 42 0a 2a 2a 0a 2a  tocommit DB.**.*
1f370 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1f380 20 74 68 65 20 64 61 74 61 62 61 73 65 20 44 42   the database DB
1f390 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e   is currently in
1f3a0 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 6d 6f 64   auto-commit mod
1f3b0 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c  e..** Return fal
1f3c0 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74  se if not..*/.st
1f3d0 61 74 69 63 20 69 6e 74 20 67 65 74 5f 61 75 74  atic int get_aut
1f3e0 6f 63 6f 6d 6d 69 74 28 0a 20 20 76 6f 69 64 20  ocommit(.  void 
1f3f0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1f400 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1f410 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  rp,.  int argc,.
1f420 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b    char **argv.){
1f430 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d  .  char zBuf[30]
1f440 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
1f450 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
1f460 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1f470 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1f480 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1f490 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
1f4a0 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22  v[0], .        "
1f4b0 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
1f4c0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1f4d0 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
1f4e0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
1f4f0 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
1f500 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1f510 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c  .  sprintf(zBuf,
1f520 20 22 25 64 22 2c 20 73 71 6c 69 74 65 33 5f 67   "%d", sqlite3_g
1f530 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 64 62  et_autocommit(db
1f540 29 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  ));.  Tcl_Append
1f550 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
1f560 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  Buf, 0);.  retur
1f570 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1f580 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1f590 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 20 44  3_busy_timeout D
1f5a0 42 20 4d 53 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74  B MS.**.** Set t
1f5b0 68 65 20 62 75 73 79 20 74 69 6d 65 6f 75 74 2e  he busy timeout.
1f5c0 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 65    This is more e
1f5d0 61 73 69 6c 79 20 64 6f 6e 65 20 75 73 69 6e 67  asily done using
1f5e0 20 74 68 65 20 74 69 6d 65 6f 75 74 0a 2a 2a 20   the timeout.** 
1f5f0 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 54 43  method of the TC
1f600 4c 20 69 6e 74 65 72 66 61 63 65 2e 20 20 42 75  L interface.  Bu
1f610 74 20 77 65 20 6e 65 65 64 20 61 20 77 61 79 20  t we need a way 
1f620 74 6f 20 74 65 73 74 20 74 68 65 20 63 61 73 65  to test the case
1f630 0a 2a 2a 20 77 68 65 72 65 20 69 74 20 72 65 74  .** where it ret
1f640 75 72 6e 73 20 53 51 4c 49 54 45 5f 4d 49 53 55  urns SQLITE_MISU
1f650 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  SE..*/.static in
1f660 74 20 74 65 73 74 5f 62 75 73 79 5f 74 69 6d 65  t test_busy_time
1f670 6f 75 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  out(.  void * cl
1f680 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1f690 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1f6a0 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68    int argc,.  ch
1f6b0 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69  ar **argv.){.  i
1f6c0 6e 74 20 72 63 2c 20 6d 73 3b 0a 20 20 73 71 6c  nt rc, ms;.  sql
1f6d0 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
1f6e0 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  argc!=3 ){.    T
1f6f0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1f700 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1f710 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1f720 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a   \"", argv[0], .
1f730 20 20 20 20 20 20 20 20 22 20 44 42 22 2c 20 30          " DB", 0
1f740 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1f750 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1f760 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
1f770 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
1f780 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
1f790 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
1f7a0 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72  Tcl_GetInt(inter
1f7b0 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26 6d 73 29  p, argv[2], &ms)
1f7c0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1f7d0 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
1f7e0 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74  te3_busy_timeout
1f7f0 28 64 62 2c 20 6d 73 29 3b 0a 20 20 54 63 6c 5f  (db, ms);.  Tcl_
1f800 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1f810 65 72 70 2c 20 73 71 6c 69 74 65 33 54 65 73 74  erp, sqlite3Test
1f820 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30  ErrorName(rc), 0
1f830 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1f840 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1f850 67 65 3a 20 20 74 63 6c 5f 76 61 72 69 61 62 6c  ge:  tcl_variabl
1f860 65 5f 74 79 70 65 20 56 41 52 49 41 42 4c 45 4e  e_type VARIABLEN
1f870 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  AME.**.** Return
1f880 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
1f890 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73   internal repres
1f8a0 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  entation for the
1f8b0 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65  .** value of the
1f8c0 20 67 69 76 65 6e 20 76 61 72 69 61 62 6c 65 2e   given variable.
1f8d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1f8e0 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79 70 65  cl_variable_type
1f8f0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1f900 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1f910 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1f920 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1f930 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1f940 0a 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  .){.  Tcl_Obj *p
1f950 56 61 72 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  Var;.  if( objc!
1f960 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
1f970 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
1f980 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 56 41 52  p, 1, objv, "VAR
1f990 49 41 42 4c 45 22 29 3b 0a 20 20 20 20 72 65 74  IABLE");.    ret
1f9a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1f9b0 20 7d 0a 20 20 70 56 61 72 20 3d 20 54 63 6c 5f   }.  pVar = Tcl_
1f9c0 47 65 74 56 61 72 32 45 78 28 69 6e 74 65 72 70  GetVar2Ex(interp
1f9d0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1f9e0 6f 62 6a 76 5b 31 5d 29 2c 20 30 2c 20 54 43 4c  objv[1]), 0, TCL
1f9f0 5f 4c 45 41 56 45 5f 45 52 52 5f 4d 53 47 29 3b  _LEAVE_ERR_MSG);
1fa00 0a 20 20 69 66 28 20 70 56 61 72 3d 3d 30 20 29  .  if( pVar==0 )
1fa10 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1fa20 52 3b 0a 20 20 69 66 28 20 70 56 61 72 2d 3e 74  R;.  if( pVar->t
1fa30 79 70 65 50 74 72 20 29 7b 0a 20 20 20 20 54 63  ypePtr ){.    Tc
1fa40 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1fa50 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
1fa60 72 69 6e 67 4f 62 6a 28 70 56 61 72 2d 3e 74 79  ringObj(pVar->ty
1fa70 70 65 50 74 72 2d 3e 6e 61 6d 65 2c 20 2d 31 29  pePtr->name, -1)
1fa80 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1fa90 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1faa0 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
1fab0 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 20  _release_memory 
1fac0 3f 4e 3f 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70  ?N?.**.** Attemp
1fad0 74 20 74 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d  t to release mem
1fae0 6f 72 79 20 63 75 72 72 65 6e 74 6c 79 20 68 65  ory currently he
1faf0 6c 64 20 62 75 74 20 6e 6f 74 20 61 63 74 75 61  ld but not actua
1fb00 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a  lly required..**
1fb10 20 54 68 65 20 69 6e 74 65 67 65 72 20 4e 20 69   The integer N i
1fb20 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1fb30 62 79 74 65 73 20 77 65 20 61 72 65 20 74 72 79  bytes we are try
1fb40 69 6e 67 20 74 6f 20 72 65 6c 65 61 73 65 2e 20  ing to release. 
1fb50 20 54 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 20   The .** return 
1fb60 76 61 6c 75 65 20 69 73 20 74 68 65 20 61 6d 6f  value is the amo
1fb70 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 61 63  unt of memory ac
1fb80 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 64 2e  tually released.
1fb90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1fba0 65 73 74 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  est_release_memo
1fbb0 72 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ry(.  void * cli
1fbc0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1fbd0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1fbe0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1fbf0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1fc00 5b 5d 0a 29 7b 0a 23 69 66 20 64 65 66 69 6e 65  [].){.#if define
1fc10 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
1fc20 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
1fc30 54 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  T) && !defined(S
1fc40 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
1fc50 4f 29 0a 20 20 69 6e 74 20 4e 3b 0a 20 20 69 6e  O).  int N;.  in
1fc60 74 20 61 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a  t amt;.  if( obj
1fc70 63 21 3d 31 20 26 26 20 6f 62 6a 63 21 3d 32 20  c!=1 && objc!=2 
1fc80 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
1fc90 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
1fca0 31 2c 20 6f 62 6a 76 2c 20 22 3f 4e 3f 22 29 3b  1, objv, "?N?");
1fcb0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1fcc0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1fcd0 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
1fce0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
1fcf0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
1fd00 6a 76 5b 31 5d 2c 20 26 4e 29 20 29 20 72 65 74  jv[1], &N) ) ret
1fd10 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1fd20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4e 20 3d 20   }else{.    N = 
1fd30 2d 31 3b 0a 20 20 7d 0a 20 20 61 6d 74 20 3d 20  -1;.  }.  amt = 
1fd40 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f  sqlite3_release_
1fd50 6d 65 6d 6f 72 79 28 4e 29 3b 0a 20 20 54 63 6c  memory(N);.  Tcl
1fd60 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
1fd70 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
1fd80 4f 62 6a 28 61 6d 74 29 29 3b 0a 23 65 6e 64 69  Obj(amt));.#endi
1fd90 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  f.  return TCL_O
1fda0 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  K;.}.../*.** Usa
1fdb0 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f  ge:  sqlite3_db_
1fdc0 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 20 44  release_memory D
1fdd0 42 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  B.**.** Attempt 
1fde0 74 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d 6f 72  to release memor
1fdf0 79 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64  y currently held
1fe00 20 62 79 20 64 61 74 61 62 61 73 65 20 44 42 2e   by database DB.
1fe10 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20    Return the.** 
1fe20 72 65 73 75 6c 74 20 63 6f 64 65 20 28 77 68 69  result code (whi
1fe30 63 68 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ch in the curren
1fe40 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
1fe50 20 69 73 20 61 6c 77 61 79 73 20 7a 65 72 6f 29   is always zero)
1fe60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1fe70 74 65 73 74 5f 64 62 5f 72 65 6c 65 61 73 65 5f  test_db_release_
1fe80 6d 65 6d 6f 72 79 28 0a 20 20 76 6f 69 64 20 2a  memory(.  void *
1fe90 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1fea0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1feb0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1fec0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1fed0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
1fee0 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
1fef0 63 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  c;.  if( objc!=2
1ff00 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
1ff10 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
1ff20 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b   1, objv, "DB");
1ff30 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1ff40 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1ff50 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
1ff60 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1ff70 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
1ff80 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1ff90 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
1ffa0 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65  lite3_db_release
1ffb0 5f 6d 65 6d 6f 72 79 28 64 62 29 3b 0a 20 20 54  _memory(db);.  T
1ffc0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1ffd0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
1ffe0 6e 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20 72 65  ntObj(rc));.  re
1fff0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
20000 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
20010 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d  lite3_db_filenam
20020 65 20 44 42 20 44 42 4e 41 4d 45 0a 2a 2a 0a 2a  e DB DBNAME.**.*
20030 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d  * Return the nam
20040 65 20 6f 66 20 61 20 66 69 6c 65 20 61 73 73 6f  e of a file asso
20050 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61  ciated with a da
20060 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
20070 63 20 69 6e 74 20 74 65 73 74 5f 64 62 5f 66 69  c int test_db_fi
20080 6c 65 6e 61 6d 65 28 0a 20 20 76 6f 69 64 20 2a  lename(.  void *
20090 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
200a0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
200b0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
200c0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
200d0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
200e0 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
200f0 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 3b 0a   char *zDbName;.
20100 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
20110 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
20120 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
20130 20 6f 62 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d   objv, "DB DBNAM
20140 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  E");.    return 
20150 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
20160 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
20170 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
20180 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
20190 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
201a0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 44 62  TCL_ERROR;.  zDb
201b0 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
201c0 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
201d0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
201e0 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65  t(interp, sqlite
201f0 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 64 62  3_db_filename(db
20200 2c 20 7a 44 62 4e 61 6d 65 29 2c 20 28 76 6f 69  , zDbName), (voi
20210 64 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  d*)0);.  return 
20220 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
20230 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
20240 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74  _soft_heap_limit
20250 20 3f 4e 3f 0a 2a 2a 0a 2a 2a 20 51 75 65 72 79   ?N?.**.** Query
20260 20 6f 72 20 73 65 74 20 74 68 65 20 73 6f 66 74   or set the soft
20270 20 68 65 61 70 20 6c 69 6d 69 74 20 66 6f 72 20   heap limit for 
20280 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
20290 61 64 2e 20 20 54 68 65 0a 2a 2a 20 6c 69 6d 69  ad.  The.** limi
202a0 74 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67 65  t is only change
202b0 64 20 69 66 20 74 68 65 20 4e 20 69 73 20 70 72  d if the N is pr
202c0 65 73 65 6e 74 2e 20 20 54 68 65 20 70 72 65 76  esent.  The prev
202d0 69 6f 75 73 20 6c 69 6d 69 74 0a 2a 2a 20 69 73  ious limit.** is
202e0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
202f0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 6f  atic int test_so
20300 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 28 0a 20  ft_heap_limit(. 
20310 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
20320 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
20330 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
20340 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
20350 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
20360 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
20370 20 61 6d 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f   amt;.  sqlite3_
20380 69 6e 74 36 34 20 4e 20 3d 20 2d 31 3b 0a 20 20  int64 N = -1;.  
20390 69 66 28 20 6f 62 6a 63 21 3d 31 20 26 26 20 6f  if( objc!=1 && o
203a0 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
203b0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
203c0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
203d0 22 3f 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74 75  "?N?");.    retu
203e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
203f0 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20  }.  if( objc==2 
20400 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  ){.    if( Tcl_G
20410 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a  etWideIntFromObj
20420 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
20430 2c 20 26 4e 29 20 29 20 72 65 74 75 72 6e 20 54  , &N) ) return T
20440 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
20450 61 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f 73 6f  amt = sqlite3_so
20460 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34 28  ft_heap_limit64(
20470 4e 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  N);.  Tcl_SetObj
20480 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
20490 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
204a0 28 61 6d 74 29 29 3b 0a 20 20 72 65 74 75 72 6e  (amt));.  return
204b0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
204c0 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
204d0 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75  e3_thread_cleanu
204e0 70 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65  p.**.** Call the
204f0 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f   sqlite3_thread_
20500 63 6c 65 61 6e 75 70 20 41 50 49 2e 0a 2a 2f 0a  cleanup API..*/.
20510 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
20520 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28 0a  thread_cleanup(.
20530 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
20540 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
20550 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
20560 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
20570 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
20580 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
20590 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
205a0 0a 20 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  .  sqlite3_threa
205b0 64 5f 63 6c 65 61 6e 75 70 28 29 3b 0a 23 65 6e  d_cleanup();.#en
205c0 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  dif.  return TCL
205d0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
205e0 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 70  age:   sqlite3_p
205f0 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 20 20  ager_refcounts  
20600 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  DB.**.** Return 
20610 61 20 6c 69 73 74 20 6f 66 20 6e 75 6d 62 65 72  a list of number
20620 73 20 77 68 69 63 68 20 61 72 65 20 74 68 65 20  s which are the 
20630 50 61 67 65 72 52 65 66 63 6f 75 6e 74 20 66 6f  PagerRefcount fo
20640 72 20 61 6c 6c 0a 2a 2a 20 70 61 67 65 72 73 20  r all.** pagers 
20650 6f 6e 20 65 61 63 68 20 64 61 74 61 62 61 73 65  on each database
20660 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
20670 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
20680 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 28  pager_refcounts(
20690 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
206a0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
206b0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
206c0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
206d0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
206e0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
206f0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
20700 20 76 2c 20 2a 61 3b 0a 20 20 54 63 6c 5f 4f 62   v, *a;.  Tcl_Ob
20710 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 0a 20 20 69  j *pResult;..  i
20720 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
20730 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
20740 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
20750 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
20760 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
20770 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
20780 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
20790 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20  ), " DB", 0);.  
207a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
207b0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
207c0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
207d0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
207e0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
207f0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
20800 4f 52 3b 0a 20 20 70 52 65 73 75 6c 74 20 3d 20  OR;.  pResult = 
20810 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20  Tcl_NewObj();.  
20820 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
20830 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Db; i++){.    if
20840 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  ( db->aDb[i].pBt
20850 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20 3d  ==0 ){.      v =
20860 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   -1;.    }else{.
20870 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
20880 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
20890 74 65 78 29 3b 0a 20 20 20 20 20 20 61 20 3d 20  tex);.      a = 
208a0 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 61 74  sqlite3PagerStat
208b0 73 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  s(sqlite3BtreePa
208c0 67 65 72 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  ger(db->aDb[i].p
208d0 42 74 29 29 3b 0a 20 20 20 20 20 20 76 20 3d 20  Bt));.      v = 
208e0 61 5b 30 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  a[0];.      sqli
208f0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
20900 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
20910 7d 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  }.    Tcl_ListOb
20920 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
20930 2c 20 70 52 65 73 75 6c 74 2c 20 54 63 6c 5f 4e  , pResult, Tcl_N
20940 65 77 49 6e 74 4f 62 6a 28 76 29 29 3b 0a 20 20  ewIntObj(v));.  
20950 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  }.  Tcl_SetObjRe
20960 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65  sult(interp, pRe
20970 73 75 6c 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  sult);.  return 
20980 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TCL_OK;.}.../*.*
20990 2a 20 74 63 6c 63 6d 64 3a 20 20 20 77 6f 72 6b  * tclcmd:   work
209a0 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 0a 2a 2a  ing_64bit_int.**
209b0 0a 2a 2a 20 53 6f 6d 65 20 54 43 4c 20 62 75 69  .** Some TCL bui
209c0 6c 64 73 20 28 65 78 3a 20 63 79 67 77 69 6e 29  lds (ex: cygwin)
209d0 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20   do not support 
209e0 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 73 2e  64-bit integers.
209f0 20 20 54 68 69 73 0a 2a 2a 20 6c 65 61 64 73 20    This.** leads 
20a00 74 6f 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 74  to a number of t
20a10 65 73 74 20 66 61 69 6c 75 72 65 73 2e 20 20 54  est failures.  T
20a20 68 65 20 70 72 65 73 65 6e 74 20 63 6f 6d 6d 61  he present comma
20a30 6e 64 20 63 68 65 63 6b 73 20 74 68 65 0a 2a 2a  nd checks the.**
20a40 20 54 43 4c 20 62 75 69 6c 64 20 74 6f 20 73 65   TCL build to se
20a50 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
20a60 20 69 74 20 73 75 70 70 6f 72 74 73 20 36 34 2d   it supports 64-
20a70 62 69 74 20 69 6e 74 65 67 65 72 73 2e 20 20 49  bit integers.  I
20a80 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 54 52 55  t.** returns TRU
20a90 45 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64  E if it does and
20aa0 20 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 0a 2a   FALSE if not..*
20ab0 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e  *.** This comman
20ac0 64 20 69 73 20 75 73 65 64 20 74 6f 20 77 61 72  d is used to war
20ad0 6e 20 75 73 65 72 73 20 74 68 61 74 20 74 68 65  n users that the
20ae0 69 72 20 54 43 4c 20 62 75 69 6c 64 20 69 73 20  ir TCL build is 
20af0 64 65 66 65 63 74 69 76 65 0a 2a 2a 20 61 6e 64  defective.** and
20b00 20 74 68 61 74 20 74 68 65 20 65 72 72 6f 72 73   that the errors
20b10 20 74 68 65 79 20 61 72 65 20 73 65 65 69 6e 67   they are seeing
20b20 20 69 6e 20 74 68 65 20 74 65 73 74 20 73 63 72   in the test scr
20b30 69 70 74 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a  ipts might be.**
20b40 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
20b50 69 72 20 64 65 66 65 63 74 69 76 65 20 54 43 4c  ir defective TCL
20b60 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 72 6f   rather than pro
20b70 62 6c 65 6d 73 20 69 6e 20 53 51 4c 69 74 65 2e  blems in SQLite.
20b80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
20b90 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74  orking_64bit_int
20ba0 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
20bb0 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
20bc0 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
20bd0 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
20be0 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
20bf0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
20c00 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
20c10 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
20c20 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
20c30 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
20c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20c50 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
20c60 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
20c70 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
20c80 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
20c90 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63  ments */.){.  Tc
20ca0 6c 5f 4f 62 6a 20 2a 70 54 65 73 74 4f 62 6a 3b  l_Obj *pTestObj;
20cb0 0a 20 20 69 6e 74 20 77 6f 72 6b 69 6e 67 20 3d  .  int working =
20cc0 20 30 3b 0a 0a 20 20 70 54 65 73 74 4f 62 6a 20   0;..  pTestObj 
20cd0 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  = Tcl_NewWideInt
20ce0 4f 62 6a 28 31 30 30 30 30 30 30 2a 28 69 36 34  Obj(1000000*(i64
20cf0 29 31 32 33 34 35 36 37 38 39 30 29 3b 0a 20 20  )1234567890);.  
20d00 77 6f 72 6b 69 6e 67 20 3d 20 73 74 72 63 6d 70  working = strcmp
20d10 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70  (Tcl_GetString(p
20d20 54 65 73 74 4f 62 6a 29 2c 20 22 31 32 33 34 35  TestObj), "12345
20d30 36 37 38 39 30 30 30 30 30 30 30 22 29 3d 3d 30  67890000000")==0
20d40 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
20d50 6f 75 6e 74 28 70 54 65 73 74 4f 62 6a 29 3b 0a  ount(pTestObj);.
20d60 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
20d70 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
20d80 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 77 6f 72  ewBooleanObj(wor
20d90 6b 69 6e 67 29 29 3b 0a 20 20 72 65 74 75 72 6e  king));.  return
20da0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
20db0 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76 66 73  ** tclcmd:   vfs
20dc0 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74 0a 2a 2a 0a  _unlink_test.**.
20dd0 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d  ** This TCL comm
20de0 61 6e 64 20 75 6e 72 65 67 69 73 74 65 72 73 20  and unregisters 
20df0 74 68 65 20 70 72 69 6d 61 72 79 20 56 46 53 20  the primary VFS 
20e00 61 6e 64 20 74 68 65 6e 20 72 65 67 69 73 74 65  and then registe
20e10 72 73 0a 2a 2a 20 69 74 20 62 61 63 6b 20 61 67  rs.** it back ag
20e20 61 69 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73  ain.  This is us
20e30 65 64 20 74 6f 20 74 65 73 74 20 74 68 65 20 61  ed to test the a
20e40 62 69 6c 69 74 79 20 74 6f 20 72 65 67 69 73 74  bility to regist
20e50 65 72 20 61 0a 2a 2a 20 56 46 53 20 77 68 65 6e  er a.** VFS when
20e60 20 6e 6f 6e 65 20 61 72 65 20 70 72 65 76 69 6f   none are previo
20e70 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 2c  usly registered,
20e80 20 61 6e 64 20 74 68 65 20 61 62 69 6c 69 74 79   and the ability
20e90 20 74 6f 20 0a 2a 2a 20 75 6e 72 65 67 69 73 74   to .** unregist
20ea0 65 72 20 74 68 65 20 6f 6e 6c 79 20 61 76 61 69  er the only avai
20eb0 6c 61 62 6c 65 20 56 46 53 2e 20 20 54 69 63 6b  lable VFS.  Tick
20ec0 65 74 20 23 32 37 33 38 0a 2a 2f 0a 73 74 61 74  et #2738.*/.stat
20ed0 69 63 20 69 6e 74 20 76 66 73 5f 75 6e 6c 69 6e  ic int vfs_unlin
20ee0 6b 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74  k_test(.  Client
20ef0 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
20f00 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
20f10 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
20f20 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
20f30 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
20f40 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
20f50 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
20f60 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
20f70 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
20f80 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
20f90 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
20fa0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
20fb0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
20fc0 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
20fd0 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
20fe0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c  {.  int i;.  sql
20ff0 69 74 65 33 5f 76 66 73 20 2a 70 4d 61 69 6e 3b  ite3_vfs *pMain;
21000 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
21010 61 70 56 66 73 5b 32 30 5d 3b 0a 20 20 73 71 6c  apVfs[20];.  sql
21020 69 74 65 33 5f 76 66 73 20 6f 6e 65 2c 20 74 77  ite3_vfs one, tw
21030 6f 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  o;..  sqlite3_vf
21040 73 5f 75 6e 72 65 67 69 73 74 65 72 28 30 29 3b  s_unregister(0);
21050 20 20 20 2f 2a 20 55 6e 72 65 67 69 73 74 65 72     /* Unregister
21060 20 6f 66 20 4e 55 4c 4c 20 69 73 20 68 61 72 6d   of NULL is harm
21070 6c 65 73 73 20 2a 2f 0a 20 20 6f 6e 65 2e 7a 4e  less */.  one.zN
21080 61 6d 65 20 3d 20 22 5f 5f 6f 6e 65 22 3b 0a 20  ame = "__one";. 
21090 20 74 77 6f 2e 7a 4e 61 6d 65 20 3d 20 22 5f 5f   two.zName = "__
210a0 74 77 6f 22 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c  two";..  /* Call
210b0 69 6e 67 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  ing sqlite3_vfs_
210c0 72 65 67 69 73 74 65 72 20 77 69 74 68 20 32 6e  register with 2n
210d0 64 20 61 72 67 75 6d 65 6e 74 20 6f 66 20 30 20  d argument of 0 
210e0 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 63 68  does not.  ** ch
210f0 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c 74  ange the default
21100 20 56 46 53 0a 20 20 2a 2f 0a 20 20 70 4d 61 69   VFS.  */.  pMai
21110 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  n = sqlite3_vfs_
21120 66 69 6e 64 28 30 29 3b 0a 20 20 73 71 6c 69 74  find(0);.  sqlit
21130 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
21140 26 6f 6e 65 2c 20 30 29 3b 0a 20 20 61 73 73 65  &one, 0);.  asse
21150 72 74 28 20 70 4d 61 69 6e 3d 3d 30 20 7c 7c 20  rt( pMain==0 || 
21160 70 4d 61 69 6e 3d 3d 73 71 6c 69 74 65 33 5f 76  pMain==sqlite3_v
21170 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20 20  fs_find(0) );.  
21180 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
21190 73 74 65 72 28 26 74 77 6f 2c 20 30 29 3b 0a 20  ster(&two, 0);. 
211a0 20 61 73 73 65 72 74 28 20 70 4d 61 69 6e 3d 3d   assert( pMain==
211b0 30 20 7c 7c 20 70 4d 61 69 6e 3d 3d 73 71 6c 69  0 || pMain==sqli
211c0 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20  te3_vfs_find(0) 
211d0 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 63 61 6e 20  );..  /* We can 
211e0 66 69 6e 64 20 61 20 56 46 53 20 62 79 20 69 74  find a VFS by it
211f0 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 73 73 65  s name */.  asse
21200 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
21210 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26  find("__one")==&
21220 6f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  one );.  assert(
21230 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
21240 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f  d("__two")==&two
21250 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c 69 6e   );..  /* Callin
21260 67 20 73 71 6c 69 74 65 5f 76 66 73 5f 72 65 67  g sqlite_vfs_reg
21270 69 73 74 65 72 20 77 69 74 68 20 6e 6f 6e 2d 7a  ister with non-z
21280 65 72 6f 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  ero second param
21290 65 74 65 72 20 63 68 61 6e 67 65 73 20 74 68 65  eter changes the
212a0 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 56 46  .  ** default VF
212b0 53 2c 20 65 76 65 6e 20 69 66 20 74 68 65 20 31  S, even if the 1
212c0 73 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  st parameter is 
212d0 61 6e 20 65 78 69 73 74 69 67 20 56 46 53 20 74  an existig VFS t
212e0 68 61 74 20 69 73 0a 20 20 2a 2a 20 70 72 65 76  hat is.  ** prev
212f0 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65  iously registere
21300 64 20 61 73 20 74 68 65 20 6e 6f 6e 2d 64 65 66  d as the non-def
21310 61 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ault..  */.  sql
21320 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
21330 72 28 26 6f 6e 65 2c 20 31 29 3b 0a 20 20 61 73  r(&one, 1);.  as
21340 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66  sert( sqlite3_vf
21350 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d  s_find("__one")=
21360 3d 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72  =&one );.  asser
21370 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
21380 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74  ind("__two")==&t
21390 77 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  wo );.  assert( 
213a0 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
213b0 28 30 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 73  (0)==&one );.  s
213c0 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
213d0 74 65 72 28 26 74 77 6f 2c 20 31 29 3b 0a 20 20  ter(&two, 1);.  
213e0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
213f0 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22  vfs_find("__one"
21400 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73  )==&one );.  ass
21410 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
21420 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d  _find("__two")==
21430 26 74 77 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  &two );.  assert
21440 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
21450 6e 64 28 30 29 3d 3d 26 74 77 6f 20 29 3b 0a 20  nd(0)==&two );. 
21460 20 69 66 28 20 70 4d 61 69 6e 20 29 7b 0a 20 20   if( pMain ){.  
21470 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65    sqlite3_vfs_re
21480 67 69 73 74 65 72 28 70 4d 61 69 6e 2c 20 31 29  gister(pMain, 1)
21490 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
214a0 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22  lite3_vfs_find("
214b0 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20 29 3b  __one")==&one );
214c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
214d0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f  ite3_vfs_find("_
214e0 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b 0a  _two")==&two );.
214f0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
21500 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d  te3_vfs_find(0)=
21510 3d 70 4d 61 69 6e 20 29 3b 0a 20 20 7d 0a 20 20  =pMain );.  }.  
21520 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65  .  /* Unlink the
21530 20 64 65 66 61 75 6c 74 20 56 46 53 2e 20 20 52   default VFS.  R
21540 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65 72  epeat until ther
21550 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 56 46  e are no more VF
21560 53 65 73 0a 20 20 2a 2a 20 72 65 67 69 73 74 65  Ses.  ** registe
21570 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  red..  */.  for(
21580 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 70  i=0; i<sizeof(ap
21590 56 66 73 29 2f 73 69 7a 65 6f 66 28 61 70 56 66  Vfs)/sizeof(apVf
215a0 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  s[0]); i++){.   
215b0 20 61 70 56 66 73 5b 69 5d 20 3d 20 73 71 6c 69   apVfs[i] = sqli
215c0 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b  te3_vfs_find(0);
215d0 0a 20 20 20 20 69 66 28 20 61 70 56 66 73 5b 69  .    if( apVfs[i
215e0 5d 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ] ){.      asser
215f0 74 28 20 61 70 56 66 73 5b 69 5d 3d 3d 73 71 6c  t( apVfs[i]==sql
21600 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 61 70  ite3_vfs_find(ap
21610 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29  Vfs[i]->zName) )
21620 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
21630 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 61  vfs_unregister(a
21640 70 56 66 73 5b 69 5d 29 3b 0a 20 20 20 20 20 20  pVfs[i]);.      
21650 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74  assert( 0==sqlit
21660 65 33 5f 76 66 73 5f 66 69 6e 64 28 61 70 56 66  e3_vfs_find(apVf
21670 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a  s[i]->zName) );.
21680 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
21690 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 76  rt( 0==sqlite3_v
216a0 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20 20  fs_find(0) );.  
216b0 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74  .  /* Register t
216c0 68 65 20 6d 61 69 6e 20 56 46 53 20 61 73 20 6e  he main VFS as n
216d0 6f 6e 2d 64 65 66 61 75 6c 74 20 28 77 69 6c 6c  on-default (will
216e0 20 62 65 20 6d 61 64 65 20 64 65 66 61 75 6c 74   be made default
216f0 2c 20 73 69 6e 63 65 0a 20 20 2a 2a 20 69 74 27  , since.  ** it'
21700 6c 6c 20 62 65 20 74 68 65 20 6f 6e 6c 79 20 6f  ll be the only o
21710 6e 65 20 69 6e 20 65 78 69 73 74 65 6e 63 65 29  ne in existence)
21720 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
21730 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 70 4d  _vfs_register(pM
21740 61 69 6e 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  ain, 0);.  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 30 29 3d 3d 70 4d 61 69 6e 20 29 3b  ind(0)==pMain );
21770 0a 20 20 0a 20 20 2f 2a 20 55 6e 2d 72 65 67 69  .  .  /* Un-regi
21780 73 74 65 72 20 74 68 65 20 6d 61 69 6e 20 56 46  ster the main VF
21790 53 20 61 67 61 69 6e 20 74 6f 20 72 65 73 74 6f  S again to resto
217a0 72 65 20 61 6e 20 65 6d 70 74 79 20 56 46 53 20  re an empty VFS 
217b0 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  list */.  sqlite
217c0 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72  3_vfs_unregister
217d0 28 70 4d 61 69 6e 29 3b 0a 20 20 61 73 73 65 72  (pMain);.  asser
217e0 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 76 66  t( 0==sqlite3_vf
217f0 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 0a 20 20  s_find(0) );..  
21800 2f 2a 20 52 65 6c 69 6e 6b 20 61 6c 6c 20 56 46  /* Relink all VF
21810 53 65 73 20 69 6e 20 72 65 76 65 72 73 65 20 6f  Ses in reverse o
21820 72 64 65 72 2e 20 2a 2f 20 20 0a 20 20 66 6f 72  rder. */  .  for
21830 28 69 3d 73 69 7a 65 6f 66 28 61 70 56 66 73 29  (i=sizeof(apVfs)
21840 2f 73 69 7a 65 6f 66 28 61 70 56 66 73 5b 30 5d  /sizeof(apVfs[0]
21850 29 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  )-1; i>=0; i--){
21860 0a 20 20 20 20 69 66 28 20 61 70 56 66 73 5b 69  .    if( apVfs[i
21870 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ] ){.      sqlit
21880 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
21890 61 70 56 66 73 5b 69 5d 2c 20 31 29 3b 0a 20 20  apVfs[i], 1);.  
218a0 20 20 20 20 61 73 73 65 72 74 28 20 61 70 56 66      assert( apVf
218b0 73 5b 69 5d 3d 3d 73 71 6c 69 74 65 33 5f 76 66  s[i]==sqlite3_vf
218c0 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20 20 20  s_find(0) );.   
218d0 20 20 20 61 73 73 65 72 74 28 20 61 70 56 66 73     assert( apVfs
218e0 5b 69 5d 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73  [i]==sqlite3_vfs
218f0 5f 66 69 6e 64 28 61 70 56 66 73 5b 69 5d 2d 3e  _find(apVfs[i]->
21900 7a 4e 61 6d 65 29 20 29 3b 0a 20 20 20 20 7d 0a  zName) );.    }.
21910 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 72 65 67 69    }..  /* Unregi
21920 73 74 65 72 20 6f 75 74 20 73 61 6d 70 6c 65 20  ster out sample 
21930 56 46 53 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69  VFSes. */.  sqli
21940 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74  te3_vfs_unregist
21950 65 72 28 26 6f 6e 65 29 3b 0a 20 20 73 71 6c 69  er(&one);.  sqli
21960 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74  te3_vfs_unregist
21970 65 72 28 26 74 77 6f 29 3b 0a 0a 20 20 2f 2a 20  er(&two);..  /* 
21980 55 6e 72 65 67 69 73 74 65 72 69 6e 67 20 61 20  Unregistering a 
21990 56 46 53 20 74 68 61 74 20 69 73 20 6e 6f 74 20  VFS that is not 
219a0 63 75 72 72 65 6e 74 6c 79 20 72 65 67 69 73 74  currently regist
219b0 65 72 65 64 20 69 73 20 68 61 72 6d 6c 65 73 73  ered is harmless
219c0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   */.  sqlite3_vf
219d0 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26 6f 6e  s_unregister(&on
219e0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  e);.  sqlite3_vf
219f0 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26 74 77  s_unregister(&tw
21a00 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  o);.  assert( sq
21a10 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22  lite3_vfs_find("
21a20 5f 5f 6f 6e 65 22 29 3d 3d 30 20 29 3b 0a 20 20  __one")==0 );.  
21a30 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
21a40 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22  vfs_find("__two"
21a50 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 65  )==0 );..  /* We
21a60 20 73 68 6f 75 6c 64 20 62 65 20 6c 65 66 74 20   should be left 
21a70 77 69 74 68 20 74 68 65 20 6f 72 69 67 69 6e 61  with the origina
21a80 6c 20 64 65 66 61 75 6c 74 20 56 46 53 20 62 61  l default VFS ba
21a90 63 6b 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 6f  ck as the.  ** o
21aa0 72 69 67 69 6e 61 6c 20 2a 2f 0a 20 20 61 73 73  riginal */.  ass
21ab0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
21ac0 5f 66 69 6e 64 28 30 29 3d 3d 70 4d 61 69 6e 20  _find(0)==pMain 
21ad0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  );..  return TCL
21ae0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63  _OK;.}../*.** tc
21af0 6c 63 6d 64 3a 20 20 20 76 66 73 5f 69 6e 69 74  lcmd:   vfs_init
21b00 66 61 69 6c 5f 74 65 73 74 0a 2a 2a 0a 2a 2a 20  fail_test.**.** 
21b10 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  This TCL command
21b20 20 61 74 74 65 6d 70 74 73 20 74 6f 20 76 66 73   attempts to vfs
21b30 5f 66 69 6e 64 20 61 6e 64 20 76 66 73 5f 72 65  _find and vfs_re
21b40 67 69 73 74 65 72 20 77 68 65 6e 20 74 68 65 0a  gister when the.
21b50 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69  ** sqlite3_initi
21b60 61 6c 69 7a 65 28 29 20 69 6e 74 65 72 66 61 63  alize() interfac
21b70 65 20 69 73 20 66 61 69 6c 69 6e 67 2e 20 20 41  e is failing.  A
21b80 6c 6c 20 63 61 6c 6c 73 20 73 68 6f 75 6c 64 20  ll calls should 
21b90 66 61 69 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  fail..*/.static 
21ba0 69 6e 74 20 76 66 73 5f 69 6e 69 74 66 61 69 6c  int vfs_initfail
21bb0 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44  _test(.  ClientD
21bc0 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
21bd0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
21be0 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
21bf0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
21c00 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
21c10 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
21c20 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
21c30 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
21c40 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
21c50 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
21c60 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
21c70 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
21c80 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
21c90 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
21ca0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
21cb0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f  .  sqlite3_vfs o
21cc0 6e 65 3b 0a 20 20 6f 6e 65 2e 7a 4e 61 6d 65 20  ne;.  one.zName 
21cd0 3d 20 22 5f 5f 6f 6e 65 22 3b 0a 0a 20 20 69 66  = "__one";..  if
21ce0 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
21cf0 6e 64 28 30 29 20 29 20 72 65 74 75 72 6e 20 54  nd(0) ) return T
21d00 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69  CL_ERROR;.  sqli
21d10 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
21d20 28 26 6f 6e 65 2c 20 30 29 3b 0a 20 20 69 66 28  (&one, 0);.  if(
21d30 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
21d40 64 28 30 29 20 29 20 72 65 74 75 72 6e 20 54 43  d(0) ) return TC
21d50 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74  L_ERROR;.  sqlit
21d60 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
21d70 26 6f 6e 65 2c 20 31 29 3b 0a 20 20 69 66 28 20  &one, 1);.  if( 
21d80 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
21d90 28 30 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  (0) ) return TCL
21da0 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e  _ERROR;.  return
21db0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
21dc0 2a 20 53 61 76 65 64 20 56 46 53 65 73 0a 2a 2f  * Saved VFSes.*/
21dd0 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
21de0 76 66 73 20 2a 61 70 56 66 73 5b 32 30 5d 3b 0a  vfs *apVfs[20];.
21df0 73 74 61 74 69 63 20 69 6e 74 20 6e 56 66 73 20  static int nVfs 
21e00 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  = 0;../*.** tclc
21e10 6d 64 3a 20 20 20 76 66 73 5f 75 6e 72 65 67 69  md:   vfs_unregi
21e20 73 74 65 72 5f 61 6c 6c 0a 2a 2a 0a 2a 2a 20 55  ster_all.**.** U
21e30 6e 72 65 67 69 73 74 65 72 20 61 6c 6c 20 56 46  nregister all VF
21e40 53 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Ses..*/.static i
21e50 6e 74 20 76 66 73 5f 75 6e 72 65 67 69 73 74 65  nt vfs_unregiste
21e60 72 5f 61 6c 6c 28 0a 20 20 43 6c 69 65 6e 74 44  r_all(.  ClientD
21e70 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
21e80 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
21e90 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
21ea0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
21eb0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
21ec0 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
21ed0 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
21ee0 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
21ef0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
21f00 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
21f10 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
21f20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
21f30 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
21f40 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
21f50 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
21f60 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
21f70 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
21f80 28 61 70 56 66 73 29 3b 20 69 2b 2b 29 7b 0a 20  (apVfs); i++){. 
21f90 20 20 20 61 70 56 66 73 5b 69 5d 20 3d 20 73 71     apVfs[i] = sq
21fa0 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
21fb0 29 3b 0a 20 20 20 20 69 66 28 20 61 70 56 66 73  );.    if( apVfs
21fc0 5b 69 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  [i]==0 ) break;.
21fd0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f      sqlite3_vfs_
21fe0 75 6e 72 65 67 69 73 74 65 72 28 61 70 56 66 73  unregister(apVfs
21ff0 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 6e 56 66 73  [i]);.  }.  nVfs
22000 20 3d 20 69 3b 0a 20 20 72 65 74 75 72 6e 20 54   = i;.  return T
22010 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74  CL_OK;.}./*.** t
22020 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f 72 65 72  clcmd:   vfs_rer
22030 65 67 69 73 74 65 72 5f 61 6c 6c 0a 2a 2a 0a 2a  egister_all.**.*
22040 2a 20 52 65 73 74 6f 72 65 20 61 6c 6c 20 56 46  * Restore all VF
22050 53 65 73 20 74 68 61 74 20 77 65 72 65 20 72 65  Ses that were re
22060 6d 6f 76 65 64 20 75 73 69 6e 67 20 76 66 73 5f  moved using vfs_
22070 75 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c 0a 2a  unregister_all.*
22080 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73  /.static int vfs
22090 5f 72 65 72 65 67 69 73 74 65 72 5f 61 6c 6c 28  _reregister_all(
220a0 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
220b0 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
220c0 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
220d0 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
220e0 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
220f0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
22100 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
22110 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
22120 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
22130 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
22140 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22150 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
22160 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
22170 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
22180 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
22190 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ents */.){.  int
221a0 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
221b0 3c 6e 56 66 73 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nVfs; i++){.   
221c0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
221d0 69 73 74 65 72 28 61 70 56 66 73 5b 69 5d 2c 20  ister(apVfs[i], 
221e0 69 3d 3d 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  i==0);.  }.  ret
221f0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
22200 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
22210 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73  file_control_tes
22220 74 20 44 42 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  t DB.**.** This 
22230 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73  TCL command runs
22240 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
22250 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66  e_control interf
22260 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66  ace and.** verif
22270 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72  ies correct oper
22280 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d  ation of the sam
22290 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
222a0 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65   file_control_te
222b0 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  st(.  ClientData
222c0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
222d0 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
222e0 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
222f0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
22300 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
22310 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
22320 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
22330 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
22340 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
22350 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
22360 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
22370 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
22380 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
22390 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
223a0 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
223b0 69 6e 74 20 69 41 72 67 20 3d 20 30 3b 0a 20 20  int iArg = 0;.  
223c0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
223d0 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
223e0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
223f0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
22400 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
22410 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
22420 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
22430 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
22440 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
22450 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
22460 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
22470 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
22480 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
22490 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
224a0 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
224b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
224c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
224d0 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 30  le_control(db, 0
224e0 2c 20 30 2c 20 26 69 41 72 67 29 3b 0a 20 20 61  , 0, &iArg);.  a
224f0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
22500 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 3b 0a 20 20  E_NOTFOUND );.  
22510 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
22520 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6e  e_control(db, "n
22530 6f 74 61 64 61 74 61 62 61 73 65 22 2c 20 53 51  otadatabase", SQ
22540 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53  LITE_FCNTL_LOCKS
22550 54 41 54 45 2c 20 26 69 41 72 67 29 3b 0a 20 20  TATE, &iArg);.  
22560 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
22570 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 72 63  TE_ERROR );.  rc
22580 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
22590 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6d 61 69  control(db, "mai
225a0 6e 22 2c 20 2d 31 2c 20 26 69 41 72 67 29 3b 0a  n", -1, &iArg);.
225b0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
225c0 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 3b  LITE_NOTFOUND );
225d0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
225e0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
225f0 20 22 74 65 6d 70 22 2c 20 2d 31 2c 20 26 69 41   "temp", -1, &iA
22600 72 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  rg);.  assert( r
22610 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  c==SQLITE_NOTFOU
22620 4e 44 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  ND || rc==SQLITE
22630 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20 72 65 74  _ERROR );..  ret
22640 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
22650 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
22660 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73  file_control_las
22670 74 65 72 72 6e 6f 5f 74 65 73 74 20 44 42 0a 2a  terrno_test DB.*
22680 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f  *.** This TCL co
22690 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73  mmand runs the s
226a0 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
226b0 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 61 6e  rol interface an
226c0 64 0a 2a 2a 20 76 65 72 69 66 69 65 73 20 63 6f  d.** verifies co
226d0 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20  rrect operation 
226e0 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 41  of the SQLITE_LA
226f0 53 54 5f 45 52 52 4e 4f 20 76 65 72 62 2e 0a 2a  ST_ERRNO verb..*
22700 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
22710 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72  e_control_laster
22720 72 6e 6f 5f 74 65 73 74 28 0a 20 20 43 6c 69 65  rno_test(.  Clie
22730 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
22740 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
22750 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
22760 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
22770 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
22780 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
22790 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
227a0 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
227b0 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
227c0 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
227d0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
227e0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
227f0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
22800 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
22810 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
22820 0a 29 7b 0a 20 20 69 6e 74 20 69 41 72 67 20 3d  .){.  int iArg =
22830 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   0;.  sqlite3 *d
22840 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  b;.  int rc;..  
22850 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
22860 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
22870 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
22880 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
22890 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
228a0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
228b0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
228c0 30 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20  0), " DB", 0);. 
228d0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
228e0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
228f0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
22900 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
22910 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
22920 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
22930 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
22940 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
22950 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55  e_control(db, NU
22960 4c 4c 2c 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f  LL, SQLITE_LAST_
22970 45 52 52 4e 4f 2c 20 26 69 41 72 67 29 3b 0a 20  ERRNO, &iArg);. 
22980 20 69 66 28 20 72 63 20 29 7b 20 0a 20 20 20 20   if( rc ){ .    
22990 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
229a0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
229b0 49 6e 74 4f 62 6a 28 72 63 29 29 3b 20 0a 20 20  IntObj(rc)); .  
229c0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
229d0 4f 52 3b 20 0a 20 20 7d 0a 20 20 69 66 28 20 69  OR; .  }.  if( i
229e0 41 72 67 21 3d 30 20 29 20 7b 0a 20 20 20 20 54  Arg!=0 ) {.    T
229f0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
22a00 69 6e 74 65 72 70 2c 20 22 55 6e 65 78 70 65 63  interp, "Unexpec
22a10 74 65 64 20 6e 6f 6e 2d 7a 65 72 6f 20 65 72 72  ted non-zero err
22a20 6e 6f 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20  no: ",.         
22a30 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
22a40 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
22a50 28 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 69  (Tcl_NewIntObj(i
22a60 41 72 67 29 2c 20 30 29 2c 20 22 20 22 2c 20 30  Arg), 0), " ", 0
22a70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
22a80 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
22a90 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a  eturn TCL_OK;  .
22aa0 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
22ab0 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
22ac0 63 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74 20 44  chunksize_test D
22ad0 42 20 44 42 4e 41 4d 45 20 53 49 5a 45 0a 2a 2a  B DBNAME SIZE.**
22ae0 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d  .** This TCL com
22af0 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71  mand runs the sq
22b00 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
22b10 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 61 6e 64  ol interface and
22b20 0a 2a 2a 20 76 65 72 69 66 69 65 73 20 63 6f 72  .** verifies cor
22b30 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  rect operation o
22b40 66 20 74 68 65 20 53 51 4c 49 54 45 5f 47 45 54  f the SQLITE_GET
22b50 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 61  _LOCKPROXYFILE a
22b60 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 45 54  nd.** SQLITE_SET
22b70 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 76  _LOCKPROXYFILE v
22b80 65 72 62 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  erbs..*/.static 
22b90 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  int file_control
22ba0 5f 63 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74 28  _chunksize_test(
22bb0 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
22bc0 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
22bd0 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
22be0 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
22bf0 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
22c00 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
22c10 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
22c20 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
22c30 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
22c40 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
22c50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22c60 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
22c70 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
22c80 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
22c90 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
22ca0 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ents */.){.  int
22cb0 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   nSize;         
22cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22cd0 4e 65 77 20 63 68 75 6e 6b 20 73 69 7a 65 20 2a  New chunk size *
22ce0 2f 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 20 20  /.  char *zDb;  
22cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d00 20 20 20 20 2f 2a 20 44 62 20 6e 61 6d 65 20 28      /* Db name (
22d10 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20 65  "main", "temp" e
22d20 74 63 2e 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tc.) */.  sqlite
22d30 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
22d40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
22d50 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
22d60 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
22d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d80 20 20 2f 2a 20 66 69 6c 65 5f 63 6f 6e 74 72 6f    /* file_contro
22d90 6c 28 29 20 72 65 74 75 72 6e 20 63 6f 64 65 20  l() return code 
22da0 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  */..  if( objc!=
22db0 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  4 ){.    Tcl_Wro
22dc0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
22dd0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44  , 1, objv, "DB D
22de0 42 4e 41 4d 45 20 53 49 5a 45 22 29 3b 0a 20 20  BNAME SIZE");.  
22df0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
22e00 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
22e10 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
22e20 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
22e30 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
22e40 0a 20 20 20 7c 7c 20 54 63 6c 5f 47 65 74 49 6e  .   || Tcl_GetIn
22e50 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
22e60 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 69 7a 65   objv[3], &nSize
22e70 29 0a 20 20 29 7b 0a 20 20 20 72 65 74 75 72 6e  ).  ){.   return
22e80 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
22e90 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53    zDb = Tcl_GetS
22ea0 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
22eb0 20 20 69 66 28 20 7a 44 62 5b 30 5d 3d 3d 27 5c    if( zDb[0]=='\
22ec0 30 27 20 29 20 7a 44 62 20 3d 20 4e 55 4c 4c 3b  0' ) zDb = NULL;
22ed0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
22ee0 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
22ef0 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46 43  , zDb, SQLITE_FC
22f00 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 2c 20  NTL_CHUNK_SIZE, 
22f10 28 76 6f 69 64 20 2a 29 26 6e 53 69 7a 65 29 3b  (void *)&nSize);
22f20 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
22f30 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
22f40 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73  nterp, (char *)s
22f50 71 6c 69 74 65 33 54 65 73 74 45 72 72 6f 72 4e  qlite3TestErrorN
22f60 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
22f70 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  TIC);.    return
22f80 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
22f90 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
22fa0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
22fb0 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  :   file_control
22fc0 5f 73 69 7a 65 68 69 6e 74 5f 74 65 73 74 20 44  _sizehint_test D
22fd0 42 20 44 42 4e 41 4d 45 20 53 49 5a 45 0a 2a 2a  B DBNAME SIZE.**
22fe0 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d  .** This TCL com
22ff0 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71  mand runs the sq
23000 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
23010 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 0a 2a 2a  ol interface .**
23020 20 77 69 74 68 20 53 51 4c 49 54 45 5f 46 43 4e   with SQLITE_FCN
23030 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 0a 2a 2f 0a  TL_SIZE_HINT.*/.
23040 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f  static int file_
23050 63 6f 6e 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74  control_sizehint
23060 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44  _test(.  ClientD
23070 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
23080 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
23090 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
230a0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
230b0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
230c0 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
230d0 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
230e0 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
230f0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
23100 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
23110 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
23120 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
23130 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
23140 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
23150 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
23160 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
23170 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   nSize;         
23180 20 20 20 2f 2a 20 48 69 6e 74 65 64 20 73 69 7a     /* Hinted siz
23190 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 62  e */.  char *zDb
231a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
231b0 20 20 20 20 20 20 20 2f 2a 20 44 62 20 6e 61 6d         /* Db nam
231c0 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70  e ("main", "temp
231d0 22 20 65 74 63 2e 29 20 2a 2f 0a 20 20 73 71 6c  " etc.) */.  sql
231e0 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
231f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23200 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
23210 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
23220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23230 20 20 20 20 20 2f 2a 20 66 69 6c 65 5f 63 6f 6e       /* file_con
23240 74 72 6f 6c 28 29 20 72 65 74 75 72 6e 20 63 6f  trol() return co
23250 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a  de */..  if( obj
23260 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
23270 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
23280 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
23290 42 20 44 42 4e 41 4d 45 20 53 49 5a 45 22 29 3b  B DBNAME SIZE");
232a0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
232b0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
232c0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
232d0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
232e0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
232f0 62 29 20 0a 20 20 20 7c 7c 20 54 63 6c 5f 47 65  b) .   || Tcl_Ge
23300 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28  tWideIntFromObj(
23310 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
23320 20 26 6e 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20   &nSize).  ){.  
23330 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
23340 52 3b 0a 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54  R;.  }.  zDb = T
23350 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
23360 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 7a 44 62  v[2]);.  if( zDb
23370 5b 30 5d 3d 3d 27 5c 30 27 20 29 20 7a 44 62 20  [0]=='\0' ) zDb 
23380 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 72 63 20 3d 20  = NULL;..  rc = 
23390 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
233a0 74 72 6f 6c 28 64 62 2c 20 7a 44 62 2c 20 53 51  trol(db, zDb, SQ
233b0 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
233c0 48 49 4e 54 2c 20 28 76 6f 69 64 20 2a 29 26 6e  HINT, (void *)&n
233d0 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Size);.  if( rc 
233e0 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
233f0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
23400 61 72 20 2a 29 73 71 6c 69 74 65 33 54 65 73 74  ar *)sqlite3Test
23410 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
23420 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  CL_STATIC);.    
23430 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
23440 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
23450 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
23460 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63  tclcmd:   file_c
23470 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79  ontrol_lockproxy
23480 5f 74 65 73 74 20 44 42 20 50 57 44 0a 2a 2a 0a  _test DB PWD.**.
23490 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d  ** This TCL comm
234a0 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c  and runs the sql
234b0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
234c0 6c 20 69 6e 74 65 72 66 61 63 65 20 61 6e 64 0a  l interface and.
234d0 2a 2a 20 76 65 72 69 66 69 65 73 20 63 6f 72 72  ** verifies corr
234e0 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  ect operation of
234f0 20 74 68 65 20 53 51 4c 49 54 45 5f 47 45 54 5f   the SQLITE_GET_
23500 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 61 6e  LOCKPROXYFILE an
23510 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 45 54 5f  d.** SQLITE_SET_
23520 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 76 65  LOCKPROXYFILE ve
23530 72 62 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rbs..*/.static i
23540 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  nt file_control_
23550 6c 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74 28 0a  lockproxy_test(.
23560 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
23570 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
23580 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
23590 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
235a0 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
235b0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
235c0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
235d0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
235e0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
235f0 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
23600 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
23610 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
23620 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
23630 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
23640 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
23650 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
23660 74 65 33 20 2a 64 62 3b 0a 20 20 0a 20 20 69 66  te3 *db;.  .  if
23670 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
23680 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
23690 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
236a0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
236b0 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
236c0 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
236d0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
236e0 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
236f0 20 44 42 20 50 57 44 22 2c 20 30 29 3b 0a 20 20   DB PWD", 0);.  
23700 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
23710 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
23720 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
23730 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
23740 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
23750 29 7b 0a 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ){.   return TCL
23760 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 23  _ERROR;.  }.  .#
23770 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
23780 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
23790 47 5f 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64  G_STYLE).#  if d
237a0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
237b0 29 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51  ).#    define SQ
237c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
237d0 49 4e 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65  ING_STYLE 1.#  e
237e0 6c 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20  lse.#    define 
237f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
23800 43 4b 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20  CKING_STYLE 0.# 
23810 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69   endif.#endif.#i
23820 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
23830 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
23840 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
23850 5f 5f 29 0a 20 20 7b 0a 20 20 20 20 63 68 61 72  __).  {.    char
23860 20 2a 74 65 73 74 50 61 74 68 3b 0a 20 20 20 20   *testPath;.    
23870 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20  int rc;.    int 
23880 6e 50 77 64 3b 0a 20 20 20 20 63 6f 6e 73 74 20  nPwd;.    const 
23890 63 68 61 72 20 2a 7a 50 77 64 3b 0a 20 20 20 20  char *zPwd;.    
238a0 63 68 61 72 20 70 72 6f 78 79 50 61 74 68 5b 34  char proxyPath[4
238b0 30 30 5d 3b 0a 20 20 20 20 0a 20 20 20 20 7a 50  00];.    .    zP
238c0 77 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  wd = Tcl_GetStri
238d0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
238e0 5d 2c 20 26 6e 50 77 64 29 3b 0a 20 20 20 20 69  ], &nPwd);.    i
238f0 66 28 20 73 69 7a 65 6f 66 28 70 72 6f 78 79 50  f( sizeof(proxyP
23900 61 74 68 29 3c 6e 50 77 64 2b 32 30 20 29 7b 0a  ath)<nPwd+20 ){.
23910 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
23920 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
23930 50 57 44 20 74 6f 6f 20 62 69 67 22 2c 20 28 76  PWD too big", (v
23940 6f 69 64 2a 29 30 29 3b 0a 20 20 20 20 20 20 72  oid*)0);.      r
23950 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
23960 0a 20 20 20 20 7d 0a 20 20 20 20 73 70 72 69 6e  .    }.    sprin
23970 74 66 28 70 72 6f 78 79 50 61 74 68 2c 20 22 25  tf(proxyPath, "%
23980 73 2f 74 65 73 74 2e 70 72 6f 78 79 22 2c 20 7a  s/test.proxy", z
23990 50 77 64 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  Pwd);.    rc = s
239a0 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
239b0 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51  rol(db, NULL, SQ
239c0 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_SET_LOCKPRO
239d0 58 59 46 49 4c 45 2c 20 70 72 6f 78 79 50 61 74  XYFILE, proxyPat
239e0 68 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  h);.    if( rc )
239f0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f  {.      Tcl_SetO
23a00 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
23a10 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72   Tcl_NewIntObj(r
23a20 63 29 29 3b 20 0a 20 20 20 20 20 20 72 65 74 75  c)); .      retu
23a30 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
23a40 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
23a50 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
23a60 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49  l(db, NULL, SQLI
23a70 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_GET_LOCKPROXY
23a80 46 49 4c 45 2c 20 26 74 65 73 74 50 61 74 68 29  FILE, &testPath)
23a90 3b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d  ;.    if( strncm
23aa0 70 28 70 72 6f 78 79 50 61 74 68 2c 74 65 73 74  p(proxyPath,test
23ab0 50 61 74 68 2c 31 31 29 20 29 7b 0a 20 20 20 20  Path,11) ){.    
23ac0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
23ad0 6c 74 28 69 6e 74 65 72 70 2c 20 22 4c 6f 63 6b  lt(interp, "Lock
23ae0 20 70 72 6f 78 79 20 66 69 6c 65 20 64 69 64 20   proxy file did 
23af0 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 22 0a  not match the ".
23b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
23b20 70 72 65 76 69 6f 75 73 6c 79 20 61 73 73 69 67  previously assig
23b30 6e 65 64 20 76 61 6c 75 65 22 2c 20 30 29 3b 0a  ned value", 0);.
23b40 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
23b50 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
23b60 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
23b70 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
23b80 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
23b90 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a 20  ewIntObj(rc));. 
23ba0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
23bb0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
23bc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
23bd0 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e  le_control(db, N
23be0 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f  ULL, SQLITE_SET_
23bf0 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 70  LOCKPROXYFILE, p
23c00 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 69  roxyPath);.    i
23c10 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54  f( rc ){.      T
23c20 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
23c30 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
23c40 6e 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20 20 20  ntObj(rc));.    
23c50 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
23c60 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  OR;.    }.  }.#e
23c70 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43  ndif.  return TC
23c80 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  L_OK;  .}../*.**
23c90 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f   tclcmd:   file_
23ca0 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 61 76  control_win32_av
23cb0 5f 72 65 74 72 79 20 44 42 20 20 4e 52 45 54 52  _retry DB  NRETR
23cc0 59 20 20 44 45 4c 41 59 0a 2a 2a 0a 2a 2a 20 54  Y  DELAY.**.** T
23cd0 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20  his TCL command 
23ce0 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33  runs the sqlite3
23cf0 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e  _file_control in
23d00 74 65 72 66 61 63 65 20 77 69 74 68 0a 2a 2a 20  terface with.** 
23d10 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  the SQLITE_FCNTL
23d20 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52 59 20  _WIN32_AV_RETRY 
23d30 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  opcode..*/.stati
23d40 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72  c int file_contr
23d50 6f 6c 5f 77 69 6e 33 32 5f 61 76 5f 72 65 74 72  ol_win32_av_retr
23d60 79 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  y(.  ClientData 
23d70 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
23d80 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
23d90 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
23da0 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
23db0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
23dc0 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
23dd0 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
23de0 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
23df0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
23e00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
23e10 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
23e20 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
23e30 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
23e40 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
23e50 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73  uments */.){.  s
23e60 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
23e70 74 20 72 63 3b 0a 20 20 69 6e 74 20 61 5b 32 5d  t rc;.  int a[2]
23e80 3b 0a 20 20 63 68 61 72 20 7a 5b 31 30 30 5d 3b  ;.  char z[100];
23e90 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20  ..  if( objc!=4 
23ea0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
23eb0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
23ec0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
23ed0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
23ee0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
23ef0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
23f00 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 4e 52 45  0], 0), " DB NRE
23f10 54 52 59 20 44 45 4c 41 59 22 2c 20 30 29 3b 0a  TRY DELAY", 0);.
23f20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
23f30 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
23f40 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
23f50 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
23f60 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
23f70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
23f80 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
23f90 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
23fa0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
23fb0 62 6a 76 5b 32 5d 2c 20 26 61 5b 30 5d 29 20 29  bjv[2], &a[0]) )
23fc0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
23fd0 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
23fe0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
23ff0 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 61 5b 31  p, objv[3], &a[1
24000 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  ]) ) return TCL_
24010 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
24020 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
24030 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c  ol(db, NULL, SQL
24040 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f  ITE_FCNTL_WIN32_
24050 41 56 5f 52 45 54 52 59 2c 20 28 76 6f 69 64 2a  AV_RETRY, (void*
24060 29 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  )a);.  sqlite3_s
24070 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
24080 29 2c 20 7a 2c 20 22 25 64 20 25 64 20 25 64 22  ), z, "%d %d %d"
24090 2c 20 72 63 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d  , rc, a[0], a[1]
240a0 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
240b0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c  esult(interp, z,
240c0 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 72 65   (char*)0);.  re
240d0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d  turn TCL_OK;  .}
240e0 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
240f0 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70    file_control_p
24100 65 72 73 69 73 74 5f 77 61 6c 20 44 42 20 50 45  ersist_wal DB PE
24110 52 53 49 53 54 2d 46 4c 41 47 0a 2a 2a 0a 2a 2a  RSIST-FLAG.**.**
24120 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e   This TCL comman
24130 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74  d runs the sqlit
24140 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20  e3_file_control 
24150 69 6e 74 65 72 66 61 63 65 20 77 69 74 68 0a 2a  interface with.*
24160 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e  * the SQLITE_FCN
24170 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 6f  TL_PERSIST_WAL o
24180 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  pcode..*/.static
24190 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f   int file_contro
241a0 6c 5f 70 65 72 73 69 73 74 5f 77 61 6c 28 0a 20  l_persist_wal(. 
241b0 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
241c0 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
241d0 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
241e0 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
241f0 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
24200 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
24210 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
24220 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
24230 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
24240 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
24250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
24260 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
24270 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
24280 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
24290 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
242a0 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
242b0 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
242c0 3b 0a 20 20 69 6e 74 20 62 50 65 72 73 69 73 74  ;.  int bPersist
242d0 3b 0a 20 20 63 68 61 72 20 7a 5b 31 30 30 5d 3b  ;.  char z[100];
242e0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
242f0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
24300 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
24310 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
24320 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
24330 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
24340 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
24350 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 46 4c 41  0], 0), " DB FLA
24360 47 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  G", 0);.    retu
24370 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
24380 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
24390 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
243a0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
243b0 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20  1]), &db) ){.   
243c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
243d0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c  R;.  }.  if( Tcl
243e0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
243f0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
24400 26 62 50 65 72 73 69 73 74 29 20 29 20 72 65 74  &bPersist) ) ret
24410 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
24420 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
24430 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e  le_control(db, N
24440 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  ULL, SQLITE_FCNT
24450 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28  L_PERSIST_WAL, (
24460 76 6f 69 64 2a 29 26 62 50 65 72 73 69 73 74 29  void*)&bPersist)
24470 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ;.  sqlite3_snpr
24480 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20  intf(sizeof(z), 
24490 7a 2c 20 22 25 64 20 25 64 22 2c 20 72 63 2c 20  z, "%d %d", rc, 
244a0 62 50 65 72 73 69 73 74 29 3b 0a 20 20 54 63 6c  bPersist);.  Tcl
244b0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
244c0 74 65 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29  terp, z, (char*)
244d0 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
244e0 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _OK;  .}../*.** 
244f0 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63  tclcmd:   file_c
24500 6f 6e 74 72 6f 6c 5f 70 6f 77 65 72 73 61 66 65  ontrol_powersafe
24510 5f 6f 76 65 72 77 72 69 74 65 20 44 42 20 50 53  _overwrite DB PS
24520 4f 57 2d 46 4c 41 47 0a 2a 2a 0a 2a 2a 20 54 68  OW-FLAG.**.** Th
24530 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72  is TCL command r
24540 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f  uns the sqlite3_
24550 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74  file_control int
24560 65 72 66 61 63 65 20 77 69 74 68 0a 2a 2a 20 74  erface with.** t
24570 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  he SQLITE_FCNTL_
24580 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
24590 49 54 45 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73  ITE opcode..*/.s
245a0 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63  tatic int file_c
245b0 6f 6e 74 72 6f 6c 5f 70 6f 77 65 72 73 61 66 65  ontrol_powersafe
245c0 5f 6f 76 65 72 77 72 69 74 65 28 0a 20 20 43 6c  _overwrite(.  Cl
245d0 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
245e0 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
245f0 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
24600 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
24610 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
24620 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
24630 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
24640 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
24650 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
24660 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
24670 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
24680 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
24690 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
246a0 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
246b0 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
246c0 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
246d0 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *db;.  int rc;. 
246e0 20 69 6e 74 20 62 3b 0a 20 20 63 68 61 72 20 7a   int b;.  char z
246f0 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62  [100];..  if( ob
24700 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
24710 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
24720 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
24730 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
24740 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
24750 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
24760 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
24770 44 42 20 46 4c 41 47 22 2c 20 30 29 3b 0a 20 20  DB FLAG", 0);.  
24780 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
24790 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
247a0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
247b0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
247c0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
247d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
247e0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
247f0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
24800 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
24810 76 5b 32 5d 2c 20 26 62 29 20 29 20 72 65 74 75  v[2], &b) ) retu
24820 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
24830 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
24840 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 4e 55 4c  e_control(db,NUL
24850 4c 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  L,SQLITE_FCNTL_P
24860 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
24870 54 45 2c 28 76 6f 69 64 2a 29 26 62 29 3b 0a 20  TE,(void*)&b);. 
24880 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
24890 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20  f(sizeof(z), z, 
248a0 22 25 64 20 25 64 22 2c 20 72 63 2c 20 62 29 3b  "%d %d", rc, b);
248b0 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
248c0 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 28  ult(interp, z, (
248d0 63 68 61 72 2a 29 30 29 3b 0a 20 20 72 65 74 75  char*)0);.  retu
248e0 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a  rn TCL_OK;  .}..
248f0 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
24900 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66   file_control_vf
24910 73 6e 61 6d 65 20 44 42 20 3f 41 55 58 44 42 3f  sname DB ?AUXDB?
24920 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  .**.** Return a 
24930 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
24940 72 69 62 65 73 20 74 68 65 20 73 74 61 63 6b 20  ribes the stack 
24950 6f 66 20 56 46 53 65 73 2e 0a 2a 2f 0a 73 74 61  of VFSes..*/.sta
24960 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e  tic int file_con
24970 74 72 6f 6c 5f 76 66 73 6e 61 6d 65 28 0a 20 20  trol_vfsname(.  
24980 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
24990 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
249a0 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
249b0 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
249c0 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
249d0 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
249e0 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
249f0 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
24a00 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
24a10 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
24a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
24a30 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
24a40 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
24a50 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
24a60 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
24a70 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
24a80 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
24a90 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 22  har *zDbName = "
24aa0 6d 61 69 6e 22 3b 0a 20 20 63 68 61 72 20 2a 7a  main";.  char *z
24ab0 56 66 73 4e 61 6d 65 20 3d 20 30 3b 0a 0a 20 20  VfsName = 0;..  
24ac0 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f  if( objc!=2 && o
24ad0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
24ae0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
24af0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
24b00 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
24b10 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
24b20 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
24b30 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
24b40 20 44 42 20 3f 41 55 58 44 42 3f 22 2c 20 30 29   DB ?AUXDB?", 0)
24b50 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
24b60 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
24b70 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
24b80 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
24b90 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
24ba0 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
24bb0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
24bc0 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29  .  if( objc==3 )
24bd0 7b 0a 20 20 20 20 7a 44 62 4e 61 6d 65 20 3d 20  {.    zDbName = 
24be0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
24bf0 6a 76 5b 32 5d 29 3b 0a 20 20 7d 0a 20 20 73 71  jv[2]);.  }.  sq
24c00 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
24c10 6f 6c 28 64 62 2c 20 7a 44 62 4e 61 6d 65 2c 20  ol(db, zDbName, 
24c20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53  SQLITE_FCNTL_VFS
24c30 4e 41 4d 45 2c 28 76 6f 69 64 2a 29 26 7a 56 66  NAME,(void*)&zVf
24c40 73 4e 61 6d 65 29 3b 0a 20 20 54 63 6c 5f 41 70  sName);.  Tcl_Ap
24c50 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
24c60 70 2c 20 7a 56 66 73 4e 61 6d 65 2c 20 28 63 68  p, zVfsName, (ch
24c70 61 72 2a 29 30 29 3b 0a 20 20 73 71 6c 69 74 65  ar*)0);.  sqlite
24c80 33 5f 66 72 65 65 28 7a 56 66 73 4e 61 6d 65 29  3_free(zVfsName)
24c90 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
24ca0 4b 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74  K;  .}.../*.** t
24cb0 63 6c 63 6d 64 3a 20 20 20 73 71 6c 69 74 65 33  clcmd:   sqlite3
24cc0 5f 76 66 73 5f 6c 69 73 74 0a 2a 2a 0a 2a 2a 20  _vfs_list.**.** 
24cd0 20 20 52 65 74 75 72 6e 20 61 20 74 63 6c 20 6c    Return a tcl l
24ce0 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ist containing t
24cf0 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20  he names of all 
24d00 72 65 67 69 73 74 65 72 65 64 20 76 66 73 27 73  registered vfs's
24d10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24d20 76 66 73 5f 6c 69 73 74 28 0a 20 20 43 6c 69 65  vfs_list(.  Clie
24d30 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
24d40 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
24d50 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
24d60 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
24d70 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
24d80 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
24d90 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
24da0 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
24db0 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
24dc0 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
24dd0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
24de0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
24df0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
24e00 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
24e10 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
24e20 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  .){.  sqlite3_vf
24e30 73 20 2a 70 56 66 73 3b 0a 20 20 54 63 6c 5f 4f  s *pVfs;.  Tcl_O
24e40 62 6a 20 2a 70 52 65 74 20 3d 20 54 63 6c 5f 4e  bj *pRet = Tcl_N
24e50 65 77 4f 62 6a 28 29 3b 0a 20 20 69 66 28 20 6f  ewObj();.  if( o
24e60 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63  bjc!=1 ){.    Tc
24e70 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
24e80 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
24e90 22 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  "");.    return 
24ea0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
24eb0 20 66 6f 72 28 70 56 66 73 3d 73 71 6c 69 74 65   for(pVfs=sqlite
24ec0 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 20 70  3_vfs_find(0); p
24ed0 56 66 73 3b 20 70 56 66 73 3d 70 56 66 73 2d 3e  Vfs; pVfs=pVfs->
24ee0 70 4e 65 78 74 29 7b 0a 20 20 20 20 54 63 6c 5f  pNext){.    Tcl_
24ef0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
24f00 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
24f10 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  t, Tcl_NewString
24f20 4f 62 6a 28 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c  Obj(pVfs->zName,
24f30 20 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 54 63 6c   -1));.  }.  Tcl
24f40 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
24f50 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 72  terp, pRet);.  r
24f60 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a  eturn TCL_OK;  .
24f70 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
24f80 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74     sqlite3_limit
24f90 20 44 42 20 49 44 20 56 41 4c 55 45 0a 2a 2a 0a   DB ID VALUE.**.
24fa0 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d  ** This TCL comm
24fb0 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c  and runs the sql
24fc0 69 74 65 33 5f 6c 69 6d 69 74 20 69 6e 74 65 72  ite3_limit inter
24fd0 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69  face and.** veri
24fe0 66 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65  fies correct ope
24ff0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 61  ration of the sa
25000 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  me..*/.static in
25010 74 20 74 65 73 74 5f 6c 69 6d 69 74 28 0a 20 20  t test_limit(.  
25020 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
25030 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
25040 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
25050 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
25060 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
25070 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
25080 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
25090 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
250a0 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
250b0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
250c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
250d0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
250e0 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
250f0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
25100 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
25110 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
25120 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
25130 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
25140 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68  struct {.     ch
25150 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ar *zName;.     
25160 69 6e 74 20 69 64 3b 0a 20 20 7d 20 61 49 64 5b  int id;.  } aId[
25170 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 53 51 4c  ] = {.    { "SQL
25180 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48  ITE_LIMIT_LENGTH
25190 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
251a0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
251b0 47 54 48 20 20 20 20 20 20 20 20 20 20 20 20 20  GTH             
251c0 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
251d0 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e  TE_LIMIT_SQL_LEN
251e0 47 54 48 22 2c 20 20 20 20 20 20 20 20 20 20 53  GTH",          S
251f0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f  QLITE_LIMIT_SQL_
25200 4c 45 4e 47 54 48 20 20 20 20 20 20 20 20 20 20  LENGTH          
25210 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
25220 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 22 2c  E_LIMIT_COLUMN",
25230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
25240 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d  LITE_LIMIT_COLUM
25250 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
25260 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  },.    { "SQLITE
25270 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54  _LIMIT_EXPR_DEPT
25280 48 22 2c 20 20 20 20 20 20 20 20 20 20 53 51 4c  H",          SQL
25290 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44  ITE_LIMIT_EXPR_D
252a0 45 50 54 48 20 20 20 20 20 20 20 20 20 20 20 7d  EPTH           }
252b0 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f  ,.    { "SQLITE_
252c0 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  LIMIT_COMPOUND_S
252d0 45 4c 45 43 54 22 2c 20 20 20 20 20 53 51 4c 49  ELECT",     SQLI
252e0 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e  TE_LIMIT_COMPOUN
252f0 44 5f 53 45 4c 45 43 54 20 20 20 20 20 20 7d 2c  D_SELECT      },
25300 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c  .    { "SQLITE_L
25310 49 4d 49 54 5f 56 44 42 45 5f 4f 50 22 2c 20 20  IMIT_VDBE_OP",  
25320 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
25330 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 20  E_LIMIT_VDBE_OP 
25340 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
25350 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49      { "SQLITE_LI
25360 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MIT_FUNCTION_ARG
25370 22 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  ",        SQLITE
25380 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f  _LIMIT_FUNCTION_
25390 41 52 47 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  ARG         },. 
253a0 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d     { "SQLITE_LIM
253b0 49 54 5f 41 54 54 41 43 48 45 44 22 2c 20 20 20  IT_ATTACHED",   
253c0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
253d0 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44 20 20  LIMIT_ATTACHED  
253e0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
253f0 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49    { "SQLITE_LIMI
25400 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  T_LIKE_PATTERN_L
25410 45 4e 47 54 48 22 2c 20 53 51 4c 49 54 45 5f 4c  ENGTH", SQLITE_L
25420 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52  IMIT_LIKE_PATTER
25430 4e 5f 4c 45 4e 47 54 48 20 20 7d 2c 0a 20 20 20  N_LENGTH  },.   
25440 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54   { "SQLITE_LIMIT
25450 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
25460 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49  ",     SQLITE_LI
25470 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
25480 42 45 52 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  BER      },.    
25490 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  { "SQLITE_LIMIT_
254a0 54 52 49 47 47 45 52 5f 44 45 50 54 48 22 2c 20  TRIGGER_DEPTH", 
254b0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
254c0 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  IT_TRIGGER_DEPTH
254d0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 0a          },.    .
254e0 20 20 20 20 2f 2a 20 4f 75 74 20 6f 66 20 72 61      /* Out of ra
254f0 6e 67 65 20 74 65 73 74 20 63 61 73 65 73 20 2a  nge test cases *
25500 2f 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f  /.    { "SQLITE_
25510 4c 49 4d 49 54 5f 54 4f 4f 53 4d 41 4c 4c 22 2c  LIMIT_TOOSMALL",
25520 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20              -1, 
25530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
25550 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c  .    { "SQLITE_L
25560 49 4d 49 54 5f 54 4f 4f 42 49 47 22 2c 20 20 20  IMIT_TOOBIG",   
25570 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
25580 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f  E_LIMIT_TRIGGER_
25590 44 45 50 54 48 2b 31 20 20 20 20 20 20 7d 2c 0a  DEPTH+1      },.
255a0 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 69 64    };.  int i, id
255b0 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20 63  ;.  int val;.  c
255c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 0a  onst char *zId;.
255d0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29  .  if( objc!=4 )
255e0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
255f0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
25600 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
25610 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
25620 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
25630 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
25640 5d 2c 20 30 29 2c 20 22 20 44 42 20 49 44 20 56  ], 0), " DB ID V
25650 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20 20 72  ALUE", 0);.    r
25660 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
25670 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
25680 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
25690 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
256a0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
256b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
256c0 0a 20 20 7a 49 64 20 3d 20 54 63 6c 5f 47 65 74  .  zId = Tcl_Get
256d0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
256e0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
256f0 7a 65 6f 66 28 61 49 64 29 2f 73 69 7a 65 6f 66  zeof(aId)/sizeof
25700 28 61 49 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  (aId[0]); i++){.
25710 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
25720 49 64 2c 20 61 49 64 5b 69 5d 2e 7a 4e 61 6d 65  Id, aId[i].zName
25730 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 64  )==0 ){.      id
25740 20 3d 20 61 49 64 5b 69 5d 2e 69 64 3b 0a 20 20   = aId[i].id;.  
25750 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
25760 0a 20 20 7d 0a 20 20 69 66 28 20 69 3e 3d 73 69  .  }.  if( i>=si
25770 7a 65 6f 66 28 61 49 64 29 2f 73 69 7a 65 6f 66  zeof(aId)/sizeof
25780 28 61 49 64 5b 30 5d 29 20 29 7b 0a 20 20 20 20  (aId[0]) ){.    
25790 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
257a0 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77  (interp, "unknow
257b0 6e 20 6c 69 6d 69 74 20 74 79 70 65 3a 20 22 2c  n limit type: ",
257c0 20 7a 49 64 2c 20 28 63 68 61 72 2a 29 30 29 3b   zId, (char*)0);
257d0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
257e0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
257f0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
25800 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
25810 33 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75  3], &val) ) retu
25820 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
25830 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6c 69 6d  rc = sqlite3_lim
25840 69 74 28 64 62 2c 20 69 64 2c 20 76 61 6c 29 3b  it(db, id, val);
25850 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
25860 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
25870 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a  NewIntObj(rc));.
25880 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
25890 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63    .}../*.** tclc
258a0 6d 64 3a 20 20 73 61 76 65 5f 70 72 6e 67 5f 73  md:  save_prng_s
258b0 74 61 74 65 0a 2a 2a 0a 2a 2a 20 53 61 76 65 20  tate.**.** Save 
258c0 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
258d0 20 70 73 65 75 64 6f 2d 72 61 6e 64 6f 6d 20 6e   pseudo-random n
258e0 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72 2e  umber generator.
258f0 0a 2a 2a 20 41 74 20 74 68 65 20 73 61 6d 65 20  .** At the same 
25900 74 69 6d 65 2c 20 76 65 72 69 66 79 20 74 68 61  time, verify tha
25910 74 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  t sqlite3_test_c
25920 6f 6e 74 72 6f 6c 20 77 6f 72 6b 73 20 65 76 65  ontrol works eve
25930 6e 20 77 68 65 6e 0a 2a 2a 20 63 61 6c 6c 65 64  n when.** called
25940 20 77 69 74 68 20 61 6e 20 6f 75 74 2d 6f 66 2d   with an out-of-
25950 72 61 6e 67 65 20 6f 70 63 6f 64 65 2e 0a 2a 2f  range opcode..*/
25960 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
25970 5f 70 72 6e 67 5f 73 74 61 74 65 28 0a 20 20 43  _prng_state(.  C
25980 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
25990 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
259a0 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
259b0 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
259c0 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
259d0 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
259e0 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
259f0 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
25a00 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
25a10 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
25a20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
25a30 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
25a40 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
25a50 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
25a60 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
25a70 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
25a80 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  = sqlite3_test_c
25a90 6f 6e 74 72 6f 6c 28 39 39 39 39 29 3b 0a 20 20  ontrol(9999);.  
25aa0 61 73 73 65 72 74 28 20 72 63 3d 3d 30 20 29 3b  assert( rc==0 );
25ab0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
25ac0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 2d 31 29  test_control(-1)
25ad0 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
25ae0 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 74  0 );.  sqlite3_t
25af0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
25b00 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47  TE_TESTCTRL_PRNG
25b10 5f 53 41 56 45 29 3b 0a 20 20 72 65 74 75 72 6e  _SAVE);.  return
25b20 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a   TCL_OK;.}./*.**
25b30 20 74 63 6c 63 6d 64 3a 20 20 72 65 73 74 6f 72   tclcmd:  restor
25b40 65 5f 70 72 6e 67 5f 73 74 61 74 65 0a 2a 2f 0a  e_prng_state.*/.
25b50 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 74 6f  static int resto
25b60 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 28 0a 20  re_prng_state(. 
25b70 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
25b80 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
25b90 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
25ba0 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
25bb0 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
25bc0 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
25bd0 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
25be0 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
25bf0 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
25c00 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
25c10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
25c20 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
25c30 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
25c40 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
25c50 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
25c60 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
25c70 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
25c80 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
25c90 50 52 4e 47 5f 52 45 53 54 4f 52 45 29 3b 0a 20  PRNG_RESTORE);. 
25ca0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
25cb0 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  }./*.** tclcmd: 
25cc0 20 72 65 73 65 74 5f 70 72 6e 67 5f 73 74 61 74   reset_prng_stat
25cd0 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
25ce0 72 65 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65  reset_prng_state
25cf0 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
25d00 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
25d10 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
25d20 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
25d30 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
25d40 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
25d50 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
25d60 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
25d70 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
25d80 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
25d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25da0 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
25db0 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
25dc0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
25dd0 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
25de0 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
25df0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
25e00 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
25e10 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54 29 3b 0a  RL_PRNG_RESET);.
25e20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
25e30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
25e40 3a 20 20 70 63 61 63 68 65 5f 73 74 61 74 73 0a  :  pcache_stats.
25e50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
25e60 73 74 5f 70 63 61 63 68 65 5f 73 74 61 74 73 28  st_pcache_stats(
25e70 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
25e80 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
25e90 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
25ea0 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
25eb0 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
25ec0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
25ed0 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
25ee0 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
25ef0 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
25f00 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
25f10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25f20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
25f30 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
25f40 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
25f50 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
25f60 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ents */.){.  int
25f70 20 6e 4d 69 6e 3b 0a 20 20 69 6e 74 20 6e 4d 61   nMin;.  int nMa
25f80 78 3b 0a 20 20 69 6e 74 20 6e 43 75 72 72 65 6e  x;.  int nCurren
25f90 74 3b 0a 20 20 69 6e 74 20 6e 52 65 63 79 63 6c  t;.  int nRecycl
25fa0 61 62 6c 65 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  able;.  Tcl_Obj 
25fb0 2a 70 52 65 74 3b 0a 0a 20 20 73 71 6c 69 74 65  *pRet;..  sqlite
25fc0 33 50 63 61 63 68 65 53 74 61 74 73 28 26 6e 43  3PcacheStats(&nC
25fd0 75 72 72 65 6e 74 2c 20 26 6e 4d 61 78 2c 20 26  urrent, &nMax, &
25fe0 6e 4d 69 6e 2c 20 26 6e 52 65 63 79 63 6c 61 62  nMin, &nRecyclab
25ff0 6c 65 29 3b 0a 0a 20 20 70 52 65 74 20 3d 20 54  le);..  pRet = T
26000 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 54  cl_NewObj();.  T
26010 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
26020 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
26030 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pRet, Tcl_NewStr
26040 69 6e 67 4f 62 6a 28 22 63 75 72 72 65 6e 74 22  ingObj("current"
26050 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
26060 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
26070 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c  nt(interp, pRet,
26080 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e   Tcl_NewIntObj(n
26090 43 75 72 72 65 6e 74 29 29 3b 0a 20 20 54 63 6c  Current));.  Tcl
260a0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
260b0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
260c0 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  et, Tcl_NewStrin
260d0 67 4f 62 6a 28 22 6d 61 78 22 2c 20 2d 31 29 29  gObj("max", -1))
260e0 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
260f0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
26100 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  erp, pRet, Tcl_N
26110 65 77 49 6e 74 4f 62 6a 28 6e 4d 61 78 29 29 3b  ewIntObj(nMax));
26120 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
26130 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
26140 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  rp, pRet, Tcl_Ne
26150 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 69 6e 22  wStringObj("min"
26160 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
26170 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
26180 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c  nt(interp, pRet,
26190 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e   Tcl_NewIntObj(n
261a0 4d 69 6e 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  Min));.  Tcl_Lis
261b0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
261c0 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
261d0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
261e0 28 22 72 65 63 79 63 6c 61 62 6c 65 22 2c 20 2d  ("recyclable", -
261f0 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  1));.  Tcl_ListO
26200 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
26210 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63  interp, pRet, Tc
26220 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 52 65 63  l_NewIntObj(nRec
26230 79 63 6c 61 62 6c 65 29 29 3b 0a 0a 20 20 54 63  yclable));..  Tc
26240 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
26250 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 0a 20  nterp, pRet);.. 
26260 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
26270 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
26280 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e  _ENABLE_UNLOCK_N
26290 4f 54 49 46 59 0a 73 74 61 74 69 63 20 76 6f 69  OTIFY.static voi
262a0 64 20 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f  d test_unlock_no
262b0 74 69 66 79 5f 63 62 28 76 6f 69 64 20 2a 2a 61  tify_cb(void **a
262c0 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 29 7b 0a  Arg, int nArg){.
262d0 20 20 69 6e 74 20 69 69 3b 0a 20 20 66 6f 72 28    int ii;.  for(
262e0 69 69 3d 30 3b 20 69 69 3c 6e 41 72 67 3b 20 69  ii=0; ii<nArg; i
262f0 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 45 76  i++){.    Tcl_Ev
26300 61 6c 45 78 28 28 54 63 6c 5f 49 6e 74 65 72 70  alEx((Tcl_Interp
26310 20 2a 29 61 41 72 67 5b 69 69 5d 2c 20 22 75 6e   *)aArg[ii], "un
26320 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c 20 2d 31  lock_notify", -1
26330 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41  , TCL_EVAL_GLOBA
26340 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  L);.  }.}.#endif
26350 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
26360 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 20  E_UNLOCK_NOTIFY 
26370 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  */../*.** tclcmd
26380 3a 20 20 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63  :  sqlite3_unloc
26390 6b 5f 6e 6f 74 69 66 79 20 64 62 0a 2a 2f 0a 23  k_notify db.*/.#
263a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
263b0 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46  BLE_UNLOCK_NOTIF
263c0 59 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  Y.static int tes
263d0 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28  t_unlock_notify(
263e0 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
263f0 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75  ientData, /* Unu
26400 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  sed */.  Tcl_Int
26410 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
26420 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
26430 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
26440 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
26450 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
26460 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26470 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
26480 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
26490 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
264a0 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
264b0 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
264c0 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
264d0 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
264e0 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
264f0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
26500 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22  p, 1, objv, "DB"
26510 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
26520 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
26530 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
26540 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
26550 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
26560 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74   &db) ){.    ret
26570 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
26580 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
26590 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28  3_unlock_notify(
265a0 64 62 2c 20 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f  db, test_unlock_
265b0 6e 6f 74 69 66 79 5f 63 62 2c 20 28 76 6f 69 64  notify_cb, (void
265c0 20 2a 29 69 6e 74 65 72 70 29 3b 0a 20 20 54 63   *)interp);.  Tc
265d0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
265e0 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72  rp, (char *)t1Er
265f0 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c  rorName(rc), TCL
26600 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75  _STATIC);.  retu
26610 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e  rn TCL_OK;.}.#en
26620 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  dif../*.** tclcm
26630 64 3a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  d:  sqlite3_wal_
26640 63 68 65 63 6b 70 6f 69 6e 74 20 64 62 20 3f 4e  checkpoint db ?N
26650 41 4d 45 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 69  AME?.*/.static i
26660 6e 74 20 74 65 73 74 5f 77 61 6c 5f 63 68 65 63  nt test_wal_chec
26670 6b 70 6f 69 6e 74 28 0a 20 20 43 6c 69 65 6e 74  kpoint(.  Client
26680 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
26690 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20   /* Unused */.  
266a0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
266b0 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
266c0 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
266d0 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
266e0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
266f0 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
26700 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
26710 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
26720 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
26730 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
26740 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
26750 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  {.  char *zDb = 
26760 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  0;.  sqlite3 *db
26770 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
26780 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62  f( objc!=3 && ob
26790 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
267a0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
267b0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
267c0 44 42 20 3f 4e 41 4d 45 3f 22 29 3b 0a 20 20 20  DB ?NAME?");.   
267d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
267e0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
267f0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
26800 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
26810 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
26820 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
26830 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
26840 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20  f( objc==3 ){.  
26850 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53    zDb = Tcl_GetS
26860 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
26870 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
26880 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
26890 74 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 54 63  t(db, zDb);.  Tc
268a0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
268b0 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72  rp, (char *)t1Er
268c0 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c  rorName(rc), TCL
268d0 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75  _STATIC);.  retu
268e0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
268f0 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c  .** tclcmd:  sql
26900 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
26910 69 6e 74 5f 76 32 20 64 62 20 4d 4f 44 45 20 3f  int_v2 db MODE ?
26920 4e 41 4d 45 3f 0a 2a 2a 0a 2a 2a 20 54 68 69 73  NAME?.**.** This
26930 20 63 6f 6d 6d 61 6e 64 20 63 61 6c 6c 73 20 74   command calls t
26940 68 65 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  he wal_checkpoin
26950 74 5f 76 32 28 29 20 66 75 6e 63 74 69 6f 6e 20  t_v2() function 
26960 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69  with the specifi
26970 65 64 0a 2a 2a 20 6d 6f 64 65 20 61 72 67 75 6d  ed.** mode argum
26980 65 6e 74 20 28 70 61 73 73 69 76 65 2c 20 66 75  ent (passive, fu
26990 6c 6c 20 6f 72 20 72 65 73 74 61 72 74 29 2e 20  ll or restart). 
269a0 49 66 20 70 72 65 73 65 6e 74 2c 20 74 68 65 20  If present, the 
269b0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 0a 2a 2a  database name.**
269c0 20 4e 41 4d 45 20 69 73 20 70 61 73 73 65 64 20   NAME is passed 
269d0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
269e0 67 75 6d 65 6e 74 20 74 6f 20 77 61 6c 5f 63 68  gument to wal_ch
269f0 65 63 6b 70 6f 69 6e 74 5f 76 32 28 29 2e 20 49  eckpoint_v2(). I
26a00 66 20 69 74 20 74 68 65 0a 2a 2a 20 4e 41 4d 45  f it the.** NAME
26a10 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
26a20 20 70 72 65 73 65 6e 74 2c 20 61 20 4e 55 4c 4c   present, a NULL
26a30 20 70 6f 69 6e 74 65 72 20 69 73 20 70 61 73 73   pointer is pass
26a40 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
26a50 2a 20 49 66 20 77 61 6c 5f 63 68 65 63 6b 70 6f  * If wal_checkpo
26a60 69 6e 74 5f 76 32 28 29 20 72 65 74 75 72 6e 73  int_v2() returns
26a70 20 61 6e 79 20 76 61 6c 75 65 20 6f 74 68 65 72   any value other
26a80 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 55 53   than SQLITE_BUS
26a90 59 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  Y or.** SQLITE_O
26aa0 4b 2c 20 74 68 65 6e 20 74 68 69 73 20 63 6f 6d  K, then this com
26ab0 6d 61 6e 64 20 72 65 74 75 72 6e 73 20 54 43 4c  mand returns TCL
26ac0 5f 45 52 52 4f 52 2e 20 54 68 65 20 54 63 6c 20  _ERROR. The Tcl 
26ad0 72 65 73 75 6c 74 20 69 73 20 73 65 74 0a 2a 2a  result is set.**
26ae0 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 6d 65   to the error me
26af0 73 73 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66  ssage obtained f
26b00 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  rom sqlite3_errm
26b10 73 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  sg()..**.** Othe
26b20 72 77 69 73 65 2c 20 74 68 69 73 20 63 6f 6d 6d  rwise, this comm
26b30 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 6c 69  and returns a li
26b40 73 74 20 6f 66 20 74 68 72 65 65 20 69 6e 74 65  st of three inte
26b50 67 65 72 73 2e 20 54 68 65 20 66 69 72 73 74 20  gers. The first 
26b60 69 6e 74 65 67 65 72 0a 2a 2a 20 69 73 20 31 20  integer.** is 1 
26b70 69 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77  if SQLITE_BUSY w
26b80 61 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20  as returned, or 
26b90 30 20 6f 74 68 65 72 77 69 73 65 2e 20 54 68 65  0 otherwise. The
26ba0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 69   following two i
26bb0 6e 74 65 67 65 72 73 0a 2a 2a 20 61 72 65 20 74  ntegers.** are t
26bc0 68 65 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e  he values return
26bd0 65 64 20 76 69 61 20 74 68 65 20 6f 75 74 70 75  ed via the outpu
26be0 74 20 70 61 72 61 6d 61 74 65 72 73 20 62 79 20  t paramaters by 
26bf0 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76  wal_checkpoint_v
26c00 32 28 29 20 2d 0a 2a 2a 20 74 68 65 20 6e 75 6d  2() -.** the num
26c10 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20 69 6e  ber of frames in
26c20 20 74 68 65 20 6c 6f 67 20 61 6e 64 20 74 68 65   the log and the
26c30 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65   number of frame
26c40 73 20 69 6e 20 74 68 65 20 6c 6f 67 0a 2a 2a 20  s in the log.** 
26c50 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 63  that have been c
26c60 68 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2f 0a  heckpointed..*/.
26c70 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
26c80 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76  wal_checkpoint_v
26c90 32 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  2(.  ClientData 
26ca0 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55  clientData, /* U
26cb0 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49  nused */.  Tcl_I
26cc0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
26cd0 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
26ce0 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
26cf0 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
26d00 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
26d10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
26d20 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
26d30 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
26d40 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
26d50 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
26d60 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63  uments */.){.  c
26d70 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 0a 20 20  har *zDb = 0;.  
26d80 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
26d90 6e 74 20 72 63 3b 0a 0a 20 20 69 6e 74 20 65 4d  nt rc;..  int eM
26da0 6f 64 65 3b 0a 20 20 69 6e 74 20 6e 4c 6f 67 20  ode;.  int nLog 
26db0 3d 20 2d 35 35 35 3b 0a 20 20 69 6e 74 20 6e 43  = -555;.  int nC
26dc0 6b 70 74 20 3d 20 2d 35 35 35 3b 0a 20 20 54 63  kpt = -555;.  Tc
26dd0 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a 20 20  l_Obj *pRet;..  
26de0 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 61 4d 6f  const char * aMo
26df0 64 65 5b 5d 20 3d 20 7b 20 22 70 61 73 73 69 76  de[] = { "passiv
26e00 65 22 2c 20 22 66 75 6c 6c 22 2c 20 22 72 65 73  e", "full", "res
26e10 74 61 72 74 22 2c 20 30 20 7d 3b 0a 20 20 61 73  tart", 0 };.  as
26e20 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45  sert( SQLITE_CHE
26e30 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 3d  CKPOINT_PASSIVE=
26e40 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
26e50 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
26e60 54 5f 46 55 4c 4c 3d 3d 31 20 29 3b 0a 20 20 61  T_FULL==1 );.  a
26e70 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48  ssert( SQLITE_CH
26e80 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54  ECKPOINT_RESTART
26e90 3d 3d 32 20 29 3b 0a 0a 20 20 69 66 28 20 6f 62  ==2 );..  if( ob
26ea0 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 34  jc!=3 && objc!=4
26eb0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
26ec0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
26ed0 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 4d 4f   1, objv, "DB MO
26ee0 44 45 20 3f 4e 41 4d 45 3f 22 29 3b 0a 20 20 20  DE ?NAME?");.   
26ef0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
26f00 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f 62  R;.  }..  if( ob
26f10 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 7a 44 62  jc==4 ){.    zDb
26f20 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
26f30 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 7d 0a 20  (objv[3]);.  }. 
26f40 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
26f50 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
26f60 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
26f70 2c 20 26 64 62 29 0a 20 20 20 7c 7c 20 54 63 6c  , &db).   || Tcl
26f80 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a  _GetIndexFromObj
26f90 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
26fa0 2c 20 61 4d 6f 64 65 2c 20 22 6d 6f 64 65 22 2c  , aMode, "mode",
26fb0 20 30 2c 20 26 65 4d 6f 64 65 29 20 0a 20 20 29   0, &eMode) .  )
26fc0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
26fd0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72  _ERROR;.  }..  r
26fe0 63 20 3d 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  c = sqlite3_wal_
26ff0 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 64 62  checkpoint_v2(db
27000 2c 20 7a 44 62 2c 20 65 4d 6f 64 65 2c 20 26 6e  , zDb, eMode, &n
27010 4c 6f 67 2c 20 26 6e 43 6b 70 74 29 3b 0a 20 20  Log, &nCkpt);.  
27020 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27030 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
27040 42 55 53 59 20 29 7b 0a 20 20 20 20 54 63 6c 5f  BUSY ){.    Tcl_
27050 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
27060 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
27070 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 54 43  3_errmsg(db), TC
27080 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20  L_VOLATILE);.   
27090 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
270a0 52 3b 0a 20 20 7d 0a 0a 20 20 70 52 65 74 20 3d  R;.  }..  pRet =
270b0 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20   Tcl_NewObj();. 
270c0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
270d0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
270e0 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49  , pRet, Tcl_NewI
270f0 6e 74 4f 62 6a 28 72 63 3d 3d 53 51 4c 49 54 45  ntObj(rc==SQLITE
27100 5f 42 55 53 59 3f 31 3a 30 29 29 3b 0a 20 20 54  _BUSY?1:0));.  T
27110 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
27120 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
27130 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  pRet, Tcl_NewInt
27140 4f 62 6a 28 6e 4c 6f 67 29 29 3b 0a 20 20 54 63  Obj(nLog));.  Tc
27150 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
27160 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
27170 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  Ret, Tcl_NewIntO
27180 62 6a 28 6e 43 6b 70 74 29 29 3b 0a 20 20 54 63  bj(nCkpt));.  Tc
27190 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
271a0 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 0a 20  nterp, pRet);.. 
271b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
271c0 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
271d0 20 20 74 65 73 74 5f 73 71 6c 69 74 65 33 5f 6c    test_sqlite3_l
271e0 6f 67 20 3f 53 43 52 49 50 54 3f 0a 2a 2f 0a 73  og ?SCRIPT?.*/.s
271f0 74 61 74 69 63 20 73 74 72 75 63 74 20 4c 6f 67  tatic struct Log
27200 43 61 6c 6c 62 61 63 6b 20 7b 0a 20 20 54 63 6c  Callback {.  Tcl
27210 5f 49 6e 74 65 72 70 20 2a 70 49 6e 74 65 72 70  _Interp *pInterp
27220 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4f 62  ;.  Tcl_Obj *pOb
27230 6a 3b 0a 7d 20 6c 6f 67 63 61 6c 6c 62 61 63 6b  j;.} logcallback
27240 20 3d 20 7b 30 2c 20 30 7d 3b 0a 73 74 61 74 69   = {0, 0};.stati
27250 63 20 76 6f 69 64 20 78 4c 6f 67 63 61 6c 6c 62  c void xLogcallb
27260 61 63 6b 28 76 6f 69 64 20 2a 75 6e 75 73 65 64  ack(void *unused
27270 2c 20 69 6e 74 20 65 72 72 2c 20 63 68 61 72 20  , int err, char 
27280 2a 7a 4d 73 67 29 7b 0a 20 20 54 63 6c 5f 4f 62  *zMsg){.  Tcl_Ob
27290 6a 20 2a 70 4e 65 77 20 3d 20 54 63 6c 5f 44 75  j *pNew = Tcl_Du
272a0 70 6c 69 63 61 74 65 4f 62 6a 28 6c 6f 67 63 61  plicateObj(logca
272b0 6c 6c 62 61 63 6b 2e 70 4f 62 6a 29 3b 0a 20 20  llback.pObj);.  
272c0 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
272d0 28 70 4e 65 77 29 3b 0a 20 20 54 63 6c 5f 4c 69  (pNew);.  Tcl_Li
272e0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
272f0 6e 74 28 0a 20 20 20 20 20 20 30 2c 20 70 4e 65  nt(.      0, pNe
27300 77 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  w, Tcl_NewString
27310 4f 62 6a 28 73 71 6c 69 74 65 33 54 65 73 74 45  Obj(sqlite3TestE
27320 72 72 6f 72 4e 61 6d 65 28 65 72 72 29 2c 20 2d  rrorName(err), -
27330 31 29 0a 20 20 29 3b 0a 20 20 54 63 6c 5f 4c 69  1).  );.  Tcl_Li
27340 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
27350 6e 74 28 30 2c 20 70 4e 65 77 2c 20 54 63 6c 5f  nt(0, pNew, Tcl_
27360 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4d 73  NewStringObj(zMs
27370 67 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45  g, -1));.  Tcl_E
27380 76 61 6c 4f 62 6a 45 78 28 6c 6f 67 63 61 6c 6c  valObjEx(logcall
27390 62 61 63 6b 2e 70 49 6e 74 65 72 70 2c 20 70 4e  back.pInterp, pN
273a0 65 77 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f  ew, TCL_EVAL_GLO
273b0 42 41 4c 7c 54 43 4c 5f 45 56 41 4c 5f 44 49 52  BAL|TCL_EVAL_DIR
273c0 45 43 54 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72  ECT);.  Tcl_Decr
273d0 52 65 66 43 6f 75 6e 74 28 70 4e 65 77 29 3b 0a  RefCount(pNew);.
273e0 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  }.static int tes
273f0 74 5f 73 71 6c 69 74 65 33 5f 6c 6f 67 28 0a 20  t_sqlite3_log(. 
27400 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
27410 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
27420 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
27430 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
27440 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
27450 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
27460 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
27470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27480 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
27490 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
274a0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
274b0 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
274c0 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 66  ments */.){.  if
274d0 28 20 6f 62 6a 63 3e 32 20 29 7b 0a 20 20 20 20  ( objc>2 ){.    
274e0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
274f0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
27500 2c 20 22 53 43 52 49 50 54 22 29 3b 0a 20 20 20  , "SCRIPT");.   
27510 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
27520 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 67  R;.  }.  if( log
27530 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 20 29 7b  callback.pObj ){
27540 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
27550 43 6f 75 6e 74 28 6c 6f 67 63 61 6c 6c 62 61 63  Count(logcallbac
27560 6b 2e 70 4f 62 6a 29 3b 0a 20 20 20 20 6c 6f 67  k.pObj);.    log
27570 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 20 3d 20  callback.pObj = 
27580 30 3b 0a 20 20 20 20 6c 6f 67 63 61 6c 6c 62 61  0;.    logcallba
27590 63 6b 2e 70 49 6e 74 65 72 70 20 3d 20 30 3b 0a  ck.pInterp = 0;.
275a0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66      sqlite3_conf
275b0 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ig(SQLITE_CONFIG
275c0 5f 4c 4f 47 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  _LOG, 0, 0);.  }
275d0 0a 20 20 69 66 28 20 6f 62 6a 63 3e 31 20 29 7b  .  if( objc>1 ){
275e0 0a 20 20 20 20 6c 6f 67 63 61 6c 6c 62 61 63 6b  .    logcallback
275f0 2e 70 4f 62 6a 20 3d 20 6f 62 6a 76 5b 31 5d 3b  .pObj = objv[1];
27600 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
27610 43 6f 75 6e 74 28 6c 6f 67 63 61 6c 6c 62 61 63  Count(logcallbac
27620 6b 2e 70 4f 62 6a 29 3b 0a 20 20 20 20 6c 6f 67  k.pObj);.    log
27630 63 61 6c 6c 62 61 63 6b 2e 70 49 6e 74 65 72 70  callback.pInterp
27640 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 73   = interp;.    s
27650 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
27660 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 2c  LITE_CONFIG_LOG,
27670 20 78 4c 6f 67 63 61 6c 6c 62 61 63 6b 2c 20 30   xLogcallback, 0
27680 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
27690 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
276a0 20 20 20 20 20 74 63 6c 5f 6f 62 6a 70 72 6f 63       tcl_objproc
276b0 20 43 4f 4d 4d 41 4e 44 4e 41 4d 45 20 41 52 47   COMMANDNAME ARG
276c0 53 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 52 75 6e 20 61  S....**.** Run a
276d0 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 75 73 69   TCL command usi
276e0 6e 67 20 69 74 73 20 6f 62 6a 50 72 6f 63 20 69  ng its objProc i
276f0 6e 74 65 72 66 61 63 65 2e 20 20 54 68 72 6f 77  nterface.  Throw
27700 20 61 6e 20 65 72 72 6f 72 20 69 66 0a 2a 2a 20   an error if.** 
27710 74 68 65 20 63 6f 6d 6d 61 6e 64 20 68 61 73 20  the command has 
27720 6e 6f 20 6f 62 6a 50 72 6f 63 20 69 6e 74 65 72  no objProc inter
27730 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  face..*/.static 
27740 69 6e 74 20 72 75 6e 41 73 4f 62 6a 50 72 6f 63  int runAsObjProc
27750 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
27760 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
27770 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
27780 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
27790 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
277a0 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66  .){.  Tcl_CmdInf
277b0 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 69 66 28  o cmdInfo;.  if(
277c0 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54   objc<2 ){.    T
277d0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
277e0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
277f0 20 22 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b   "COMMAND ...");
27800 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
27810 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
27820 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64   !Tcl_GetCommand
27830 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 54 63 6c  Info(interp, Tcl
27840 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
27850 31 5d 29 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29  1]), &cmdInfo) )
27860 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
27870 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
27880 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e  command not foun
27890 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d: ",.          
278a0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
278b0 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29  bjv[1]), (char*)
278c0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
278d0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
278e0 69 66 28 20 63 6d 64 49 6e 66 6f 2e 6f 62 6a 50  if( cmdInfo.objP
278f0 72 6f 63 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63  roc==0 ){.    Tc
27900 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
27910 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20  nterp, "command 
27920 68 61 73 20 6e 6f 20 6f 62 6a 50 72 6f 63 3a 20  has no objProc: 
27930 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 54 63  ",.           Tc
27940 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
27950 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29 30 29 3b  [1]), (char*)0);
27960 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
27970 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
27980 75 72 6e 20 63 6d 64 49 6e 66 6f 2e 6f 62 6a 50  urn cmdInfo.objP
27990 72 6f 63 28 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43  roc(cmdInfo.objC
279a0 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e 74 65 72  lientData, inter
279b0 70 2c 20 6f 62 6a 63 2d 31 2c 20 6f 62 6a 76 2b  p, objc-1, objv+
279c0 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  1);.}..#ifndef S
279d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
279e0 49 4e 0a 2f 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47  IN./*.** WARNING
279f0 3a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  : The following 
27a00 66 75 6e 63 74 69 6f 6e 2c 20 70 72 69 6e 74 45  function, printE
27a10 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
27a20 29 20 69 73 20 61 6e 20 65 78 61 63 74 0a 2a 2a  ) is an exact.**
27a30 20 63 6f 70 79 20 6f 66 20 65 78 61 6d 70 6c 65   copy of example
27a40 20 63 6f 64 65 20 66 72 6f 6d 20 65 71 70 2e 69   code from eqp.i
27a50 6e 20 28 65 71 70 2e 68 74 6d 6c 29 2e 20 49 66  n (eqp.html). If
27a60 20 74 68 69 73 20 63 6f 64 65 20 69 73 20 6d 6f   this code is mo
27a70 64 69 66 69 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  dified,.** then 
27a80 74 68 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  the documentatio
27a90 6e 20 63 6f 70 79 20 6e 65 65 64 73 20 74 6f 20  n copy needs to 
27aa0 62 65 20 6d 6f 64 69 66 69 65 64 20 61 73 20 77  be modified as w
27ab0 65 6c 6c 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 72  ell..*/./*.** Ar
27ac0 67 75 6d 65 6e 74 20 70 53 74 6d 74 20 69 73 20  gument pStmt is 
27ad0 61 20 70 72 65 70 61 72 65 64 20 53 51 4c 20 73  a prepared SQL s
27ae0 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 66  tatement. This f
27af0 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 69 6c 65 73  unction compiles
27b00 0a 2a 2a 20 61 6e 20 45 58 50 4c 41 49 4e 20 51  .** an EXPLAIN Q
27b10 55 45 52 59 20 50 4c 41 4e 20 63 6f 6d 6d 61 6e  UERY PLAN comman
27b20 64 20 74 6f 20 72 65 70 6f 72 74 20 6f 6e 20 74  d to report on t
27b30 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
27b40 65 6d 65 6e 74 2c 0a 2a 2a 20 61 6e 64 20 70 72  ement,.** and pr
27b50 69 6e 74 73 20 74 68 65 20 72 65 70 6f 72 74 20  ints the report 
27b60 74 6f 20 73 74 64 6f 75 74 20 75 73 69 6e 67 20  to stdout using 
27b70 70 72 69 6e 74 66 28 29 2e 0a 2a 2f 0a 69 6e 74  printf()..*/.int
27b80 20 70 72 69 6e 74 45 78 70 6c 61 69 6e 51 75 65   printExplainQue
27b90 72 79 50 6c 61 6e 28 73 71 6c 69 74 65 33 5f 73  ryPlan(sqlite3_s
27ba0 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20 63  tmt *pStmt){.  c
27bb0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b  onst char *zSql;
27bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27bd0 2a 20 49 6e 70 75 74 20 53 51 4c 20 2a 2f 0a 20  * Input SQL */. 
27be0 20 63 68 61 72 20 2a 7a 45 78 70 6c 61 69 6e 3b   char *zExplain;
27bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c00 20 2f 2a 20 53 51 4c 20 77 69 74 68 20 45 58 50   /* SQL with EXP
27c10 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
27c20 70 72 65 70 65 6e 64 65 64 20 2a 2f 0a 20 20 73  prepended */.  s
27c30 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 45 78  qlite3_stmt *pEx
27c40 70 6c 61 69 6e 3b 20 20 20 20 20 20 20 20 20 2f  plain;         /
27c50 2a 20 43 6f 6d 70 69 6c 65 64 20 45 58 50 4c 41  * Compiled EXPLA
27c60 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 63 6f  IN QUERY PLAN co
27c70 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 72  mmand */.  int r
27c80 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
27c90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
27ca0 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73  turn code from s
27cb0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
27cc0 32 28 29 20 2a 2f 0a 0a 20 20 7a 53 71 6c 20 3d  2() */..  zSql =
27cd0 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74   sqlite3_sql(pSt
27ce0 6d 74 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d  mt);.  if( zSql=
27cf0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
27d00 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 78  TE_ERROR;..  zEx
27d10 70 6c 61 69 6e 20 3d 20 73 71 6c 69 74 65 33 5f  plain = sqlite3_
27d20 6d 70 72 69 6e 74 66 28 22 45 58 50 4c 41 49 4e  mprintf("EXPLAIN
27d30 20 51 55 45 52 59 20 50 4c 41 4e 20 25 73 22 2c   QUERY PLAN %s",
27d40 20 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 7a 45   zSql);.  if( zE
27d50 78 70 6c 61 69 6e 3d 3d 30 20 29 20 72 65 74 75  xplain==0 ) retu
27d60 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
27d70 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
27d80 5f 70 72 65 70 61 72 65 5f 76 32 28 73 71 6c 69  _prepare_v2(sqli
27d90 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65 28 70 53  te3_db_handle(pS
27da0 74 6d 74 29 2c 20 7a 45 78 70 6c 61 69 6e 2c 20  tmt), zExplain, 
27db0 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20 30  -1, &pExplain, 0
27dc0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
27dd0 65 28 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20 69  e(zExplain);.  i
27de0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
27df0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
27e00 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52   while( SQLITE_R
27e10 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
27e20 28 70 45 78 70 6c 61 69 6e 29 20 29 7b 0a 20 20  (pExplain) ){.  
27e30 20 20 69 6e 74 20 69 53 65 6c 65 63 74 69 64 20    int iSelectid 
27e40 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
27e50 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 30  _int(pExplain, 0
27e60 29 3b 0a 20 20 20 20 69 6e 74 20 69 4f 72 64 65  );.    int iOrde
27e70 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  r = sqlite3_colu
27e80 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c  mn_int(pExplain,
27e90 20 31 29 3b 0a 20 20 20 20 69 6e 74 20 69 46 72   1);.    int iFr
27ea0 6f 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  om = sqlite3_col
27eb0 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e  umn_int(pExplain
27ec0 2c 20 32 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  , 2);.    const 
27ed0 63 68 61 72 20 2a 7a 44 65 74 61 69 6c 20 3d 20  char *zDetail = 
27ee0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71  (const char *)sq
27ef0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
27f00 74 28 70 45 78 70 6c 61 69 6e 2c 20 33 29 3b 0a  t(pExplain, 3);.
27f10 0a 20 20 20 20 70 72 69 6e 74 66 28 22 25 64 20  .    printf("%d 
27f20 25 64 20 25 64 20 25 73 5c 6e 22 2c 20 69 53 65  %d %d %s\n", iSe
27f30 6c 65 63 74 69 64 2c 20 69 4f 72 64 65 72 2c 20  lectid, iOrder, 
27f40 69 46 72 6f 6d 2c 20 7a 44 65 74 61 69 6c 29 3b  iFrom, zDetail);
27f50 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73  .  }..  return s
27f60 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
27f70 70 45 78 70 6c 61 69 6e 29 3b 0a 7d 0a 0a 73 74  pExplain);.}..st
27f80 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72  atic int test_pr
27f90 69 6e 74 5f 65 71 70 28 0a 20 20 76 6f 69 64 20  int_eqp(.  void 
27fa0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
27fb0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
27fc0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
27fd0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
27fe0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74   objv[].){.  int
27ff0 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73   rc;.  sqlite3_s
28000 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69  tmt *pStmt;..  i
28010 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
28020 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
28030 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
28040 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20  jv, "STMT");.   
28050 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
28060 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
28070 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
28080 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
28090 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
280a0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
280b0 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 70  _ERROR;.  rc = p
280c0 72 69 6e 74 45 78 70 6c 61 69 6e 51 75 65 72 79  rintExplainQuery
280d0 50 6c 61 6e 28 70 53 74 6d 74 29 3b 0a 20 20 2f  Plan(pStmt);.  /
280e0 2a 20 54 68 69 73 20 69 73 20 6e 65 65 64 65 64  * This is needed
280f0 20 6f 6e 20 57 69 6e 64 6f 77 73 20 73 6f 20 74   on Windows so t
28100 68 61 74 20 61 20 74 65 73 74 20 63 61 73 65 20  hat a test case 
28110 75 73 69 6e 67 20 74 68 69 73 20 0a 20 20 2a 2a  using this .  **
28120 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 6f 70   function can op
28130 65 6e 20 61 20 72 65 61 64 20 70 69 70 65 20 61  en a read pipe a
28140 6e 64 20 67 65 74 20 74 68 65 20 6f 75 74 70 75  nd get the outpu
28150 74 20 6f 66 0a 20 20 2a 2a 20 70 72 69 6e 74 45  t of.  ** printE
28160 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
28170 29 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  ) immediately.. 
28180 20 2a 2f 0a 20 20 66 66 6c 75 73 68 28 73 74 64   */.  fflush(std
28190 6f 75 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52  out);.  Tcl_SetR
281a0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
281b0 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
281c0 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74  e(rc), 0);.  ret
281d0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
281e0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
281f0 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a  MIT_EXPLAIN */..
28200 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65  /*.** sqlite3_te
28210 73 74 5f 63 6f 6e 74 72 6f 6c 20 56 45 52 42 20  st_control VERB 
28220 41 52 47 53 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69  ARGS....*/.stati
28230 63 20 69 6e 74 20 74 65 73 74 5f 74 65 73 74 5f  c int test_test_
28240 63 6f 6e 74 72 6f 6c 28 0a 20 20 76 6f 69 64 20  control(.  void 
28250 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
28260 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
28270 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
28280 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
28290 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74 72   objv[].){.  str
282a0 75 63 74 20 56 65 72 62 20 7b 0a 20 20 20 20 63  uct Verb {.    c
282b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
282c0 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 7d  ;.    int i;.  }
282d0 20 61 56 65 72 62 5b 5d 20 3d 20 7b 0a 20 20 20   aVerb[] = {.   
282e0 20 7b 20 22 53 51 4c 49 54 45 5f 54 45 53 54 43   { "SQLITE_TESTC
282f0 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41  TRL_LOCALTIME_FA
28300 55 4c 54 22 2c 20 53 51 4c 49 54 45 5f 54 45 53  ULT", SQLITE_TES
28310 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f  TCTRL_LOCALTIME_
28320 46 41 55 4c 54 20 7d 2c 20 0a 20 20 7d 3b 0a 20  FAULT }, .  };. 
28330 20 69 6e 74 20 69 56 65 72 62 3b 0a 20 20 69 6e   int iVerb;.  in
28340 74 20 69 46 6c 61 67 3b 0a 20 20 69 6e 74 20 72  t iFlag;.  int r
28350 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32  c;..  if( objc<2
28360 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
28370 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
28380 20 31 2c 20 6f 62 6a 76 2c 20 22 56 45 52 42 20   1, objv, "VERB 
28390 41 52 47 53 2e 2e 2e 22 29 3b 0a 20 20 20 20 72  ARGS...");.    r
283a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
283b0 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 54 63 6c  .  }..  rc = Tcl
283c0 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a  _GetIndexFromObj
283d0 53 74 72 75 63 74 28 0a 20 20 20 20 20 20 69 6e  Struct(.      in
283e0 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 61  terp, objv[1], a
283f0 56 65 72 62 2c 20 73 69 7a 65 6f 66 28 61 56 65  Verb, sizeof(aVe
28400 72 62 5b 30 5d 29 2c 20 22 56 45 52 42 22 2c 20  rb[0]), "VERB", 
28410 30 2c 20 26 69 56 65 72 62 0a 20 20 29 3b 0a 20  0, &iVerb.  );. 
28420 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20   if( rc!=TCL_OK 
28430 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
28440 69 46 6c 61 67 20 3d 20 61 56 65 72 62 5b 69 56  iFlag = aVerb[iV
28450 65 72 62 5d 2e 69 3b 0a 20 20 73 77 69 74 63 68  erb].i;.  switch
28460 28 20 69 46 6c 61 67 20 29 7b 0a 20 20 20 20 63  ( iFlag ){.    c
28470 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
28480 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41  TRL_LOCALTIME_FA
28490 55 4c 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ULT: {.      int
284a0 20 76 61 6c 3b 0a 20 20 20 20 20 20 69 66 28 20   val;.      if( 
284b0 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
284c0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
284d0 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
284e0 62 6a 76 2c 20 22 4f 4e 4f 46 46 22 29 3b 0a 20  bjv, "ONOFF");. 
284f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
28500 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
28510 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47  .      if( Tcl_G
28520 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
28530 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
28540 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e  , &val) ) return
28550 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
28560 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
28570 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
28580 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45  STCTRL_LOCALTIME
28590 5f 46 41 55 4c 54 2c 20 76 61 6c 29 3b 0a 20 20  _FAULT, val);.  
285a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
285b0 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 52 65 73 65  .  }..  Tcl_Rese
285c0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  tResult(interp);
285d0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
285e0 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
285f0 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20 49 6e 66  OS_WIN./*.** Inf
28600 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73 65 64 20  ormation passed 
28610 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 74 68  from the main th
28620 72 65 61 64 20 69 6e 74 6f 20 74 68 65 20 77 69  read into the wi
28630 6e 64 6f 77 73 20 66 69 6c 65 20 6c 6f 63 6b 65  ndows file locke
28640 72 0a 2a 2a 20 62 61 63 6b 67 72 6f 75 6e 64 20  r.** background 
28650 74 68 72 65 61 64 2e 0a 2a 2f 0a 73 74 72 75 63  thread..*/.struc
28660 74 20 77 69 6e 33 32 46 69 6c 65 4c 6f 63 6b 65  t win32FileLocke
28670 72 20 7b 0a 20 20 63 68 61 72 20 2a 65 76 4e 61  r {.  char *evNa
28680 6d 65 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  me;       /* Nam
28690 65 20 6f 66 20 65 76 65 6e 74 20 74 6f 20 73 69  e of event to si
286a0 67 6e 61 6c 20 74 68 72 65 61 64 20 73 74 61 72  gnal thread star
286b0 74 75 70 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20  tup */.  HANDLE 
286c0 68 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  h;           /* 
286d0 48 61 6e 64 6c 65 20 6f 66 20 74 68 65 20 66 69  Handle of the fi
286e0 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
286f0 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 61 79 31 3b  */.  int delay1;
28700 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 61           /* Dela
28710 79 20 62 65 66 6f 72 65 20 6c 6f 63 6b 69 6e 67  y before locking
28720 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 61 79 32   */.  int delay2
28730 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c  ;         /* Del
28740 61 79 20 62 65 66 6f 72 65 20 75 6e 6c 6f 63 6b  ay before unlock
28750 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6f 6b 3b  ing */.  int ok;
28760 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28770 46 69 6e 69 73 68 65 64 20 6f 6b 20 2a 2f 0a 20  Finished ok */. 
28780 20 69 6e 74 20 65 72 72 3b 20 20 20 20 20 20 20   int err;       
28790 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
287a0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
287b0 2a 2f 0a 7d 3b 0a 23 65 6e 64 69 66 0a 0a 0a 23  */.};.#endif...#
287c0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
287d0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 62 61 63 6b 67  ./*.** The backg
287e0 72 6f 75 6e 64 20 74 68 72 65 61 64 20 74 68 61  round thread tha
287f0 74 20 64 6f 65 73 20 66 69 6c 65 20 6c 6f 63 6b  t does file lock
28800 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
28810 6f 69 64 20 77 69 6e 33 32 5f 66 69 6c 65 5f 6c  oid win32_file_l
28820 6f 63 6b 65 72 28 76 6f 69 64 20 2a 70 41 70 70  ocker(void *pApp
28830 44 61 74 61 29 7b 0a 20 20 73 74 72 75 63 74 20  Data){.  struct 
28840 77 69 6e 33 32 46 69 6c 65 4c 6f 63 6b 65 72 20  win32FileLocker 
28850 2a 70 20 3d 20 28 73 74 72 75 63 74 20 77 69 6e  *p = (struct win
28860 33 32 46 69 6c 65 4c 6f 63 6b 65 72 2a 29 70 41  32FileLocker*)pA
28870 70 70 44 61 74 61 3b 0a 20 20 69 66 28 20 70 2d  ppData;.  if( p-
28880 3e 65 76 4e 61 6d 65 20 29 7b 0a 20 20 20 20 48  >evName ){.    H
28890 41 4e 44 4c 45 20 65 76 20 3d 20 4f 70 65 6e 45  ANDLE ev = OpenE
288a0 76 65 6e 74 28 45 56 45 4e 54 5f 4d 4f 44 49 46  vent(EVENT_MODIF
288b0 59 5f 53 54 41 54 45 2c 20 46 41 4c 53 45 2c 20  Y_STATE, FALSE, 
288c0 70 2d 3e 65 76 4e 61 6d 65 29 3b 0a 20 20 20 20  p->evName);.    
288d0 69 66 20 28 20 65 76 20 29 7b 0a 20 20 20 20 20  if ( ev ){.     
288e0 20 53 65 74 45 76 65 6e 74 28 65 76 29 3b 0a 20   SetEvent(ev);. 
288f0 20 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65       CloseHandle
28900 28 65 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (ev);.    }.  }.
28910 20 20 69 66 28 20 70 2d 3e 64 65 6c 61 79 31 20    if( p->delay1 
28920 29 20 53 6c 65 65 70 28 70 2d 3e 64 65 6c 61 79  ) Sleep(p->delay
28930 31 29 3b 0a 20 20 69 66 28 20 4c 6f 63 6b 46 69  1);.  if( LockFi
28940 6c 65 28 70 2d 3e 68 2c 20 30 2c 20 30 2c 20 31  le(p->h, 0, 0, 1
28950 30 30 30 30 30 30 30 30 2c 20 30 29 20 29 7b 0a  00000000, 0) ){.
28960 20 20 20 20 53 6c 65 65 70 28 70 2d 3e 64 65 6c      Sleep(p->del
28970 61 79 32 29 3b 0a 20 20 20 20 55 6e 6c 6f 63 6b  ay2);.    Unlock
28980 46 69 6c 65 28 70 2d 3e 68 2c 20 30 2c 20 30 2c  File(p->h, 0, 0,
28990 20 31 30 30 30 30 30 30 30 30 2c 20 30 29 3b 0a   100000000, 0);.
289a0 20 20 20 20 70 2d 3e 6f 6b 20 3d 20 31 3b 0a 20      p->ok = 1;. 
289b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 65   }else{.    p->e
289c0 72 72 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 43 6c  rr = 1;.  }.  Cl
289d0 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e 68 29 3b  oseHandle(p->h);
289e0 0a 20 20 70 2d 3e 68 20 3d 20 30 3b 0a 20 20 70  .  p->h = 0;.  p
289f0 2d 3e 64 65 6c 61 79 31 20 3d 20 30 3b 0a 20 20  ->delay1 = 0;.  
28a00 70 2d 3e 64 65 6c 61 79 32 20 3d 20 30 3b 0a 7d  p->delay2 = 0;.}
28a10 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
28a20 49 54 45 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a  ITE_OS_WIN./*.**
28a30 20 20 20 20 20 20 6c 6f 63 6b 5f 77 69 6e 33 32        lock_win32
28a40 5f 66 69 6c 65 20 46 49 4c 45 4e 41 4d 45 20 44  _file FILENAME D
28a50 45 4c 41 59 31 20 44 45 4c 41 59 32 0a 2a 2a 0a  ELAY1 DELAY2.**.
28a60 2a 2a 20 47 65 74 20 61 6e 20 65 78 63 6c 75 73  ** Get an exclus
28a70 69 76 65 20 6d 61 6e 64 69 74 6f 72 79 20 6c 6f  ive manditory lo
28a80 63 6b 20 6f 6e 20 66 69 6c 65 20 66 6f 72 20 44  ck on file for D
28a90 45 4c 41 59 32 20 6d 69 6c 6c 69 73 65 63 6f 6e  ELAY2 millisecon
28aa0 64 73 2e 0a 2a 2a 20 57 61 69 74 20 44 45 4c 41  ds..** Wait DELA
28ab0 59 31 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  Y1 milliseconds 
28ac0 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67  before acquiring
28ad0 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74   the lock..*/.st
28ae0 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32 5f 66  atic int win32_f
28af0 69 6c 65 5f 6c 6f 63 6b 28 0a 20 20 76 6f 69 64  ile_lock(.  void
28b00 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
28b10 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
28b20 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
28b30 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
28b40 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74  T objv[].){.  st
28b50 61 74 69 63 20 73 74 72 75 63 74 20 77 69 6e 33  atic struct win3
28b60 32 46 69 6c 65 4c 6f 63 6b 65 72 20 78 20 3d 20  2FileLocker x = 
28b70 7b 20 22 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f  { "win32_file_lo
28b80 63 6b 22 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  ck", 0, 0, 0, 0,
28b90 20 30 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68   0 };.  const ch
28ba0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  ar *zFilename;. 
28bb0 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b   char zBuf[200];
28bc0 0a 20 20 69 6e 74 20 72 65 74 72 79 20 3d 20 30  .  int retry = 0
28bd0 3b 0a 20 20 48 41 4e 44 4c 45 20 65 76 3b 0a 20  ;.  HANDLE ev;. 
28be0 20 44 57 4f 52 44 20 77 52 65 73 75 6c 74 3b 0a   DWORD wResult;.
28bf0 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34    .  if( objc!=4
28c00 20 26 26 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20   && objc!=1 ){. 
28c10 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
28c20 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
28c30 62 6a 76 2c 20 22 46 49 4c 45 4e 41 4d 45 20 44  bjv, "FILENAME D
28c40 45 4c 41 59 31 20 44 45 4c 41 59 32 22 29 3b 0a  ELAY1 DELAY2");.
28c50 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
28c60 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
28c70 6f 62 6a 63 3d 3d 31 20 29 7b 0a 20 20 20 20 73  objc==1 ){.    s
28c80 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
28c90 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42  sizeof(zBuf), zB
28ca0 75 66 2c 20 22 25 64 20 25 64 20 25 64 20 25 64  uf, "%d %d %d %d
28cb0 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %d",.          
28cc0 20 20 20 20 20 20 20 20 20 20 20 78 2e 6f 6b 2c             x.ok,
28cd0 20 78 2e 65 72 72 2c 20 78 2e 64 65 6c 61 79 31   x.err, x.delay1
28ce0 2c 20 78 2e 64 65 6c 61 79 32 2c 20 78 2e 68 29  , x.delay2, x.h)
28cf0 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
28d00 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
28d10 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Buf, (char*)0);.
28d20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
28d30 4b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  K;.  }.  while( 
28d40 78 2e 68 20 26 26 20 72 65 74 72 79 3c 33 30 20  x.h && retry<30 
28d50 29 7b 0a 20 20 20 20 72 65 74 72 79 2b 2b 3b 0a  ){.    retry++;.
28d60 20 20 20 20 53 6c 65 65 70 28 31 30 30 29 3b 0a      Sleep(100);.
28d70 20 20 7d 0a 20 20 69 66 28 20 78 2e 68 20 29 7b    }.  if( x.h ){
28d80 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
28d90 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62  esult(interp, "b
28da0 75 73 79 22 2c 20 28 63 68 61 72 2a 29 30 29 3b  usy", (char*)0);
28db0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
28dc0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
28dd0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
28de0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
28df0 32 5d 2c 20 26 78 2e 64 65 6c 61 79 31 29 20 29  2], &x.delay1) )
28e00 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
28e10 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
28e20 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
28e30 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 78 2e 64  p, objv[3], &x.d
28e40 65 6c 61 79 32 29 20 29 20 72 65 74 75 72 6e 20  elay2) ) return 
28e50 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 46 69  TCL_ERROR;.  zFi
28e60 6c 65 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74  lename = Tcl_Get
28e70 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b  String(objv[1]);
28e80 0a 20 20 78 2e 68 20 3d 20 43 72 65 61 74 65 46  .  x.h = CreateF
28e90 69 6c 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 47  ile(zFilename, G
28ea0 45 4e 45 52 49 43 5f 52 45 41 44 7c 47 45 4e 45  ENERIC_READ|GENE
28eb0 52 49 43 5f 57 52 49 54 45 2c 0a 20 20 20 20 20  RIC_WRITE,.     
28ec0 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 53 48           FILE_SH
28ed0 41 52 45 5f 52 45 41 44 7c 46 49 4c 45 5f 53 48  ARE_READ|FILE_SH
28ee0 41 52 45 5f 57 52 49 54 45 2c 20 30 2c 20 4f 50  ARE_WRITE, 0, OP
28ef0 45 4e 5f 41 4c 57 41 59 53 2c 0a 20 20 20 20 20  EN_ALWAYS,.     
28f00 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 41 54           FILE_AT
28f10 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 2c 20  TRIBUTE_NORMAL, 
28f20 30 29 3b 0a 20 20 69 66 28 20 21 78 2e 68 20 29  0);.  if( !x.h )
28f30 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
28f40 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
28f50 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65  cannot open file
28f60 3a 20 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  : ", zFilename, 
28f70 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72  (char*)0);.    r
28f80 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
28f90 0a 20 20 7d 0a 20 20 65 76 20 3d 20 43 72 65 61  .  }.  ev = Crea
28fa0 74 65 45 76 65 6e 74 28 4e 55 4c 4c 2c 20 54 52  teEvent(NULL, TR
28fb0 55 45 2c 20 46 41 4c 53 45 2c 20 78 2e 65 76 4e  UE, FALSE, x.evN
28fc0 61 6d 65 29 3b 0a 20 20 69 66 20 28 20 21 65 76  ame);.  if ( !ev
28fd0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
28fe0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
28ff0 20 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20   "cannot create 
29000 65 76 65 6e 74 3a 20 22 2c 20 78 2e 65 76 4e 61  event: ", x.evNa
29010 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  me, (char*)0);. 
29020 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
29030 52 4f 52 3b 0a 20 20 7d 0a 20 20 5f 62 65 67 69  ROR;.  }.  _begi
29040 6e 74 68 72 65 61 64 28 77 69 6e 33 32 5f 66 69  nthread(win32_fi
29050 6c 65 5f 6c 6f 63 6b 65 72 2c 20 30 2c 20 28 76  le_locker, 0, (v
29060 6f 69 64 2a 29 26 78 29 3b 0a 20 20 53 6c 65 65  oid*)&x);.  Slee
29070 70 28 30 29 3b 0a 20 20 69 66 20 28 20 28 77 52  p(0);.  if ( (wR
29080 65 73 75 6c 74 20 3d 20 57 61 69 74 46 6f 72 53  esult = WaitForS
29090 69 6e 67 6c 65 4f 62 6a 65 63 74 28 65 76 2c 20  ingleObject(ev, 
290a0 31 30 30 30 30 29 29 21 3d 57 41 49 54 5f 4f 42  10000))!=WAIT_OB
290b0 4a 45 43 54 5f 30 20 29 7b 0a 20 20 20 20 73 71  JECT_0 ){.    sq
290c0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
290d0 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75  izeof(zBuf), zBu
290e0 66 2c 20 22 30 78 25 78 22 2c 20 77 52 65 73 75  f, "0x%x", wResu
290f0 6c 74 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70  lt);.    Tcl_App
29100 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
29110 2c 20 22 77 61 69 74 20 66 61 69 6c 65 64 3a 20  , "wait failed: 
29120 22 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29  ", zBuf, (char*)
29130 30 29 3b 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e  0);.    CloseHan
29140 64 6c 65 28 65 76 29 3b 0a 20 20 20 20 72 65 74  dle(ev);.    ret
29150 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
29160 20 7d 0a 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65   }.  CloseHandle
29170 28 65 76 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  (ev);.  return T
29180 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  CL_OK;.}.#endif.
29190 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 6f 70 74  ../*.**      opt
291a0 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f  imization_contro
291b0 6c 20 44 42 20 4f 50 54 20 42 4f 4f 4c 45 41 4e  l DB OPT BOOLEAN
291c0 0a 2a 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72  .**.** Enable or
291d0 20 64 69 73 61 62 6c 65 20 71 75 65 72 79 20 6f   disable query o
291e0 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 75 73 69  ptimizations usi
291f0 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 74  ng the sqlite3_t
29200 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 29 0a 2a 2a  est_control().**
29210 20 69 6e 74 65 72 66 61 63 65 2e 20 20 44 69 73   interface.  Dis
29220 61 62 6c 65 20 69 66 20 42 4f 4f 4c 45 41 4e 20  able if BOOLEAN 
29230 69 73 20 66 61 6c 73 65 20 61 6e 64 20 65 6e 61  is false and ena
29240 62 6c 65 20 69 66 20 42 4f 4f 4c 45 41 4e 20 69  ble if BOOLEAN i
29250 73 20 74 72 75 65 2e 0a 2a 2a 20 4f 50 54 20 69  s true..** OPT i
29260 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
29270 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74  e optimization t
29280 6f 20 62 65 20 64 69 73 61 62 6c 65 64 2e 0a 2a  o be disabled..*
29290 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 74  /.static int opt
292a0 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f  imization_contro
292b0 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  l(.  void * clie
292c0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
292d0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
292e0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
292f0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
29300 5d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ].){.  int i;.  
29310 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
29320 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 3b  onst char *zOpt;
29330 0a 20 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a 20 20  .  int onoff;.  
29340 69 6e 74 20 6d 61 73 6b 3b 0a 20 20 73 74 61 74  int mask;.  stat
29350 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
29360 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
29370 20 2a 7a 4f 70 74 4e 61 6d 65 3b 0a 20 20 20 20   *zOptName;.    
29380 69 6e 74 20 6d 61 73 6b 3b 0a 20 20 7d 20 61 4f  int mask;.  } aO
29390 70 74 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  pt[] = {.    { "
293a0 61 6c 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20  all",           
293b0 20 20 20 53 51 4c 49 54 45 5f 4f 70 74 4d 61 73     SQLITE_OptMas
293c0 6b 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  k        },.    
293d0 7b 20 22 71 75 65 72 79 2d 66 6c 61 74 74 65 6e  { "query-flatten
293e0 65 72 22 2c 20 20 53 51 4c 49 54 45 5f 51 75 65  er",  SQLITE_Que
293f0 72 79 46 6c 61 74 74 65 6e 65 72 20 7d 2c 0a 20  ryFlattener },. 
29400 20 20 20 7b 20 22 63 6f 6c 75 6d 6e 2d 63 61 63     { "column-cac
29410 68 65 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f  he",     SQLITE_
29420 43 6f 6c 75 6d 6e 43 61 63 68 65 20 20 20 20 7d  ColumnCache    }
29430 2c 0a 20 20 20 20 7b 20 22 69 6e 64 65 78 2d 73  ,.    { "index-s
29440 6f 72 74 22 2c 20 20 20 20 20 20 20 53 51 4c 49  ort",       SQLI
29450 54 45 5f 49 6e 64 65 78 53 6f 72 74 20 20 20 20  TE_IndexSort    
29460 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69 6e 64 65    },.    { "inde
29470 78 2d 73 65 61 72 63 68 22 2c 20 20 20 20 20 53  x-search",     S
29480 51 4c 49 54 45 5f 49 6e 64 65 78 53 65 61 72 63  QLITE_IndexSearc
29490 68 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69  h    },.    { "i
294a0 6e 64 65 78 2d 63 6f 76 65 72 22 2c 20 20 20 20  ndex-cover",    
294b0 20 20 53 51 4c 49 54 45 5f 49 6e 64 65 78 43 6f    SQLITE_IndexCo
294c0 76 65 72 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b  ver     },.    {
294d0 20 22 67 72 6f 75 70 62 79 2d 6f 72 64 65 72 22   "groupby-order"
294e0 2c 20 20 20 20 53 51 4c 49 54 45 5f 47 72 6f 75  ,    SQLITE_Grou
294f0 70 42 79 4f 72 64 65 72 20 20 20 7d 2c 0a 20 20  pByOrder   },.  
29500 20 20 7b 20 22 66 61 63 74 6f 72 2d 63 6f 6e 73    { "factor-cons
29510 74 61 6e 74 73 22 2c 20 53 51 4c 49 54 45 5f 46  tants", SQLITE_F
29520 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 20 7d 2c  actorOutConst },
29530 0a 20 20 20 20 7b 20 22 72 65 61 6c 2d 61 73 2d  .    { "real-as-
29540 69 6e 74 22 2c 20 20 20 20 20 20 53 51 4c 49 54  int",      SQLIT
29550 45 5f 49 64 78 52 65 61 6c 41 73 49 6e 74 20 20  E_IdxRealAsInt  
29560 20 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20   },.  };..  if( 
29570 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
29580 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
29590 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
295a0 20 22 44 42 20 4f 50 54 20 42 4f 4f 4c 45 41 4e   "DB OPT BOOLEAN
295b0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
295c0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
295d0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
295e0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
295f0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
29600 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
29610 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
29620 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
29630 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
29640 6a 76 5b 33 5d 2c 20 26 6f 6e 6f 66 66 29 20 29  jv[3], &onoff) )
29650 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
29660 52 3b 0a 20 20 7a 4f 70 74 20 3d 20 54 63 6c 5f  R;.  zOpt = Tcl_
29670 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
29680 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ]);.  for(i=0; i
29690 3c 73 69 7a 65 6f 66 28 61 4f 70 74 29 2f 73 69  <sizeof(aOpt)/si
296a0 7a 65 6f 66 28 61 4f 70 74 5b 30 5d 29 3b 20 69  zeof(aOpt[0]); i
296b0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
296c0 63 6d 70 28 7a 4f 70 74 2c 20 61 4f 70 74 5b 69  cmp(zOpt, aOpt[i
296d0 5d 2e 7a 4f 70 74 4e 61 6d 65 29 3d 3d 30 20 29  ].zOptName)==0 )
296e0 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 61  {.      mask = a
296f0 4f 70 74 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20  Opt[i].mask;.   
29700 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
29710 20 20 7d 0a 20 20 69 66 28 20 6f 6e 6f 66 66 20    }.  if( onoff 
29720 29 20 6d 61 73 6b 20 3d 20 7e 6d 61 73 6b 3b 0a  ) mask = ~mask;.
29730 20 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28    if( i>=sizeof(
29740 61 4f 70 74 29 2f 73 69 7a 65 6f 66 28 61 4f 70  aOpt)/sizeof(aOp
29750 74 5b 30 5d 29 20 29 7b 0a 20 20 20 20 54 63 6c  t[0]) ){.    Tcl
29760 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
29770 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f  terp, "unknown o
29780 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 73 68  ptimization - sh
29790 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a 22  ould be one of:"
297a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
297b0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29         (char*)0)
297c0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
297d0 3c 73 69 7a 65 6f 66 28 61 4f 70 74 29 2f 73 69  <sizeof(aOpt)/si
297e0 7a 65 6f 66 28 61 4f 70 74 5b 30 5d 29 3b 20 69  zeof(aOpt[0]); i
297f0 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  ++){.      Tcl_A
29800 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
29810 72 70 2c 20 22 20 22 2c 20 61 4f 70 74 5b 69 5d  rp, " ", aOpt[i]
29820 2e 7a 4f 70 74 4e 61 6d 65 29 3b 0a 20 20 20 20  .zOptName);.    
29830 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  }.    return TCL
29840 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71  _ERROR;.  }.  sq
29850 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
29860 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
29870 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53  RL_OPTIMIZATIONS
29880 2c 20 64 62 2c 20 6d 61 73 6b 29 3b 0a 20 20 72  , db, mask);.  r
29890 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
298a0 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
298b0 63 6f 6d 6d 61 6e 64 73 20 77 69 74 68 20 74 68  commands with th
298c0 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
298d0 72 2e 0a 2a 2f 0a 69 6e 74 20 53 71 6c 69 74 65  r..*/.int Sqlite
298e0 74 65 73 74 31 5f 49 6e 69 74 28 54 63 6c 5f 49  test1_Init(Tcl_I
298f0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a  nterp *interp){.
29900 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
29910 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e  ite3_search_coun
29920 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  t;.  extern int 
29930 73 71 6c 69 74 65 33 5f 66 6f 75 6e 64 5f 63 6f  sqlite3_found_co
29940 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  unt;.  extern in
29950 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72  t sqlite3_interr
29960 75 70 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74  upt_count;.  ext
29970 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
29980 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 3b  open_file_count;
29990 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
299a0 6c 69 74 65 33 5f 73 6f 72 74 5f 63 6f 75 6e 74  lite3_sort_count
299b0 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
299c0 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
299d0 69 6d 65 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ime;.#if SQLITE_
299e0 4f 53 5f 55 4e 49 58 20 26 26 20 64 65 66 69 6e  OS_UNIX && defin
299f0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
29a00 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
29a10 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 65  OCKING_STYLE.  e
29a20 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
29a30 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 3b 0a 23 65  3_hostid_num;.#e
29a40 6e 64 69 66 0a 20 20 65 78 74 65 72 6e 20 69 6e  ndif.  extern in
29a50 74 20 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c  t sqlite3_max_bl
29a60 6f 62 73 69 7a 65 3b 0a 20 20 65 78 74 65 72 6e  obsize;.  extern
29a70 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65   int sqlite3Btre
29a80 65 53 68 61 72 65 64 43 61 63 68 65 52 65 70 6f  eSharedCacheRepo
29a90 72 74 28 76 6f 69 64 2a 2c 0a 20 20 20 20 20 20  rt(void*,.      
29aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ac0 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 2a 2c      Tcl_Interp*,
29ad0 69 6e 74 2c 54 63 6c 5f 4f 62 6a 2a 43 4f 4e 53  int,Tcl_Obj*CONS
29ae0 54 2a 29 3b 0a 20 20 73 74 61 74 69 63 20 73 74  T*);.  static st
29af0 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72  ruct {.     char
29b00 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63   *zName;.     Tc
29b10 6c 5f 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63  l_CmdProc *xProc
29b20 3b 0a 20 20 7d 20 61 43 6d 64 5b 5d 20 3d 20 7b  ;.  } aCmd[] = {
29b30 0a 20 20 20 20 20 7b 20 22 64 62 5f 65 6e 74 65  .     { "db_ente
29b40 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  r",             
29b50 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
29b60 64 50 72 6f 63 2a 29 64 62 5f 65 6e 74 65 72 20  dProc*)db_enter 
29b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
29b80 0a 20 20 20 20 20 7b 20 22 64 62 5f 6c 65 61 76  .     { "db_leav
29b90 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
29ba0 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
29bb0 64 50 72 6f 63 2a 29 64 62 5f 6c 65 61 76 65 20  dProc*)db_leave 
29bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
29bd0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
29be0 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 22 2c 20 20  _mprintf_int",  
29bf0 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
29c00 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d  dProc*)sqlite3_m
29c10 70 72 69 6e 74 66 5f 69 6e 74 20 20 20 20 7d 2c  printf_int    },
29c20 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
29c30 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 22 2c  _mprintf_int64",
29c40 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
29c50 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d  dProc*)sqlite3_m
29c60 70 72 69 6e 74 66 5f 69 6e 74 36 34 20 20 7d 2c  printf_int64  },
29c70 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
29c80 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67 22 2c 20  _mprintf_long", 
29c90 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
29ca0 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d  dProc*)sqlite3_m
29cb0 70 72 69 6e 74 66 5f 6c 6f 6e 67 20 20 20 7d 2c  printf_long   },
29cc0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
29cd0 5f 6d 70 72 69 6e 74 66 5f 73 74 72 22 2c 20 20  _mprintf_str",  
29ce0 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
29cf0 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d  dProc*)sqlite3_m
29d00 70 72 69 6e 74 66 5f 73 74 72 20 20 20 20 7d 2c  printf_str    },
29d10 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
29d20 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72 22 2c 20  _snprintf_str", 
29d30 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
29d40 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 73  dProc*)sqlite3_s
29d50 6e 70 72 69 6e 74 66 5f 73 74 72 20 20 20 7d 2c  nprintf_str   },
29d60 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
29d70 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79  _mprintf_stronly
29d80 22 2c 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d  ",       (Tcl_Cm
29d90 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d  dProc*)sqlite3_m
29da0 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 7d 2c  printf_stronly},
29db0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
29dc0 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 22  _mprintf_double"
29dd0 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d  ,        (Tcl_Cm
29de0 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d  dProc*)sqlite3_m
29df0 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 20 7d 2c  printf_double },
29e00 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
29e10 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 22  _mprintf_scaled"
29e20 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d  ,        (Tcl_Cm
29e30 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d  dProc*)sqlite3_m
29e40 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 20 7d 2c  printf_scaled },
29e50 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
29e60 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f 75 62  _mprintf_hexdoub
29e70 6c 65 22 2c 20 20 20 28 54 63 6c 5f 43 6d 64 50  le",   (Tcl_CmdP
29e80 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72  roc*)sqlite3_mpr
29e90 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65 7d 2c  intf_hexdouble},
29ea0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
29eb0 5f 6d 70 72 69 6e 74 66 5f 7a 5f 74 65 73 74 22  _mprintf_z_test"
29ec0 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d  ,        (Tcl_Cm
29ed0 64 50 72 6f 63 2a 29 74 65 73 74 5f 6d 70 72 69  dProc*)test_mpri
29ee0 6e 74 66 5f 7a 20 20 20 20 20 20 20 20 7d 2c 0a  ntf_z        },.
29ef0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
29f00 6d 70 72 69 6e 74 66 5f 6e 5f 74 65 73 74 22 2c  mprintf_n_test",
29f10 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
29f20 50 72 6f 63 2a 29 74 65 73 74 5f 6d 70 72 69 6e  Proc*)test_mprin
29f30 74 66 5f 6e 20 20 20 20 20 20 20 20 7d 2c 0a 20  tf_n        },. 
29f40 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73      { "sqlite3_s
29f50 6e 70 72 69 6e 74 66 5f 69 6e 74 22 2c 20 20 20  nprintf_int",   
29f60 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
29f70 72 6f 63 2a 29 74 65 73 74 5f 73 6e 70 72 69 6e  roc*)test_snprin
29f80 74 66 5f 69 6e 74 20 20 20 20 20 7d 2c 0a 20 20  tf_int     },.  
29f90 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c 61     { "sqlite3_la
29fa0 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 22  st_insert_rowid"
29fb0 2c 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72  ,     (Tcl_CmdPr
29fc0 6f 63 2a 29 74 65 73 74 5f 6c 61 73 74 5f 72 6f  oc*)test_last_ro
29fd0 77 69 64 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  wid       },.   
29fe0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 65    { "sqlite3_exe
29ff0 63 5f 70 72 69 6e 74 66 22 2c 20 20 20 20 20 20  c_printf",      
2a000 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
2a010 63 2a 29 74 65 73 74 5f 65 78 65 63 5f 70 72 69  c*)test_exec_pri
2a020 6e 74 66 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  ntf      },.    
2a030 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 65 63   { "sqlite3_exec
2a040 5f 68 65 78 22 2c 20 20 20 20 20 20 20 20 20 20  _hex",          
2a050 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2a060 2a 29 74 65 73 74 5f 65 78 65 63 5f 68 65 78 20  *)test_exec_hex 
2a070 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
2a080 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 65 63 22  { "sqlite3_exec"
2a090 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a0a0 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
2a0b0 29 74 65 73 74 5f 65 78 65 63 20 20 20 20 20 20  )test_exec      
2a0c0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
2a0d0 20 22 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 6e   "sqlite3_exec_n
2a0e0 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  r",             
2a0f0 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
2a100 74 65 73 74 5f 65 78 65 63 5f 6e 72 20 20 20 20  test_exec_nr    
2a110 20 20 20 20 20 20 7d 2c 0a 23 69 66 6e 64 65 66        },.#ifndef
2a120 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 47 45 54   SQLITE_OMIT_GET
2a130 5f 54 41 42 4c 45 0a 20 20 20 20 20 7b 20 22 73  _TABLE.     { "s
2a140 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65  qlite3_get_table
2a150 5f 70 72 69 6e 74 66 22 2c 20 20 20 20 20 20 28  _printf",      (
2a160 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
2a170 74 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e  t_get_table_prin
2a180 74 66 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20  tf },.#endif.   
2a190 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6c 6f    { "sqlite3_clo
2a1a0 73 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  se",            
2a1b0 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
2a1c0 63 2a 29 73 71 6c 69 74 65 5f 74 65 73 74 5f 63  c*)sqlite_test_c
2a1d0 6c 6f 73 65 20 20 20 20 20 7d 2c 0a 20 20 20 20  lose     },.    
2a1e0 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61   { "sqlite3_crea
2a1f0 74 65 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20  te_function",   
2a200 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2a210 2a 29 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75  *)test_create_fu
2a220 6e 63 74 69 6f 6e 20 20 7d 2c 0a 20 20 20 20 20  nction  },.     
2a230 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74  { "sqlite3_creat
2a240 65 5f 61 67 67 72 65 67 61 74 65 22 2c 20 20 20  e_aggregate",   
2a250 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
2a260 29 74 65 73 74 5f 63 72 65 61 74 65 5f 61 67 67  )test_create_agg
2a270 72 65 67 61 74 65 20 7d 2c 0a 20 20 20 20 20 7b  regate },.     {
2a280 20 22 73 71 6c 69 74 65 5f 72 65 67 69 73 74 65   "sqlite_registe
2a290 72 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22  r_test_function"
2a2a0 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29  , (Tcl_CmdProc*)
2a2b0 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f 66 75  test_register_fu
2a2c0 6e 63 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20  nc    },.     { 
2a2d0 22 73 71 6c 69 74 65 5f 61 62 6f 72 74 22 2c 20  "sqlite_abort", 
2a2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a2f0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73   (Tcl_CmdProc*)s
2a300 71 6c 69 74 65 5f 61 62 6f 72 74 20 20 20 20 20  qlite_abort     
2a310 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
2a320 73 71 6c 69 74 65 5f 62 69 6e 64 22 2c 20 20 20  sqlite_bind",   
2a330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a340 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
2a350 73 74 5f 62 69 6e 64 20 20 20 20 20 20 20 20 20  st_bind         
2a360 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62      },.     { "b
2a370 72 65 61 6b 70 6f 69 6e 74 22 2c 20 20 20 20 20  reakpoint",     
2a380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2a390 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
2a3a0 74 5f 62 72 65 61 6b 70 6f 69 6e 74 20 20 20 20  t_breakpoint    
2a3b0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
2a3c0 6c 69 74 65 33 5f 6b 65 79 22 2c 20 20 20 20 20  lite3_key",     
2a3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
2a3e0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
2a3f0 5f 6b 65 79 20 20 20 20 20 20 20 20 20 20 20 20  _key            
2a400 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2a410 69 74 65 33 5f 72 65 6b 65 79 22 2c 20 20 20 20  ite3_rekey",    
2a420 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
2a430 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
2a440 72 65 6b 65 79 20 20 20 20 20 20 20 20 20 20 20  rekey           
2a450 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2a460 74 65 5f 73 65 74 5f 6d 61 67 69 63 22 2c 20 20  te_set_magic",  
2a470 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
2a480 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65  _CmdProc*)sqlite
2a490 5f 73 65 74 5f 6d 61 67 69 63 20 20 20 20 20 20  _set_magic      
2a4a0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2a4b0 65 33 5f 69 6e 74 65 72 72 75 70 74 22 2c 20 20  e3_interrupt",  
2a4c0 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
2a4d0 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 69 6e  CmdProc*)test_in
2a4e0 74 65 72 72 75 70 74 20 20 20 20 20 20 20 20 7d  terrupt        }
2a4f0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2a500 5f 64 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e  _delete_function
2a510 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43  ",        (Tcl_C
2a520 6d 64 50 72 6f 63 2a 29 64 65 6c 65 74 65 5f 66  mdProc*)delete_f
2a530 75 6e 63 74 69 6f 6e 20 20 20 20 20 20 20 7d 2c  unction       },
2a540 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f  .     { "sqlite_
2a550 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  delete_collation
2a560 22 2c 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d  ",       (Tcl_Cm
2a570 64 50 72 6f 63 2a 29 64 65 6c 65 74 65 5f 63 6f  dProc*)delete_co
2a580 6c 6c 61 74 69 6f 6e 20 20 20 20 20 20 7d 2c 0a  llation      },.
2a590 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2a5a0 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 22 2c  get_autocommit",
2a5b0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
2a5c0 50 72 6f 63 2a 29 67 65 74 5f 61 75 74 6f 63 6f  Proc*)get_autoco
2a5d0 6d 6d 69 74 20 20 20 20 20 20 20 20 7d 2c 0a 20  mmit        },. 
2a5e0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73      { "sqlite3_s
2a5f0 74 61 63 6b 5f 75 73 65 64 22 2c 20 20 20 20 20  tack_used",     
2a600 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
2a610 72 6f 63 2a 29 74 65 73 74 5f 73 74 61 63 6b 5f  roc*)test_stack_
2a620 75 73 65 64 20 20 20 20 20 20 20 7d 2c 0a 20 20  used       },.  
2a630 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 75     { "sqlite3_bu
2a640 73 79 5f 74 69 6d 65 6f 75 74 22 2c 20 20 20 20  sy_timeout",    
2a650 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
2a660 6f 63 2a 29 74 65 73 74 5f 62 75 73 79 5f 74 69  oc*)test_busy_ti
2a670 6d 65 6f 75 74 20 20 20 20 20 7d 2c 0a 20 20 20  meout     },.   
2a680 20 20 7b 20 22 70 72 69 6e 74 66 22 2c 20 20 20    { "printf",   
2a690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a6a0 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
2a6b0 63 2a 29 74 65 73 74 5f 70 72 69 6e 74 66 20 20  c*)test_printf  
2a6c0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2a6d0 20 7b 20 22 73 71 6c 69 74 65 33 49 6f 54 72 61   { "sqlite3IoTra
2a6e0 63 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ce",            
2a6f0 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
2a700 74 65 73 74 5f 69 6f 5f 74 72 61 63 65 20 20 20  test_io_trace   
2a710 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20        },.  };.  
2a720 73 74 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a  static struct {.
2a730 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
2a740 3b 0a 20 20 20 20 20 54 63 6c 5f 4f 62 6a 43 6d  ;.     Tcl_ObjCm
2a750 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b 0a 20 20  dProc *xProc;.  
2a760 20 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44     void *clientD
2a770 61 74 61 3b 0a 20 20 7d 20 61 4f 62 6a 43 6d 64  ata;.  } aObjCmd
2a780 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 73  [] = {.     { "s
2a790 71 6c 69 74 65 33 5f 63 6f 6e 6e 65 63 74 69 6f  qlite3_connectio
2a7a0 6e 5f 70 6f 69 6e 74 65 72 22 2c 20 20 20 20 67  n_pointer",    g
2a7b0 65 74 5f 73 71 6c 69 74 65 5f 70 6f 69 6e 74 65  et_sqlite_pointe
2a7c0 72 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22  r, 0 },.     { "
2a7d0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
2a7e0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2a7f0 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74 2c 20 20  test_bind_int,  
2a800 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20      0 },.     { 
2a810 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65  "sqlite3_bind_ze
2a820 72 6f 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20  roblob",        
2a830 20 74 65 73 74 5f 62 69 6e 64 5f 7a 65 72 6f 62   test_bind_zerob
2a840 6c 6f 62 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b  lob, 0 },.     {
2a850 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69   "sqlite3_bind_i
2a860 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 20  nt64",          
2a870 20 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74 36    test_bind_int6
2a880 34 2c 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20  4,    0 },.     
2a890 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  { "sqlite3_bind_
2a8a0 64 6f 75 62 6c 65 22 2c 20 20 20 20 20 20 20 20  double",        
2a8b0 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 64 6f 75     test_bind_dou
2a8c0 62 6c 65 2c 20 20 20 30 20 7d 2c 0a 20 20 20 20  ble,   0 },.    
2a8d0 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
2a8e0 5f 6e 75 6c 6c 22 2c 20 20 20 20 20 20 20 20 20  _null",         
2a8f0 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 6e 75      test_bind_nu
2a900 6c 6c 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20  ll     ,0 },.   
2a910 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
2a920 64 5f 74 65 78 74 22 2c 20 20 20 20 20 20 20 20  d_text",        
2a930 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 74       test_bind_t
2a940 65 78 74 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  ext     ,0 },.  
2a950 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
2a960 6e 64 5f 74 65 78 74 31 36 22 2c 20 20 20 20 20  nd_text16",     
2a970 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f        test_bind_
2a980 74 65 78 74 31 36 20 20 20 2c 30 20 7d 2c 0a 20  text16   ,0 },. 
2a990 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
2a9a0 69 6e 64 5f 62 6c 6f 62 22 2c 20 20 20 20 20 20  ind_blob",      
2a9b0 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64         test_bind
2a9c0 5f 62 6c 6f 62 20 20 20 20 20 2c 30 20 7d 2c 0a  _blob     ,0 },.
2a9d0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2a9e0 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63  bind_parameter_c
2a9f0 6f 75 6e 74 22 2c 20 20 74 65 73 74 5f 62 69 6e  ount",  test_bin
2aa00 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e  d_parameter_coun
2aa10 74 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73  t, 0},.     { "s
2aa20 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
2aa30 6d 65 74 65 72 5f 6e 61 6d 65 22 2c 20 20 20 74  meter_name",   t
2aa40 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  est_bind_paramet
2aa50 65 72 5f 6e 61 6d 65 2c 20 20 30 7d 2c 0a 20 20  er_name,  0},.  
2aa60 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
2aa70 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64  nd_parameter_ind
2aa80 65 78 22 2c 20 20 74 65 73 74 5f 62 69 6e 64 5f  ex",  test_bind_
2aa90 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 2c  parameter_index,
2aaa0 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
2aab0 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69  ite3_clear_bindi
2aac0 6e 67 73 22 2c 20 20 20 20 20 20 20 20 74 65 73  ngs",        tes
2aad0 74 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73  t_clear_bindings
2aae0 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  , 0},.     { "sq
2aaf0 6c 69 74 65 33 5f 73 6c 65 65 70 22 2c 20 20 20  lite3_sleep",   
2ab00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
2ab10 73 74 5f 73 6c 65 65 70 2c 20 20 20 20 20 20 20  st_sleep,       
2ab20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73     0},.     { "s
2ab30 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 22 2c  qlite3_errcode",
2ab40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
2ab50 65 73 74 5f 65 72 72 63 6f 64 65 20 20 20 20 20  est_errcode     
2ab60 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
2ab70 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
2ab80 5f 65 72 72 63 6f 64 65 22 2c 20 20 20 20 20 20  _errcode",      
2ab90 74 65 73 74 5f 65 78 5f 65 72 72 63 6f 64 65 20  test_ex_errcode 
2aba0 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
2abb0 22 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 22  "sqlite3_errmsg"
2abc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2abd0 20 74 65 73 74 5f 65 72 72 6d 73 67 20 20 20 20   test_errmsg    
2abe0 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
2abf0 20 22 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67   "sqlite3_errmsg
2ac00 31 36 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  16",            
2ac10 20 20 74 65 73 74 5f 65 72 72 6d 73 67 31 36 20    test_errmsg16 
2ac20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
2ac30 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e 22  { "sqlite3_open"
2ac40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2ac50 20 20 20 74 65 73 74 5f 6f 70 65 6e 20 20 20 20     test_open    
2ac60 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
2ac70 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e   { "sqlite3_open
2ac80 31 36 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  16",            
2ac90 20 20 20 20 74 65 73 74 5f 6f 70 65 6e 31 36 20      test_open16 
2aca0 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
2acb0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70 65    { "sqlite3_ope
2acc0 6e 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20 20  n_v2",          
2acd0 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e 5f 76       test_open_v
2ace0 32 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  2       ,0 },.  
2acf0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
2ad00 6d 70 6c 65 74 65 31 36 22 2c 20 20 20 20 20 20  mplete16",      
2ad10 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6d 70 6c        test_compl
2ad20 65 74 65 31 36 20 20 20 20 2c 30 20 7d 2c 0a 0a  ete16    ,0 },..
2ad30 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2ad40 70 72 65 70 61 72 65 22 2c 20 20 20 20 20 20 20  prepare",       
2ad50 20 20 20 20 20 20 20 20 74 65 73 74 5f 70 72 65          test_pre
2ad60 70 61 72 65 20 20 20 20 20 20 20 2c 30 20 7d 2c  pare       ,0 },
2ad70 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2ad80 5f 70 72 65 70 61 72 65 31 36 22 2c 20 20 20 20  _prepare16",    
2ad90 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 70 72           test_pr
2ada0 65 70 61 72 65 31 36 20 20 20 20 20 2c 30 20 7d  epare16     ,0 }
2adb0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2adc0 33 5f 70 72 65 70 61 72 65 5f 76 32 22 2c 20 20  3_prepare_v2",  
2add0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 70            test_p
2ade0 72 65 70 61 72 65 5f 76 32 20 20 20 20 2c 30 20  repare_v2    ,0 
2adf0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2ae00 65 33 5f 70 72 65 70 61 72 65 5f 74 6b 74 33 31  e3_prepare_tkt31
2ae10 33 34 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f  34",       test_
2ae20 70 72 65 70 61 72 65 5f 74 6b 74 33 31 33 34 2c  prepare_tkt3134,
2ae30 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
2ae40 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 5f 76  ite3_prepare16_v
2ae50 32 22 2c 20 20 20 20 20 20 20 20 20 20 74 65 73  2",          tes
2ae60 74 5f 70 72 65 70 61 72 65 31 36 5f 76 32 20 20  t_prepare16_v2  
2ae70 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
2ae80 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 22 2c  lite3_finalize",
2ae90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
2aea0 73 74 5f 66 69 6e 61 6c 69 7a 65 20 20 20 20 20  st_finalize     
2aeb0 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
2aec0 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74  qlite3_stmt_stat
2aed0 75 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 74  us",           t
2aee0 65 73 74 5f 73 74 6d 74 5f 73 74 61 74 75 73 20  est_stmt_status 
2aef0 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
2af00 73 71 6c 69 74 65 33 5f 72 65 73 65 74 22 2c 20  sqlite3_reset", 
2af10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af20 74 65 73 74 5f 72 65 73 65 74 20 20 20 20 20 20  test_reset      
2af30 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
2af40 22 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64  "sqlite3_expired
2af50 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2af60 20 74 65 73 74 5f 65 78 70 69 72 65 64 20 20 20   test_expired   
2af70 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
2af80 20 22 73 71 6c 69 74 65 33 5f 74 72 61 6e 73 66   "sqlite3_transf
2af90 65 72 5f 62 69 6e 64 69 6e 67 73 22 2c 20 20 20  er_bindings",   
2afa0 20 20 74 65 73 74 5f 74 72 61 6e 73 66 65 72 5f    test_transfer_
2afb0 62 69 6e 64 20 2c 30 20 7d 2c 0a 20 20 20 20 20  bind ,0 },.     
2afc0 7b 20 22 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  { "sqlite3_chang
2afd0 65 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  es",            
2afe0 20 20 20 74 65 73 74 5f 63 68 61 6e 67 65 73 20     test_changes 
2aff0 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
2b000 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 65 70   { "sqlite3_step
2b010 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2b020 20 20 20 20 74 65 73 74 5f 73 74 65 70 20 20 20      test_step   
2b030 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
2b040 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 71 6c    { "sqlite3_sql
2b050 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2b060 20 20 20 20 20 74 65 73 74 5f 73 71 6c 20 20 20       test_sql   
2b070 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20          ,0 },.  
2b080 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6e 65     { "sqlite3_ne
2b090 78 74 5f 73 74 6d 74 22 2c 20 20 20 20 20 20 20  xt_stmt",       
2b0a0 20 20 20 20 20 20 74 65 73 74 5f 6e 65 78 74 5f        test_next_
2b0b0 73 74 6d 74 20 20 20 20 20 2c 30 20 7d 2c 0a 20  stmt     ,0 },. 
2b0c0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73      { "sqlite3_s
2b0d0 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 22 2c 20 20  tmt_readonly",  
2b0e0 20 20 20 20 20 20 20 74 65 73 74 5f 73 74 6d 74         test_stmt
2b0f0 5f 72 65 61 64 6f 6e 6c 79 20 2c 30 20 7d 2c 0a  _readonly ,0 },.
2b100 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2b110 73 74 6d 74 5f 62 75 73 79 22 2c 20 20 20 20 20  stmt_busy",     
2b120 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 74 6d          test_stm
2b130 74 5f 62 75 73 79 20 20 20 20 20 2c 30 20 7d 2c  t_busy     ,0 },
2b140 0a 20 20 20 20 20 7b 20 22 75 73 65 73 5f 73 74  .     { "uses_st
2b150 6d 74 5f 6a 6f 75 72 6e 61 6c 22 2c 20 20 20 20  mt_journal",    
2b160 20 20 20 20 20 20 20 20 20 75 73 65 73 5f 73 74           uses_st
2b170 6d 74 5f 6a 6f 75 72 6e 61 6c 20 2c 30 20 7d 2c  mt_journal ,0 },
2b180 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ..     { "sqlite
2b190 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  3_release_memory
2b1a0 22 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f 72  ",        test_r
2b1b0 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 2c 20 20  elease_memory,  
2b1c0 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73     0},.     { "s
2b1d0 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73  qlite3_db_releas
2b1e0 65 5f 6d 65 6d 6f 72 79 22 2c 20 20 20 20 20 74  e_memory",     t
2b1f0 65 73 74 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d  est_db_release_m
2b200 65 6d 6f 72 79 2c 20 20 30 7d 2c 0a 20 20 20 20  emory,  0},.    
2b210 20 7b 20 22 73 71 6c 69 74 65 33 5f 64 62 5f 66   { "sqlite3_db_f
2b220 69 6c 65 6e 61 6d 65 22 2c 20 20 20 20 20 20 20  ilename",       
2b230 20 20 20 20 74 65 73 74 5f 64 62 5f 66 69 6c 65      test_db_file
2b240 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 30 7d 2c  name,        0},
2b250 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2b260 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74  _soft_heap_limit
2b270 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f 73 6f  ",       test_so
2b280 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 2c 20 20  ft_heap_limit,  
2b290 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71    0},.     { "sq
2b2a0 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65  lite3_thread_cle
2b2b0 61 6e 75 70 22 2c 20 20 20 20 20 20 20 20 74 65  anup",        te
2b2c0 73 74 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75  st_thread_cleanu
2b2d0 70 2c 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20  p,     0},.     
2b2e0 7b 20 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72  { "sqlite3_pager
2b2f0 5f 72 65 66 63 6f 75 6e 74 73 22 2c 20 20 20 20  _refcounts",    
2b300 20 20 20 74 65 73 74 5f 70 61 67 65 72 5f 72 65     test_pager_re
2b310 66 63 6f 75 6e 74 73 2c 20 20 20 20 30 7d 2c 0a  fcounts,    0},.
2b320 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2b330 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 22  _load_extension"
2b340 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f 6c 6f  ,        test_lo
2b350 61 64 5f 65 78 74 65 6e 73 69 6f 6e 2c 20 20 20  ad_extension,   
2b360 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71    0},.     { "sq
2b370 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61  lite3_enable_loa
2b380 64 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 20 74 65  d_extension", te
2b390 73 74 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 2c 20  st_enable_load, 
2b3a0 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
2b3b0 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  { "sqlite3_exten
2b3c0 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73  ded_result_codes
2b3d0 22 2c 20 74 65 73 74 5f 65 78 74 65 6e 64 65 64  ", test_extended
2b3e0 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 2c 20 30  _result_codes, 0
2b3f0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2b400 65 33 5f 6c 69 6d 69 74 22 2c 20 20 20 20 20 20  e3_limit",      
2b410 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
2b420 6c 69 6d 69 74 2c 20 20 20 20 20 20 20 20 20 20  limit,          
2b430 20 20 20 20 20 20 20 30 7d 2c 0a 0a 20 20 20 20         0},..    
2b440 20 7b 20 22 73 61 76 65 5f 70 72 6e 67 5f 73 74   { "save_prng_st
2b450 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ate",           
2b460 20 20 20 20 73 61 76 65 5f 70 72 6e 67 5f 73 74      save_prng_st
2b470 61 74 65 2c 20 20 20 20 30 20 7d 2c 0a 20 20 20  ate,    0 },.   
2b480 20 20 7b 20 22 72 65 73 74 6f 72 65 5f 70 72 6e    { "restore_prn
2b490 67 5f 73 74 61 74 65 22 2c 20 20 20 20 20 20 20  g_state",       
2b4a0 20 20 20 20 20 72 65 73 74 6f 72 65 5f 70 72 6e       restore_prn
2b4b0 67 5f 73 74 61 74 65 2c 20 30 20 7d 2c 0a 20 20  g_state, 0 },.  
2b4c0 20 20 20 7b 20 22 72 65 73 65 74 5f 70 72 6e 67     { "reset_prng
2b4d0 5f 73 74 61 74 65 22 2c 20 20 20 20 20 20 20 20  _state",        
2b4e0 20 20 20 20 20 20 72 65 73 65 74 5f 70 72 6e 67        reset_prng
2b4f0 5f 73 74 61 74 65 2c 20 20 20 30 20 7d 2c 0a 20  _state,   0 },. 
2b500 20 20 20 20 7b 20 22 6f 70 74 69 6d 69 7a 61 74      { "optimizat
2b510 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 22 2c 20 20 20  ion_control",   
2b520 20 20 20 20 20 20 20 6f 70 74 69 6d 69 7a 61 74         optimizat
2b530 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 2c 30 7d 2c 0a  ion_control,0},.
2b540 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
2b550 4e 0a 20 20 20 20 20 7b 20 22 6c 6f 63 6b 5f 77  N.     { "lock_w
2b560 69 6e 33 32 5f 66 69 6c 65 22 2c 20 20 20 20 20  in32_file",     
2b570 20 20 20 20 20 20 20 20 20 20 77 69 6e 33 32 5f            win32_
2b580 66 69 6c 65 5f 6c 6f 63 6b 2c 20 20 20 20 30 20  file_lock,    0 
2b590 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b  },.#endif.     {
2b5a0 20 22 74 63 6c 5f 6f 62 6a 70 72 6f 63 22 2c 20   "tcl_objproc", 
2b5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b5c0 20 20 72 75 6e 41 73 4f 62 6a 50 72 6f 63 2c 20    runAsObjProc, 
2b5d0 20 20 20 20 20 20 30 20 7d 2c 0a 0a 20 20 20 20        0 },..    
2b5e0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   /* sqlite3_colu
2b5f0 6d 6e 5f 2a 28 29 20 41 50 49 20 2a 2f 0a 20 20  mn_*() API */.  
2b600 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
2b610 6c 75 6d 6e 5f 63 6f 75 6e 74 22 2c 20 20 20 20  lumn_count",    
2b620 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d        test_colum
2b630 6e 5f 63 6f 75 6e 74 20 20 2c 30 20 7d 2c 0a 20  n_count  ,0 },. 
2b640 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 64      { "sqlite3_d
2b650 61 74 61 5f 63 6f 75 6e 74 22 2c 20 20 20 20 20  ata_count",     
2b660 20 20 20 20 20 20 20 74 65 73 74 5f 64 61 74 61         test_data
2b670 5f 63 6f 75 6e 74 20 20 20 20 2c 30 20 7d 2c 0a  _count    ,0 },.
2b680 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2b690 63 6f 6c 75 6d 6e 5f 74 79 70 65 22 2c 20 20 20  column_type",   
2b6a0 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c          test_col
2b6b0 75 6d 6e 5f 74 79 70 65 20 20 20 2c 30 20 7d 2c  umn_type   ,0 },
2b6c0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2b6d0 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 22 2c 20 20  _column_blob",  
2b6e0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f           test_co
2b6f0 6c 75 6d 6e 5f 62 6c 6f 62 20 20 20 2c 30 20 7d  lumn_blob   ,0 }
2b700 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2b710 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 22  3_column_double"
2b720 2c 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63  ,         test_c
2b730 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 20 2c 30 20  olumn_double ,0 
2b740 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2b750 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 22  e3_column_int64"
2b760 2c 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f  ,          test_
2b770 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20 20 2c 30  column_int64  ,0
2b780 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2b790 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 22  te3_column_text"
2b7a0 2c 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74  ,   test_stmt_ut
2b7b0 66 38 2c 20 20 28 76 6f 69 64 2a 29 73 71 6c 69  f8,  (void*)sqli
2b7c0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20  te3_column_text 
2b7d0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2b7e0 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 22 2c  e3_column_name",
2b7f0 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66     test_stmt_utf
2b800 38 2c 20 20 28 76 6f 69 64 2a 29 73 71 6c 69 74  8,  (void*)sqlit
2b810 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 7d  e3_column_name }
2b820 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2b830 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 22 2c 20 20  3_column_int",  
2b840 20 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c    test_stmt_int,
2b850 20 20 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65     (void*)sqlite
2b860 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 20 20 7d 2c  3_column_int  },
2b870 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2b880 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 22 2c 20  _column_bytes", 
2b890 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20   test_stmt_int, 
2b8a0 20 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33    (void*)sqlite3
2b8b0 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 7d 2c 0a  _column_bytes},.
2b8c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2b8d0 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 20  MIT_DECLTYPE.   
2b8e0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
2b8f0 75 6d 6e 5f 64 65 63 6c 74 79 70 65 22 2c 74 65  umn_decltype",te
2b900 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 28 76 6f  st_stmt_utf8,(vo
2b910 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  id*)sqlite3_colu
2b920 6d 6e 5f 64 65 63 6c 74 79 70 65 7d 2c 0a 23 65  mn_decltype},.#e
2b930 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
2b940 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
2b950 5f 4d 45 54 41 44 41 54 41 0a 7b 20 22 73 71 6c  _METADATA.{ "sql
2b960 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61  ite3_column_data
2b970 62 61 73 65 5f 6e 61 6d 65 22 2c 74 65 73 74 5f  base_name",test_
2b980 73 74 6d 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a  stmt_utf8,(void*
2b990 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
2b9a0 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 7d 2c 0a  database_name},.
2b9b0 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
2b9c0 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 22 2c 74 65  n_table_name",te
2b9d0 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 28 76 6f  st_stmt_utf8,(vo
2b9e0 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  id*)sqlite3_colu
2b9f0 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 7d 2c 0a  mn_table_name},.
2ba00 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
2ba10 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 22 2c 74  n_origin_name",t
2ba20 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 28 76  est_stmt_utf8,(v
2ba30 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  oid*)sqlite3_col
2ba40 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 7d  umn_origin_name}
2ba50 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ,.#endif..#ifnde
2ba60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
2ba70 46 31 36 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  F16.     { "sqli
2ba80 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
2ba90 31 36 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f 69  16", test_stmt_i
2baa0 6e 74 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74  nt, (void*)sqlit
2bab0 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31  e3_column_bytes1
2bac0 36 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  6 },.     { "sql
2bad0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
2bae0 31 36 22 2c 20 20 74 65 73 74 5f 73 74 6d 74 5f  16",  test_stmt_
2baf0 75 74 66 31 36 2c 20 28 76 6f 69 64 2a 29 73 71  utf16, (void*)sq
2bb00 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
2bb10 74 31 36 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  t16},.     { "sq
2bb20 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  lite3_column_nam
2bb30 65 31 36 22 2c 20 20 74 65 73 74 5f 73 74 6d 74  e16",  test_stmt
2bb40 5f 75 74 66 31 36 2c 20 28 76 6f 69 64 2a 29 73  _utf16, (void*)s
2bb50 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61  qlite3_column_na
2bb60 6d 65 31 36 7d 2c 0a 20 20 20 20 20 7b 20 22 61  me16},.     { "a
2bb70 64 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73  dd_alignment_tes
2bb80 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73 22 2c 20 61  t_collations", a
2bb90 64 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73  dd_alignment_tes
2bba0 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73 2c 20 30 20  t_collations, 0 
2bbb0 20 20 20 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20       },.#ifndef 
2bbc0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
2bbd0 54 59 50 45 0a 20 20 20 20 20 7b 20 22 73 71 6c  TYPE.     { "sql
2bbe0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c  ite3_column_decl
2bbf0 74 79 70 65 31 36 22 2c 74 65 73 74 5f 73 74 6d  type16",test_stm
2bc00 74 5f 75 74 66 31 36 2c 28 76 6f 69 64 2a 29 73  t_utf16,(void*)s
2bc10 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65  qlite3_column_de
2bc20 63 6c 74 79 70 65 31 36 7d 2c 0a 23 65 6e 64 69  cltype16},.#endi
2bc30 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
2bc40 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
2bc50 54 41 44 41 54 41 0a 7b 22 73 71 6c 69 74 65 33  TADATA.{"sqlite3
2bc60 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65  _column_database
2bc70 5f 6e 61 6d 65 31 36 22 2c 0a 20 20 74 65 73 74  _name16",.  test
2bc80 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 73 71 6c  _stmt_utf16, sql
2bc90 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61  ite3_column_data
2bca0 62 61 73 65 5f 6e 61 6d 65 31 36 7d 2c 0a 7b 22  base_name16},.{"
2bcb0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
2bcc0 61 62 6c 65 5f 6e 61 6d 65 31 36 22 2c 20 74 65  able_name16", te
2bcd0 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 28  st_stmt_utf16, (
2bce0 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f  void*)sqlite3_co
2bcf0 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 31  lumn_table_name1
2bd00 36 7d 2c 0a 7b 22 73 71 6c 69 74 65 33 5f 63 6f  6},.{"sqlite3_co
2bd10 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65  lumn_origin_name
2bd20 31 36 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f 75  16", test_stmt_u
2bd30 74 66 31 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c  tf16, (void*)sql
2bd40 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67  ite3_column_orig
2bd50 69 6e 5f 6e 61 6d 65 31 36 7d 2c 0a 23 65 6e 64  in_name16},.#end
2bd60 69 66 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b  if.#endif.     {
2bd70 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65   "sqlite3_create
2bd80 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 22 2c 20  _collation_v2", 
2bd90 74 65 73 74 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  test_create_coll
2bda0 61 74 69 6f 6e 5f 76 32 2c 20 30 20 7d 2c 0a 20  ation_v2, 0 },. 
2bdb0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 67      { "sqlite3_g
2bdc0 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 22 2c 20  lobal_recover", 
2bdd0 20 20 20 20 74 65 73 74 5f 67 6c 6f 62 61 6c 5f      test_global_
2bde0 72 65 63 6f 76 65 72 2c 20 30 20 20 20 7d 2c 0a  recover, 0   },.
2bdf0 20 20 20 20 20 7b 20 22 77 6f 72 6b 69 6e 67 5f       { "working_
2be00 36 34 62 69 74 5f 69 6e 74 22 2c 20 20 20 20 20  64bit_int",     
2be10 20 20 20 20 20 77 6f 72 6b 69 6e 67 5f 36 34 62       working_64b
2be20 69 74 5f 69 6e 74 2c 20 20 20 30 20 20 20 7d 2c  it_int,   0   },
2be30 0a 20 20 20 20 20 7b 20 22 76 66 73 5f 75 6e 6c  .     { "vfs_unl
2be40 69 6e 6b 5f 74 65 73 74 22 2c 20 20 20 20 20 20  ink_test",      
2be50 20 20 20 20 20 20 76 66 73 5f 75 6e 6c 69 6e 6b        vfs_unlink
2be60 5f 74 65 73 74 2c 20 20 20 20 20 30 20 20 20 7d  _test,     0   }
2be70 2c 0a 20 20 20 20 20 7b 20 22 76 66 73 5f 69 6e  ,.     { "vfs_in
2be80 69 74 66 61 69 6c 5f 74 65 73 74 22 2c 20 20 20  itfail_test",   
2be90 20 20 20 20 20 20 20 76 66 73 5f 69 6e 69 74 66         vfs_initf
2bea0 61 69 6c 5f 74 65 73 74 2c 20 20 20 30 20 20 20  ail_test,   0   
2beb0 7d 2c 0a 20 20 20 20 20 7b 20 22 76 66 73 5f 75  },.     { "vfs_u
2bec0 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c 22 2c 20  nregister_all", 
2bed0 20 20 20 20 20 20 20 20 76 66 73 5f 75 6e 72 65          vfs_unre
2bee0 67 69 73 74 65 72 5f 61 6c 6c 2c 20 20 30 20 20  gister_all,  0  
2bef0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 76 66 73 5f   },.     { "vfs_
2bf00 72 65 72 65 67 69 73 74 65 72 5f 61 6c 6c 22 2c  reregister_all",
2bf10 20 20 20 20 20 20 20 20 20 76 66 73 5f 72 65 72           vfs_rer
2bf20 65 67 69 73 74 65 72 5f 61 6c 6c 2c 20 20 30 20  egister_all,  0 
2bf30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c    },.     { "fil
2bf40 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73 74 22 2c  e_control_test",
2bf50 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 5f 63            file_c
2bf60 6f 6e 74 72 6f 6c 5f 74 65 73 74 2c 20 20 20 30  ontrol_test,   0
2bf70 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69     },.     { "fi
2bf80 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65  le_control_laste
2bf90 72 72 6e 6f 5f 74 65 73 74 22 2c 20 66 69 6c 65  rrno_test", file
2bfa0 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72 72  _control_lasterr
2bfb0 6e 6f 5f 74 65 73 74 2c 20 20 30 20 20 20 7d 2c  no_test,  0   },
2bfc0 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f  .     { "file_co
2bfd0 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f  ntrol_lockproxy_
2bfe0 74 65 73 74 22 2c 20 66 69 6c 65 5f 63 6f 6e 74  test", file_cont
2bff0 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74 65  rol_lockproxy_te
2c000 73 74 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20 20  st,  0   },.    
2c010 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c   { "file_control
2c020 5f 63 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74 22  _chunksize_test"
2c030 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63  , file_control_c
2c040 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74 2c 20 20  hunksize_test,  
2c050 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66  0   },.     { "f
2c060 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69 7a 65  ile_control_size
2c070 68 69 6e 74 5f 74 65 73 74 22 2c 20 20 66 69 6c  hint_test",  fil
2c080 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69 7a 65 68 69  e_control_sizehi
2c090 6e 74 5f 74 65 73 74 2c 20 20 20 30 20 20 20 7d  nt_test,   0   }
2c0a0 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63  ,.     { "file_c
2c0b0 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 61 76 5f  ontrol_win32_av_
2c0c0 72 65 74 72 79 22 2c 20 66 69 6c 65 5f 63 6f 6e  retry", file_con
2c0d0 74 72 6f 6c 5f 77 69 6e 33 32 5f 61 76 5f 72 65  trol_win32_av_re
2c0e0 74 72 79 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20  try,  0   },.   
2c0f0 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f    { "file_contro
2c100 6c 5f 70 65 72 73 69 73 74 5f 77 61 6c 22 2c 20  l_persist_wal", 
2c110 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
2c120 70 65 72 73 69 73 74 5f 77 61 6c 2c 20 20 20 20  persist_wal,    
2c130 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   0   },.     { "
2c140 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 6f 77  file_control_pow
2c150 65 72 73 61 66 65 5f 6f 76 65 72 77 72 69 74 65  ersafe_overwrite
2c160 22 2c 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70  ",file_control_p
2c170 6f 77 65 72 73 61 66 65 5f 6f 76 65 72 77 72 69  owersafe_overwri
2c180 74 65 2c 30 7d 2c 0a 20 20 20 20 20 7b 20 22 66  te,0},.     { "f
2c190 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e  ile_control_vfsn
2c1a0 61 6d 65 22 2c 20 20 20 20 20 20 20 20 66 69 6c  ame",        fil
2c1b0 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d  e_control_vfsnam
2c1c0 65 2c 20 20 20 20 20 20 20 20 20 30 20 20 20 7d  e,         0   }
2c1d0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2c1e0 33 5f 76 66 73 5f 6c 69 73 74 22 2c 20 20 20 20  3_vfs_list",    
2c1f0 20 20 20 20 20 20 20 76 66 73 5f 6c 69 73 74 2c         vfs_list,
2c200 20 20 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20       0   },.    
2c210 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61   { "sqlite3_crea
2c220 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 22 2c  te_function_v2",
2c230 20 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75 6e   test_create_fun
2c240 63 74 69 6f 6e 5f 76 32 2c 20 30 20 7d 2c 0a 0a  ction_v2, 0 },..
2c250 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
2c260 73 20 66 72 6f 6d 20 6f 73 2e 68 20 2a 2f 0a 23  s from os.h */.#
2c270 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2c280 49 54 5f 55 54 46 31 36 0a 20 20 20 20 20 7b 20  IT_UTF16.     { 
2c290 22 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74  "add_test_collat
2c2a0 65 22 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f  e",        test_
2c2b0 63 6f 6c 6c 61 74 65 2c 20 30 20 20 20 20 20 20  collate, 0      
2c2c0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
2c2d0 22 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74  "add_test_collat
2c2e0 65 5f 6e 65 65 64 65 64 22 2c 20 74 65 73 74 5f  e_needed", test_
2c2f0 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 2c 20  collate_needed, 
2c300 30 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20  0     },.     { 
2c310 22 61 64 64 5f 74 65 73 74 5f 66 75 6e 63 74 69  "add_test_functi
2c320 6f 6e 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f  on",       test_
2c330 66 75 6e 63 74 69 6f 6e 2c 20 30 20 20 20 20 20  function, 0     
2c340 20 20 20 20 20 20 7d 2c 0a 23 65 6e 64 69 66 0a        },.#endif.
2c350 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2c360 74 65 73 74 5f 65 72 72 73 74 72 22 2c 20 20 20  test_errstr",   
2c370 20 20 74 65 73 74 5f 65 72 72 73 74 72 2c 20 30    test_errstr, 0
2c380 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
2c390 20 20 20 20 20 7b 20 22 74 63 6c 5f 76 61 72 69       { "tcl_vari
2c3a0 61 62 6c 65 5f 74 79 70 65 22 2c 20 20 20 20 20  able_type",     
2c3b0 20 20 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74    tcl_variable_t
2c3c0 79 70 65 2c 20 30 20 20 20 20 20 20 20 7d 2c 0a  ype, 0       },.
2c3d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2c3e0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
2c3f0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2c400 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63  _enable_shared_c
2c410 61 63 68 65 22 2c 20 74 65 73 74 5f 65 6e 61 62  ache", test_enab
2c420 6c 65 5f 73 68 61 72 65 64 2c 20 30 20 20 7d 2c  le_shared, 0  },
2c430 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2c440 5f 73 68 61 72 65 64 5f 63 61 63 68 65 5f 72 65  _shared_cache_re
2c450 70 6f 72 74 22 2c 20 73 71 6c 69 74 65 33 42 74  port", sqlite3Bt
2c460 72 65 65 53 68 61 72 65 64 43 61 63 68 65 52 65  reeSharedCacheRe
2c470 70 6f 72 74 2c 20 30 7d 2c 0a 23 65 6e 64 69 66  port, 0},.#endif
2c480 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2c490 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62  _libversion_numb
2c4a0 65 72 22 2c 20 74 65 73 74 5f 6c 69 62 76 65 72  er", test_libver
2c4b0 73 69 6f 6e 5f 6e 75 6d 62 65 72 2c 20 30 20 20  sion_number, 0  
2c4c0 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  },.#ifdef SQLITE
2c4d0 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
2c4e0 45 54 41 44 41 54 41 0a 20 20 20 20 20 7b 20 22  ETADATA.     { "
2c4f0 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f  sqlite3_table_co
2c500 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 22 2c 20  lumn_metadata", 
2c510 74 65 73 74 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  test_table_colum
2c520 6e 5f 6d 65 74 61 64 61 74 61 2c 20 30 20 20 7d  n_metadata, 0  }
2c530 2c 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  ,.#endif.#ifndef
2c540 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
2c550 52 42 4c 4f 42 0a 20 20 20 20 20 7b 20 22 73 71  RBLOB.     { "sq
2c560 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 22  lite3_blob_read"
2c570 2c 20 20 20 74 65 73 74 5f 62 6c 6f 62 5f 72 65  ,   test_blob_re
2c580 61 64 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b  ad, 0  },.     {
2c590 20 22 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77   "sqlite3_blob_w
2c5a0 72 69 74 65 22 2c 20 20 74 65 73 74 5f 62 6c 6f  rite",  test_blo
2c5b0 62 5f 77 72 69 74 65 2c 20 30 20 20 7d 2c 0a 20  b_write, 0  },. 
2c5c0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
2c5d0 6c 6f 62 5f 72 65 6f 70 65 6e 22 2c 20 74 65 73  lob_reopen", tes
2c5e0 74 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 2c 20 30  t_blob_reopen, 0
2c5f0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2c600 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 22  ite3_blob_bytes"
2c610 2c 20 20 74 65 73 74 5f 62 6c 6f 62 5f 62 79 74  ,  test_blob_byt
2c620 65 73 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b  es, 0  },.     {
2c630 20 22 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63   "sqlite3_blob_c
2c640 6c 6f 73 65 22 2c 20 20 74 65 73 74 5f 62 6c 6f  lose",  test_blo
2c650 62 5f 63 6c 6f 73 65 2c 20 30 20 20 7d 2c 0a 23  b_close, 0  },.#
2c660 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 70 63  endif.     { "pc
2c670 61 63 68 65 5f 73 74 61 74 73 22 2c 20 20 20 20  ache_stats",    
2c680 20 20 20 74 65 73 74 5f 70 63 61 63 68 65 5f 73     test_pcache_s
2c690 74 61 74 73 2c 20 30 20 20 7d 2c 0a 23 69 66 64  tats, 0  },.#ifd
2c6a0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2c6b0 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 20  _UNLOCK_NOTIFY. 
2c6c0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 75      { "sqlite3_u
2c6d0 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c 20 74  nlock_notify", t
2c6e0 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66  est_unlock_notif
2c6f0 79 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a  y, 0  },.#endif.
2c700 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2c710 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 22 2c  wal_checkpoint",
2c720 20 20 20 74 65 73 74 5f 77 61 6c 5f 63 68 65 63     test_wal_chec
2c730 6b 70 6f 69 6e 74 2c 20 30 20 20 7d 2c 0a 20 20  kpoint, 0  },.  
2c740 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 77 61     { "sqlite3_wa
2c750 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 22  l_checkpoint_v2"
2c760 2c 74 65 73 74 5f 77 61 6c 5f 63 68 65 63 6b 70  ,test_wal_checkp
2c770 6f 69 6e 74 5f 76 32 2c 20 30 20 20 7d 2c 0a 20  oint_v2, 0  },. 
2c780 20 20 20 20 7b 20 22 74 65 73 74 5f 73 71 6c 69      { "test_sqli
2c790 74 65 33 5f 6c 6f 67 22 2c 20 20 20 20 20 20 20  te3_log",       
2c7a0 20 20 74 65 73 74 5f 73 71 6c 69 74 65 33 5f 6c    test_sqlite3_l
2c7b0 6f 67 2c 20 30 20 20 7d 2c 0a 23 69 66 6e 64 65  og, 0  },.#ifnde
2c7c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
2c7d0 50 4c 41 49 4e 0a 20 20 20 20 20 7b 20 22 70 72  PLAIN.     { "pr
2c7e0 69 6e 74 5f 65 78 70 6c 61 69 6e 5f 71 75 65 72  int_explain_quer
2c7f0 79 5f 70 6c 61 6e 22 2c 20 74 65 73 74 5f 70 72  y_plan", test_pr
2c800 69 6e 74 5f 65 71 70 2c 20 30 20 20 7d 2c 0a 23  int_eqp, 0  },.#
2c810 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71  endif.     { "sq
2c820 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
2c830 6f 6c 22 2c 20 74 65 73 74 5f 74 65 73 74 5f 63  ol", test_test_c
2c840 6f 6e 74 72 6f 6c 20 7d 2c 0a 20 20 7d 3b 0a 20  ontrol },.  };. 
2c850 20 73 74 61 74 69 63 20 69 6e 74 20 62 69 74 6d   static int bitm
2c860 61 73 6b 5f 73 69 7a 65 20 3d 20 73 69 7a 65 6f  ask_size = sizeo
2c870 66 28 42 69 74 6d 61 73 6b 29 2a 38 3b 0a 20 20  f(Bitmask)*8;.  
2c880 69 6e 74 20 69 3b 0a 20 20 65 78 74 65 72 6e 20  int i;.  extern 
2c890 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  int sqlite3_sync
2c8a0 5f 63 6f 75 6e 74 2c 20 73 71 6c 69 74 65 33 5f  _count, sqlite3_
2c8b0 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 3b 0a  fullsync_count;.
2c8c0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
2c8d0 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
2c8e0 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  unt;.  extern in
2c8f0 74 20 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f 63  t sqlite3_like_c
2c900 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69  ount;.  extern i
2c910 6e 74 20 73 71 6c 69 74 65 33 5f 78 66 65 72 6f  nt sqlite3_xfero
2c920 70 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  pt_count;.  exte
2c930 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  rn int sqlite3_p
2c940 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
2c950 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  t;.  extern int 
2c960 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
2c970 69 74 65 64 62 5f 63 6f 75 6e 74 3b 0a 20 20 65  itedb_count;.  e
2c980 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
2c990 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
2c9a0 6f 75 6e 74 3b 0a 23 69 66 20 53 51 4c 49 54 45  ount;.#if SQLITE
2c9b0 5f 4f 53 5f 57 49 4e 0a 20 20 65 78 74 65 72 6e  _OS_WIN.  extern
2c9c0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f   int sqlite3_os_
2c9d0 74 79 70 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66  type;.#endif.#if
2c9e0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2c9f0 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
2ca00 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 3b  lite3WhereTrace;
2ca10 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
2ca20 6c 69 74 65 33 4f 53 54 72 61 63 65 3b 0a 20 20  lite3OSTrace;.  
2ca30 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
2ca40 65 33 56 64 62 65 41 64 64 6f 70 54 72 61 63 65  e3VdbeAddopTrace
2ca50 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
2ca60 71 6c 69 74 65 33 57 61 6c 54 72 61 63 65 3b 0a  qlite3WalTrace;.
2ca70 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
2ca80 4c 49 54 45 5f 54 45 53 54 0a 20 20 65 78 74 65  LITE_TEST.  exte
2ca90 72 6e 20 63 68 61 72 20 73 71 6c 69 74 65 33 5f  rn char sqlite3_
2caa0 71 75 65 72 79 5f 70 6c 61 6e 5b 5d 3b 0a 20 20  query_plan[];.  
2cab0 73 74 61 74 69 63 20 63 68 61 72 20 2a 71 75 65  static char *que
2cac0 72 79 5f 70 6c 61 6e 20 3d 20 73 71 6c 69 74 65  ry_plan = sqlite
2cad0 33 5f 71 75 65 72 79 5f 70 6c 61 6e 3b 0a 23 69  3_query_plan;.#i
2cae0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
2caf0 4c 45 5f 46 54 53 33 0a 20 20 65 78 74 65 72 6e  LE_FTS3.  extern
2cb00 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 74 73   int sqlite3_fts
2cb10 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65 6e 74 68  3_enable_parenth
2cb20 65 73 65 73 3b 0a 23 65 6e 64 69 66 0a 23 65 6e  eses;.#endif.#en
2cb30 64 69 66 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  dif..  for(i=0; 
2cb40 69 3c 73 69 7a 65 6f 66 28 61 43 6d 64 29 2f 73  i<sizeof(aCmd)/s
2cb50 69 7a 65 6f 66 28 61 43 6d 64 5b 30 5d 29 3b 20  izeof(aCmd[0]); 
2cb60 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72  i++){.    Tcl_Cr
2cb70 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eateCommand(inte
2cb80 72 70 2c 20 61 43 6d 64 5b 69 5d 2e 7a 4e 61 6d  rp, aCmd[i].zNam
2cb90 65 2c 20 61 43 6d 64 5b 69 5d 2e 78 50 72 6f 63  e, aCmd[i].xProc
2cba0 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 66  , 0, 0);.  }.  f
2cbb0 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
2cbc0 28 61 4f 62 6a 43 6d 64 29 2f 73 69 7a 65 6f 66  (aObjCmd)/sizeof
2cbd0 28 61 4f 62 6a 43 6d 64 5b 30 5d 29 3b 20 69 2b  (aObjCmd[0]); i+
2cbe0 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  +){.    Tcl_Crea
2cbf0 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
2cc00 65 72 70 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e  erp, aObjCmd[i].
2cc10 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20  zName, .        
2cc20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 78 50 72 6f 63  aObjCmd[i].xProc
2cc30 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 63 6c 69  , aObjCmd[i].cli
2cc40 65 6e 74 44 61 74 61 2c 20 30 29 3b 0a 20 20 7d  entData, 0);.  }
2cc50 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
2cc60 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73  nterp, "sqlite_s
2cc70 65 61 72 63 68 5f 63 6f 75 6e 74 22 2c 20 0a 20  earch_count", . 
2cc80 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
2cc90 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e  ite3_search_coun
2cca0 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  t, TCL_LINK_INT)
2ccb0 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
2ccc0 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
2ccd0 66 6f 75 6e 64 5f 63 6f 75 6e 74 22 2c 20 0a 20  found_count", . 
2cce0 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
2ccf0 69 74 65 33 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74  ite3_found_count
2cd00 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
2cd10 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
2cd20 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73  nterp, "sqlite_s
2cd30 6f 72 74 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20  ort_count", .   
2cd40 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
2cd50 65 33 5f 73 6f 72 74 5f 63 6f 75 6e 74 2c 20 54  e3_sort_count, T
2cd60 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
2cd70 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
2cd80 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 6d 61 78  rp, "sqlite3_max
2cd90 5f 62 6c 6f 62 73 69 7a 65 22 2c 20 0a 20 20 20  _blobsize", .   
2cda0 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
2cdb0 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a 65 2c  e3_max_blobsize,
2cdc0 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
2cdd0 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
2cde0 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6c 69  terp, "sqlite_li
2cdf0 6b 65 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20  ke_count", .    
2ce00 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
2ce10 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 2c 20 54 43  3_like_count, TC
2ce20 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54  L_LINK_INT);.  T
2ce30 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
2ce40 70 2c 20 22 73 71 6c 69 74 65 5f 69 6e 74 65 72  p, "sqlite_inter
2ce50 72 75 70 74 5f 63 6f 75 6e 74 22 2c 20 0a 20 20  rupt_count", .  
2ce60 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
2ce70 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f  te3_interrupt_co
2ce80 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  unt, TCL_LINK_IN
2ce90 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  T);.  Tcl_LinkVa
2cea0 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
2ceb0 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e  e_open_file_coun
2cec0 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72  t", .      (char
2ced0 2a 29 26 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  *)&sqlite3_open_
2cee0 66 69 6c 65 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  file_count, TCL_
2cef0 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
2cf00 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
2cf10 20 22 73 71 6c 69 74 65 5f 63 75 72 72 65 6e 74   "sqlite_current
2cf20 5f 74 69 6d 65 22 2c 20 0a 20 20 20 20 20 20 28  _time", .      (
2cf30 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 63  char*)&sqlite3_c
2cf40 75 72 72 65 6e 74 5f 74 69 6d 65 2c 20 54 43 4c  urrent_time, TCL
2cf50 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66 20  _LINK_INT);.#if 
2cf60 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20 26  SQLITE_OS_UNIX &
2cf70 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
2cf80 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
2cf90 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2cfa0 59 4c 45 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  YLE.  Tcl_LinkVa
2cfb0 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
2cfc0 65 5f 68 6f 73 74 69 64 5f 6e 75 6d 22 2c 20 0a  e_hostid_num", .
2cfd0 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
2cfe0 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d  lite3_hostid_num
2cff0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
2d000 0a 23 65 6e 64 69 66 0a 20 20 54 63 6c 5f 4c 69  .#endif.  Tcl_Li
2d010 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
2d020 71 6c 69 74 65 33 5f 78 66 65 72 6f 70 74 5f 63  qlite3_xferopt_c
2d030 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68  ount",.      (ch
2d040 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 78 66 65  ar*)&sqlite3_xfe
2d050 72 6f 70 74 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  ropt_count, TCL_
2d060 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
2d070 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
2d080 20 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f   "sqlite3_pager_
2d090 72 65 61 64 64 62 5f 63 6f 75 6e 74 22 2c 0a 20  readdb_count",. 
2d0a0 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
2d0b0 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64  ite3_pager_readd
2d0c0 62 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  b_count, TCL_LIN
2d0d0 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
2d0e0 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
2d0f0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
2d100 74 65 64 62 5f 63 6f 75 6e 74 22 2c 0a 20 20 20  tedb_count",.   
2d110 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
2d120 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
2d130 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b  _count, TCL_LINK
2d140 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e  _INT);.  Tcl_Lin
2d150 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
2d160 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
2d170 65 6a 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20  ej_count",.     
2d180 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
2d190 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
2d1a0 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  unt, TCL_LINK_IN
2d1b0 54 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  T);.#ifndef SQLI
2d1c0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
2d1d0 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
2d1e0 72 70 2c 20 22 75 6e 61 6c 69 67 6e 65 64 5f 73  rp, "unaligned_s
2d1f0 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 22 2c 0a  tring_counter",.
2d200 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 75 6e        (char*)&un
2d210 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63  aligned_string_c
2d220 6f 75 6e 74 65 72 2c 20 54 43 4c 5f 4c 49 4e 4b  ounter, TCL_LINK
2d230 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 23 69  _INT);.#endif.#i
2d240 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2d250 54 5f 55 54 46 31 36 0a 20 20 54 63 6c 5f 4c 69  T_UTF16.  Tcl_Li
2d260 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
2d270 71 6c 69 74 65 5f 6c 61 73 74 5f 6e 65 65 64 65  qlite_last_neede
2d280 64 5f 63 6f 6c 6c 61 74 69 6f 6e 22 2c 0a 20 20  d_collation",.  
2d290 20 20 20 20 28 63 68 61 72 2a 29 26 70 7a 4e 65      (char*)&pzNe
2d2a0 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 2c 20 54  ededCollation, T
2d2b0 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 7c 54  CL_LINK_STRING|T
2d2c0 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c  CL_LINK_READ_ONL
2d2d0 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  Y);.#endif.#if S
2d2e0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 20 20 54  QLITE_OS_WIN.  T
2d2f0 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
2d300 70 2c 20 22 73 71 6c 69 74 65 5f 6f 73 5f 74 79  p, "sqlite_os_ty
2d310 70 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  pe",.      (char
2d320 2a 29 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79  *)&sqlite3_os_ty
2d330 70 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  pe, TCL_LINK_INT
2d340 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  );.#endif.#ifdef
2d350 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 54   SQLITE_TEST.  T
2d360 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
2d370 70 2c 20 22 73 71 6c 69 74 65 5f 71 75 65 72 79  p, "sqlite_query
2d380 5f 70 6c 61 6e 22 2c 0a 20 20 20 20 20 20 28 63  _plan",.      (c
2d390 68 61 72 2a 29 26 71 75 65 72 79 5f 70 6c 61 6e  har*)&query_plan
2d3a0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e  , TCL_LINK_STRIN
2d3b0 47 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f  G|TCL_LINK_READ_
2d3c0 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69  ONLY);.#endif.#i
2d3d0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2d3e0 47 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  G.  Tcl_LinkVar(
2d3f0 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
2d400 61 64 64 6f 70 5f 74 72 61 63 65 22 2c 0a 20 20  addop_trace",.  
2d410 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
2d420 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61 63  te3VdbeAddopTrac
2d430 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  e, TCL_LINK_INT)
2d440 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
2d450 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
2d460 77 68 65 72 65 5f 74 72 61 63 65 22 2c 0a 20 20  where_trace",.  
2d470 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
2d480 74 65 33 57 68 65 72 65 54 72 61 63 65 2c 20 54  te3WhereTrace, T
2d490 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
2d4a0 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
2d4b0 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 73 5f 74  rp, "sqlite_os_t
2d4c0 72 61 63 65 22 2c 0a 20 20 20 20 20 20 28 63 68  race",.      (ch
2d4d0 61 72 2a 29 26 73 71 6c 69 74 65 33 4f 53 54 72  ar*)&sqlite3OSTr
2d4e0 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  ace, TCL_LINK_IN
2d4f0 54 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  T);.#ifndef SQLI
2d500 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 54 63  TE_OMIT_WAL.  Tc
2d510 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
2d520 2c 20 22 73 71 6c 69 74 65 5f 77 61 6c 5f 74 72  , "sqlite_wal_tr
2d530 61 63 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61  ace",.      (cha
2d540 72 2a 29 26 73 71 6c 69 74 65 33 57 61 6c 54 72  r*)&sqlite3WalTr
2d550 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  ace, TCL_LINK_IN
2d560 54 29 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69  T);.#endif.#endi
2d570 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
2d580 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 54  _OMIT_DISKIO.  T
2d590 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
2d5a0 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 65 6e 74  p, "sqlite_opent
2d5b0 65 6d 70 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20  emp_count",.    
2d5c0 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
2d5d0 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
2d5e0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
2d5f0 0a 23 65 6e 64 69 66 0a 20 20 54 63 6c 5f 4c 69  .#endif.  Tcl_Li
2d600 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
2d610 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e  qlite_static_bin
2d620 64 5f 76 61 6c 75 65 22 2c 0a 20 20 20 20 20 20  d_value",.      
2d630 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 5f 73  (char*)&sqlite_s
2d640 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65  tatic_bind_value
2d650 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e  , TCL_LINK_STRIN
2d660 47 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  G);.  Tcl_LinkVa
2d670 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
2d680 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62  e_static_bind_nb
2d690 79 74 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61  yte",.      (cha
2d6a0 72 2a 29 26 73 71 6c 69 74 65 5f 73 74 61 74 69  r*)&sqlite_stati
2d6b0 63 5f 62 69 6e 64 5f 6e 62 79 74 65 2c 20 54 43  c_bind_nbyte, TC
2d6c0 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54  L_LINK_INT);.  T
2d6d0 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
2d6e0 70 2c 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f  p, "sqlite_temp_
2d6f0 64 69 72 65 63 74 6f 72 79 22 2c 0a 20 20 20 20  directory",.    
2d700 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
2d710 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
2d720 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e  , TCL_LINK_STRIN
2d730 47 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  G);.  Tcl_LinkVa
2d740 72 28 69 6e 74 65 72 70 2c 20 22 62 69 74 6d 61  r(interp, "bitma
2d750 73 6b 5f 73 69 7a 65 22 2c 0a 20 20 20 20 20 20  sk_size",.      
2d760 28 63 68 61 72 2a 29 26 62 69 74 6d 61 73 6b 5f  (char*)&bitmask_
2d770 73 69 7a 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  size, TCL_LINK_I
2d780 4e 54 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44  NT|TCL_LINK_READ
2d790 5f 4f 4e 4c 59 29 3b 0a 20 20 54 63 6c 5f 4c 69  _ONLY);.  Tcl_Li
2d7a0 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
2d7b0 71 6c 69 74 65 5f 73 79 6e 63 5f 63 6f 75 6e 74  qlite_sync_count
2d7c0 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
2d7d0 26 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f  &sqlite3_sync_co
2d7e0 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  unt, TCL_LINK_IN
2d7f0 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  T);.  Tcl_LinkVa
2d800 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
2d810 65 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  e_fullsync_count
2d820 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
2d830 26 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e  &sqlite3_fullsyn
2d840 63 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  c_count, TCL_LIN
2d850 4b 5f 49 4e 54 29 3b 0a 23 69 66 20 64 65 66 69  K_INT);.#if defi
2d860 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
2d870 45 5f 46 54 53 33 29 20 26 26 20 64 65 66 69 6e  E_FTS3) && defin
2d880 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
2d890 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
2d8a0 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 66 74  terp, "sqlite_ft
2d8b0 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65 6e 74  s3_enable_parent
2d8c0 68 65 73 65 73 22 2c 0a 20 20 20 20 20 20 28 63  heses",.      (c
2d8d0 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 66 74  har*)&sqlite3_ft
2d8e0 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65 6e 74  s3_enable_parent
2d8f0 68 65 73 65 73 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  heses, TCL_LINK_
2d900 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  INT);.#endif.  r
2d910 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.