/ Hex Artifact Content
Login

Artifact 4cbabeb8b2c487f67d724e2ea03841b69fa640c4:


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 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
52d0: 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
52e0: 20 2a 7a 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4b   *zKey;.  int nK
52f0: 65 79 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  ey;.  if( argc!=
5300: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
5310: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
5320: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
5330: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
5340: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
5350: 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30  " FILENAME\"", 0
5360: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
5370: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
5380: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
5390: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
53a0: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
53b0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4b 65 79  CL_ERROR;.  zKey
53c0: 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20 6e 4b   = argv[2];.  nK
53d0: 65 79 20 3d 20 73 74 72 6c 65 6e 28 7a 4b 65 79  ey = strlen(zKey
53e0: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
53f0: 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 73 71 6c  _HAS_CODEC.  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 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
5560: 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *db;.  const ch
5570: 61 72 20 2a 7a 4b 65 79 3b 0a 20 20 69 6e 74 20  ar *zKey;.  int 
5580: 6e 4b 65 79 3b 0a 20 20 69 66 28 20 61 72 67 63  nKey;.  if( argc
5590: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
55a0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
55b0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
55c0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
55d0: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
55e0: 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c    " FILENAME\"",
55f0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
5600: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
5610: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
5620: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
5630: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
5640: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4b   TCL_ERROR;.  zK
5650: 65 79 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20  ey = argv[2];.  
5660: 6e 4b 65 79 20 3d 20 73 74 72 6c 65 6e 28 7a 4b  nKey = strlen(zK
5670: 65 79 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ey);.#ifdef SQLI
5680: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 73  TE_HAS_CODEC.  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 20 20 69 6e 74 20 72 63 3b 0a 0a 20  mt;.  int rc;.. 
10f20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
10f30 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
10f40 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
10f50 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
10f60 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
10f70 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
10f80 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
10f90 20 30 29 2c 20 22 20 53 54 4d 54 22 2c 20 30 29   0), " STMT", 0)
10fa0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
10fb0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
10fc0 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
10fd0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
10fe0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
10ff0 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
11000 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11010 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d  rc = sqlite3_stm
11020 74 5f 72 65 61 64 6f 6e 6c 79 28 70 53 74 6d 74  t_readonly(pStmt
11030 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
11040 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
11050 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28  l_NewBooleanObj(
11060 28 28 56 64 62 65 20 2a 29 70 53 74 6d 74 29 2d  ((Vdbe *)pStmt)-
11070 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c  >usesStmtJournal
11080 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
11090 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55  _OK;.}.../*.** U
110a0 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 72  sage:  sqlite3_r
110b0 65 73 65 74 20 20 53 54 4d 54 20 0a 2a 2a 0a 2a  eset  STMT .**.*
110c0 2a 20 52 65 73 65 74 20 61 20 73 74 61 74 65 6d  * Reset a statem
110d0 65 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  ent handle..*/.s
110e0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 72  tatic int test_r
110f0 65 73 65 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  eset(.  void * c
11100 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
11110 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
11120 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
11130 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
11140 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
11150 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
11160 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
11170 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
11180 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
11190 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
111a0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
111b0 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
111c0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
111d0 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
111e0 22 20 3c 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20  " <STMT>", 0);. 
111f0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
11200 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
11210 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
11220 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
11230 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
11240 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
11250 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
11260 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
11270 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 70  (pStmt);.  if( p
11280 53 74 6d 74 20 26 26 20 73 71 6c 69 74 65 33 54  Stmt && sqlite3T
11290 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
112a0 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d  p, StmtToDb(pStm
112b0 74 29 2c 20 72 63 29 20 29 7b 0a 20 20 20 20 72  t), rc) ){.    r
112c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
112d0 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 52 65  .  }.  Tcl_SetRe
112e0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
112f0 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
11300 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43  (rc), TCL_STATIC
11310 29 3b 0a 2f 2a 0a 20 20 69 66 28 20 72 63 20 29  );./*.  if( rc )
11320 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
11330 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 2a 2f 0a 20  _ERROR;.  }.*/. 
11340 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
11350 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
11360 20 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64   sqlite3_expired
11370 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74   STMT .**.** Ret
11380 75 72 6e 20 54 52 55 45 20 69 66 20 61 20 72 65  urn TRUE if a re
11390 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74  compilation of t
113a0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
113b0 72 65 63 6f 6d 6d 65 6e 64 65 64 2e 0a 2a 2f 0a  recommended..*/.
113c0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
113d0 65 78 70 69 72 65 64 28 0a 20 20 76 6f 69 64 20  expired(.  void 
113e0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
113f0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
11400 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
11410 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
11420 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64   objv[].){.#ifnd
11430 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
11440 45 50 52 45 43 41 54 45 44 0a 20 20 73 71 6c 69  EPRECATED.  sqli
11450 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
11460 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
11470 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
11480 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
11490 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
114a0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
114b0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
114c0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
114d0 5d 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22  ], 0), " <STMT>"
114e0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
114f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
11500 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
11510 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
11520 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
11530 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
11540 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11550 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
11560 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
11570 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 73 71  NewBooleanObj(sq
11580 6c 69 74 65 33 5f 65 78 70 69 72 65 64 28 70 53  lite3_expired(pS
11590 74 6d 74 29 29 29 3b 0a 23 65 6e 64 69 66 0a 20  tmt)));.#endif. 
115a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
115b0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
115c0 20 73 71 6c 69 74 65 33 5f 74 72 61 6e 73 66 65   sqlite3_transfe
115d0 72 5f 62 69 6e 64 69 6e 67 73 20 46 52 4f 4d 53  r_bindings FROMS
115e0 54 4d 54 20 54 4f 53 54 4d 54 0a 2a 2a 0a 2a 2a  TMT TOSTMT.**.**
115f0 20 54 72 61 6e 73 66 65 72 20 61 6c 6c 20 62 69   Transfer all bi
11600 6e 64 69 6e 67 73 20 66 72 6f 6d 20 46 52 4f 4d  ndings from FROM
11610 53 54 4d 54 20 6f 76 65 72 20 74 6f 20 54 4f 53  STMT over to TOS
11620 54 4d 54 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  TMT.*/.static in
11630 74 20 74 65 73 74 5f 74 72 61 6e 73 66 65 72 5f  t test_transfer_
11640 62 69 6e 64 28 0a 20 20 76 6f 69 64 20 2a 20 63  bind(.  void * c
11650 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
11660 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
11670 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
11680 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
11690 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20  jv[].){.#ifndef 
116a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
116b0 45 43 41 54 45 44 0a 20 20 73 71 6c 69 74 65 33  ECATED.  sqlite3
116c0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 31 2c 20 2a  _stmt *pStmt1, *
116d0 70 53 74 6d 74 32 3b 0a 20 20 69 66 28 20 6f 62  pStmt2;.  if( ob
116e0 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
116f0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
11700 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
11710 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
11720 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
11730 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
11740 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
11750 46 52 4f 4d 2d 53 54 4d 54 20 54 4f 2d 53 54 4d  FROM-STMT TO-STM
11760 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  T", 0);.    retu
11770 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11780 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
11790 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
117a0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
117b0 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 31 29 29  v[1]), &pStmt1))
117c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
117d0 52 3b 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  R;.  if( getStmt
117e0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
117f0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
11800 6a 76 5b 32 5d 29 2c 20 26 70 53 74 6d 74 32 29  jv[2]), &pStmt2)
11810 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
11820 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  OR;.  Tcl_SetObj
11830 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a  Result(interp, .
11840 20 20 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f       Tcl_NewIntO
11850 62 6a 28 73 71 6c 69 74 65 33 5f 74 72 61 6e 73  bj(sqlite3_trans
11860 66 65 72 5f 62 69 6e 64 69 6e 67 73 28 70 53 74  fer_bindings(pSt
11870 6d 74 31 2c 70 53 74 6d 74 32 29 29 29 3b 0a 23  mt1,pStmt2)));.#
11880 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54  endif.  return T
11890 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
118a0 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
118b0 63 68 61 6e 67 65 73 20 44 42 0a 2a 2a 0a 2a 2a  changes DB.**.**
118c0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
118d0 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 6d 61  er of changes ma
118e0 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  de to the databa
118f0 73 65 20 62 79 20 74 68 65 20 6c 61 73 74 20 53  se by the last S
11900 51 4c 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e  QL.** execution.
11910 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
11920 65 73 74 5f 63 68 61 6e 67 65 73 28 0a 20 20 76  est_changes(.  v
11930 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
11940 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
11950 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
11960 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
11970 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
11980 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
11990 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
119a0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
119b0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
119c0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
119d0 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
119e0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
119f0 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20  bjv[0]), " DB", 
11a00 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
11a10 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
11a20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
11a30 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
11a40 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
11a50 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
11a60 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
11a70 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
11a80 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
11a90 62 6a 28 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  bj(sqlite3_chang
11aa0 65 73 28 64 62 29 29 29 3b 0a 20 20 72 65 74 75  es(db)));.  retu
11ab0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
11ac0 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
11ad0 22 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c  "static_bind_val
11ae0 75 65 22 20 74 68 61 74 20 76 61 72 69 61 62 6c  ue" that variabl
11af0 65 73 20 61 72 65 20 62 6f 75 6e 64 20 74 6f 20  es are bound to 
11b00 77 68 65 6e 0a 2a 2a 20 74 68 65 20 46 4c 41 47  when.** the FLAG
11b10 20 6f 70 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74   option of sqlit
11b20 65 33 5f 62 69 6e 64 20 69 73 20 22 73 74 61 74  e3_bind is "stat
11b30 69 63 22 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ic".*/.static ch
11b40 61 72 20 2a 73 71 6c 69 74 65 5f 73 74 61 74 69  ar *sqlite_stati
11b50 63 5f 62 69 6e 64 5f 76 61 6c 75 65 20 3d 20 30  c_bind_value = 0
11b60 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  ;.static int sql
11b70 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f  ite_static_bind_
11b80 6e 62 79 74 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  nbyte = 0;../*.*
11b90 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
11ba0 33 5f 62 69 6e 64 20 20 56 4d 20 20 49 44 58 20  3_bind  VM  IDX 
11bb0 20 56 41 4c 55 45 20 20 46 4c 41 47 53 0a 2a 2a   VALUE  FLAGS.**
11bc0 0a 2a 2a 20 53 65 74 73 20 74 68 65 20 76 61 6c  .** Sets the val
11bd0 75 65 20 6f 66 20 74 68 65 20 49 44 58 2d 74 68  ue of the IDX-th
11be0 20 6f 63 63 75 72 61 6e 63 65 20 6f 66 20 22 3f   occurance of "?
11bf0 22 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  " in the origina
11c00 6c 20 53 51 4c 0a 2a 2a 20 73 74 72 69 6e 67 2e  l SQL.** string.
11c10 20 20 56 41 4c 55 45 20 69 73 20 74 68 65 20 6e    VALUE is the n
11c20 65 77 20 76 61 6c 75 65 2e 20 20 49 66 20 46 4c  ew value.  If FL
11c30 41 47 53 3d 3d 22 6e 75 6c 6c 22 20 74 68 65 6e  AGS=="null" then
11c40 20 56 41 4c 55 45 20 69 73 0a 2a 2a 20 69 67 6e   VALUE is.** ign
11c50 6f 72 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c  ored and the val
11c60 75 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ue is set to NUL
11c70 4c 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d 22 73  L.  If FLAGS=="s
11c80 74 61 74 69 63 22 20 74 68 65 6e 0a 2a 2a 20 74  tatic" then.** t
11c90 68 65 20 76 61 6c 75 65 20 69 73 20 73 65 74 20  he value is set 
11ca0 74 6f 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  to the value of 
11cb0 61 20 73 74 61 74 69 63 20 76 61 72 69 61 62 6c  a static variabl
11cc0 65 20 6e 61 6d 65 64 0a 2a 2a 20 22 73 71 6c 69  e named.** "sqli
11cd0 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76  te_static_bind_v
11ce0 61 6c 75 65 22 2e 20 20 49 66 20 46 4c 41 47 53  alue".  If FLAGS
11cf0 3d 3d 22 6e 6f 72 6d 61 6c 22 20 74 68 65 6e 20  =="normal" then 
11d00 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 74 68 65  a copy.** of the
11d10 20 56 41 4c 55 45 20 69 73 20 6d 61 64 65 2e 20   VALUE is made. 
11d20 20 49 66 20 46 4c 41 47 53 3d 3d 22 62 6c 6f 62   If FLAGS=="blob
11d30 31 30 22 20 74 68 65 6e 20 61 20 56 41 4c 55 45  10" then a VALUE
11d40 20 69 73 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61   is ignored.** a
11d50 6e 20 61 20 31 30 2d 62 79 74 65 20 62 6c 6f 62  n a 10-byte blob
11d60 20 22 61 62 63 5c 30 30 30 78 79 7a 5c 30 30 30   "abc\000xyz\000
11d70 70 71 22 20 69 73 20 69 6e 73 65 72 74 65 64 2e  pq" is inserted.
11d80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
11d90 65 73 74 5f 62 69 6e 64 28 0a 20 20 76 6f 69 64  est_bind(.  void
11da0 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
11db0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
11dc0 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
11dd0 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
11de0 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
11df0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
11e00 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
11e10 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
11e20 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
11e30 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
11e40 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
11e50 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
11e60 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
11e70 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
11e80 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  rc;.  int idx;. 
11e90 20 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a   if( argc!=5 ){.
11ea0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
11eb0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
11ec0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
11ed0 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
11ee0 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 56 4d  0], .       " VM
11ef0 20 49 44 58 20 56 41 4c 55 45 20 28 6e 75 6c 6c   IDX VALUE (null
11f00 7c 73 74 61 74 69 63 7c 6e 6f 72 6d 61 6c 29 5c  |static|normal)\
11f10 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
11f20 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11f30 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
11f40 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
11f50 72 67 76 5b 31 5d 2c 20 26 70 53 74 6d 74 29 20  rgv[1], &pStmt) 
11f60 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
11f70 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
11f80 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67  tInt(interp, arg
11f90 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65  v[2], &idx) ) re
11fa0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11fb0 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67    if( strcmp(arg
11fc0 76 5b 34 5d 2c 22 6e 75 6c 6c 22 29 3d 3d 30 20  v[4],"null")==0 
11fd0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
11fe0 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53  te3_bind_null(pS
11ff0 74 6d 74 2c 20 69 64 78 29 3b 0a 20 20 7d 65 6c  tmt, idx);.  }el
12000 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72  se if( strcmp(ar
12010 67 76 5b 34 5d 2c 22 73 74 61 74 69 63 22 29 3d  gv[4],"static")=
12020 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
12030 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
12040 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 73 71 6c  (pStmt, idx, sql
12050 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f  ite_static_bind_
12060 76 61 6c 75 65 2c 20 2d 31 2c 20 30 29 3b 0a 20  value, -1, 0);. 
12070 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
12080 70 28 61 72 67 76 5b 34 5d 2c 22 73 74 61 74 69  p(argv[4],"stati
12090 63 2d 6e 62 79 74 65 73 22 29 3d 3d 30 20 29 7b  c-nbytes")==0 ){
120a0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
120b0 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d  3_bind_text(pStm
120c0 74 2c 20 69 64 78 2c 20 73 71 6c 69 74 65 5f 73  t, idx, sqlite_s
120d0 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65  tatic_bind_value
120e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
120f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12100 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 5f           sqlite_
12110 73 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74  static_bind_nbyt
12120 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69  e, 0);.  }else i
12130 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34  f( strcmp(argv[4
12140 5d 2c 22 6e 6f 72 6d 61 6c 22 29 3d 3d 30 20 29  ],"normal")==0 )
12150 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
12160 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74  e3_bind_text(pSt
12170 6d 74 2c 20 69 64 78 2c 20 61 72 67 76 5b 33 5d  mt, idx, argv[3]
12180 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41  , -1, SQLITE_TRA
12190 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65  NSIENT);.  }else
121a0 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
121b0 5b 34 5d 2c 22 62 6c 6f 62 31 30 22 29 3d 3d 30  [4],"blob10")==0
121c0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
121d0 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
121e0 53 74 6d 74 2c 20 69 64 78 2c 20 22 61 62 63 5c  Stmt, idx, "abc\
121f0 30 30 30 78 79 7a 5c 30 30 30 70 71 22 2c 20 31  000xyz\000pq", 1
12200 30 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  0, SQLITE_STATIC
12210 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
12220 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
12230 28 69 6e 74 65 72 70 2c 20 22 34 74 68 20 61 72  (interp, "4th ar
12240 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65  gument should be
12250 20 22 0a 20 20 20 20 20 20 20 20 22 5c 22 6e 75   ".        "\"nu
12260 6c 6c 5c 22 20 6f 72 20 5c 22 73 74 61 74 69 63  ll\" or \"static
12270 5c 22 20 6f 72 20 5c 22 6e 6f 72 6d 61 6c 5c 22  \" or \"normal\"
12280 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
12290 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
122a0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
122b0 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
122c0 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74  , StmtToDb(pStmt
122d0 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  ), rc) ) return 
122e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
122f0 20 72 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20   rc ){.    char 
12300 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 20 20 73 70  zBuf[50];.    sp
12310 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 28 25 64  rintf(zBuf, "(%d
12320 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54 63  ) ", rc);.    Tc
12330 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
12340 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c  nterp, zBuf, sql
12350 69 74 65 33 45 72 72 53 74 72 28 72 63 29 2c 20  ite3ErrStr(rc), 
12360 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
12370 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
12380 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
12390 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
123a0 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a  _OMIT_UTF16./*.*
123b0 2a 20 55 73 61 67 65 3a 20 61 64 64 5f 74 65 73  * Usage: add_tes
123c0 74 5f 63 6f 6c 6c 61 74 65 20 3c 64 62 20 70 74  t_collate <db pt
123d0 72 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36  r> <utf8> <utf16
123e0 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 0a 2a 2a  le> <utf16be>.**
123f0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
12400 6e 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73  n is used to tes
12410 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 73 65  t that SQLite se
12420 6c 65 63 74 73 20 74 68 65 20 63 6f 72 72 65 63  lects the correc
12430 74 20 63 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 73  t collation.** s
12440 65 71 75 65 6e 63 65 20 63 61 6c 6c 62 61 63 6b  equence callback
12450 20 77 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 76   when multiple v
12460 65 72 73 69 6f 6e 73 20 28 66 6f 72 20 64 69 66  ersions (for dif
12470 66 65 72 65 6e 74 20 74 65 78 74 20 65 6e 63 6f  ferent text enco
12480 64 69 6e 67 73 29 0a 2a 2a 20 61 72 65 20 61 76  dings).** are av
12490 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43  ailable..**.** C
124a0 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
124b0 69 6e 65 20 72 65 67 69 73 74 65 72 73 20 74 68  ine registers th
124c0 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
124d0 65 6e 63 65 20 22 74 65 73 74 5f 63 6f 6c 6c 61  ence "test_colla
124e0 74 65 22 0a 2a 2a 20 77 69 74 68 20 64 61 74 61  te".** with data
124f0 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 64 62 3e  base handle <db>
12500 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  . The second arg
12510 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 61 20  ument must be a 
12520 6c 69 73 74 20 6f 66 20 74 68 72 65 65 0a 2a 2a  list of three.**
12530 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73 2e   boolean values.
12540 20 49 66 20 74 68 65 20 66 69 72 73 74 20 69 73   If the first is
12550 20 74 72 75 65 2c 20 74 68 65 6e 20 61 20 76 65   true, then a ve
12560 72 73 69 6f 6e 20 6f 66 20 74 65 73 74 5f 63 6f  rsion of test_co
12570 6c 6c 61 74 65 20 69 73 0a 2a 2a 20 72 65 67 69  llate is.** regi
12580 73 74 65 72 65 64 20 66 6f 72 20 55 54 46 2d 38  stered for UTF-8
12590 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  , if the second 
125a0 69 73 20 74 72 75 65 2c 20 61 20 76 65 72 73 69  is true, a versi
125b0 6f 6e 20 69 73 20 72 65 67 69 73 74 65 72 65 64  on is registered
125c0 20 66 6f 72 0a 2a 2a 20 55 54 46 2d 31 36 6c 65   for.** UTF-16le
125d0 2c 20 69 66 20 74 68 65 20 74 68 69 72 64 20 69  , if the third i
125e0 73 20 74 72 75 65 2c 20 61 20 55 54 46 2d 31 36  s true, a UTF-16
125f0 62 65 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76  be version is av
12600 61 69 6c 61 62 6c 65 2e 0a 2a 2a 20 50 72 65 76  ailable..** Prev
12610 69 6f 75 73 20 76 65 72 73 69 6f 6e 73 20 6f 66  ious versions of
12620 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 61 72   test_collate ar
12630 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a  e deleted..**.**
12640 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   The collation s
12650 65 71 75 65 6e 63 65 20 74 65 73 74 5f 63 6f 6c  equence test_col
12660 6c 61 74 65 20 69 73 20 69 6d 70 6c 65 6d 65 6e  late is implemen
12670 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ted by calling t
12680 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  he.** following 
12690 54 43 4c 20 73 63 72 69 70 74 3a 0a 2a 2a 0a 2a  TCL script:.**.*
126a0 2a 20 20 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74  *   "test_collat
126b0 65 20 3c 65 6e 63 3e 20 3c 6c 68 73 3e 20 3c 72  e <enc> <lhs> <r
126c0 68 73 3e 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20 3c  hs>".**.** The <
126d0 6c 68 73 3e 20 61 6e 64 20 3c 72 68 73 3e 20 61  lhs> and <rhs> a
126e0 72 65 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65  re the two value
126f0 73 20 62 65 69 6e 67 20 63 6f 6d 70 61 72 65 64  s being compared
12700 2c 20 65 6e 63 6f 64 65 64 20 69 6e 20 55 54 46  , encoded in UTF
12710 2d 38 2e 0a 2a 2a 20 54 68 65 20 3c 65 6e 63 3e  -8..** The <enc>
12720 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
12730 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68  e encoding of th
12740 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  e collation func
12750 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 53 51 4c  tion that.** SQL
12760 69 74 65 20 73 65 6c 65 63 74 65 64 20 74 6f 20  ite selected to 
12770 63 61 6c 6c 2e 20 54 68 65 20 54 43 4c 20 74 65  call. The TCL te
12780 73 74 20 73 63 72 69 70 74 20 69 6d 70 6c 65 6d  st script implem
12790 65 6e 74 73 20 74 68 65 0a 2a 2a 20 22 74 65 73  ents the.** "tes
127a0 74 5f 63 6f 6c 6c 61 74 65 22 20 70 72 6f 63 2e  t_collate" proc.
127b0 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
127c0 20 74 68 69 73 20 77 69 6c 6c 20 6f 6e 6c 79 20   this will only 
127d0 77 6f 72 6b 20 77 69 74 68 20 6f 6e 65 20 69 6e  work with one in
127e0 74 65 70 72 65 74 65 72 20 61 74 20 61 20 74 69  tepreter at a ti
127f0 6d 65 2c 20 61 73 20 74 68 65 0a 2a 2a 20 69 6e  me, as the.** in
12800 74 65 72 70 20 70 6f 69 6e 74 65 72 20 74 6f 20  terp pointer to 
12810 75 73 65 20 77 68 65 6e 20 65 76 61 6c 75 61 74  use when evaluat
12820 69 6e 67 20 74 68 65 20 54 43 4c 20 73 63 72 69  ing the TCL scri
12830 70 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 0a  pt is stored in.
12840 2a 2a 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49  ** pTestCollateI
12850 6e 74 65 72 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  nterp..*/.static
12860 20 54 63 6c 5f 49 6e 74 65 72 70 2a 20 70 54 65   Tcl_Interp* pTe
12870 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 3b  stCollateInterp;
12880 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
12890 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 28 0a 20  _collate_func(. 
128a0 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20 20   void *pCtx, .  
128b0 69 6e 74 20 6e 41 2c 20 63 6f 6e 73 74 20 76 6f  int nA, const vo
128c0 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42  id *zA,.  int nB
128d0 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42  , const void *zB
128e0 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  .){.  Tcl_Interp
128f0 20 2a 69 20 3d 20 70 54 65 73 74 43 6f 6c 6c 61   *i = pTestColla
12900 74 65 49 6e 74 65 72 70 3b 0a 20 20 69 6e 74 20  teInterp;.  int 
12910 65 6e 63 69 6e 20 3d 20 53 51 4c 49 54 45 5f 50  encin = SQLITE_P
12920 54 52 5f 54 4f 5f 49 4e 54 28 70 43 74 78 29 3b  TR_TO_INT(pCtx);
12930 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 69 6e  .  int res;.  in
12940 74 20 6e 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  t n;..  sqlite3_
12950 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 54  value *pVal;.  T
12960 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 0a 20 20 70  cl_Obj *pX;..  p
12970 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  X = Tcl_NewStrin
12980 67 4f 62 6a 28 22 74 65 73 74 5f 63 6f 6c 6c 61  gObj("test_colla
12990 74 65 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f  te", -1);.  Tcl_
129a0 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29  IncrRefCount(pX)
129b0 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 65 6e 63  ;..  switch( enc
129c0 69 6e 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  in ){.    case S
129d0 51 4c 49 54 45 5f 55 54 46 38 3a 0a 20 20 20 20  QLITE_UTF8:.    
129e0 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
129f0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c  endElement(i,pX,
12a00 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
12a10 28 22 55 54 46 2d 38 22 2c 2d 31 29 29 3b 0a 20  ("UTF-8",-1));. 
12a20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
12a30 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46 31  case SQLITE_UTF1
12a40 36 4c 45 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c  6LE:.      Tcl_L
12a50 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
12a60 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77  ent(i,pX,Tcl_New
12a70 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31  StringObj("UTF-1
12a80 36 4c 45 22 2c 2d 31 29 29 3b 0a 20 20 20 20 20  6LE",-1));.     
12a90 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
12aa0 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3a   SQLITE_UTF16BE:
12ab0 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  .      Tcl_ListO
12ac0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
12ad0 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69  i,pX,Tcl_NewStri
12ae0 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 42 45 22  ngObj("UTF-16BE"
12af0 2c 2d 31 29 29 3b 0a 20 20 20 20 20 20 62 72 65  ,-1));.      bre
12b00 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
12b10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29  .      assert(0)
12b20 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
12b30 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
12b40 63 28 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71  c();.  pVal = sq
12b50 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29  lite3ValueNew(0)
12b60 3b 0a 20 20 69 66 28 20 70 56 61 6c 20 29 7b 0a  ;.  if( pVal ){.
12b70 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
12b80 53 65 74 53 74 72 28 70 56 61 6c 2c 20 6e 41 2c  SetStr(pVal, nA,
12b90 20 7a 41 2c 20 65 6e 63 69 6e 2c 20 53 51 4c 49   zA, encin, SQLI
12ba0 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
12bb0 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
12bc0 65 5f 62 79 74 65 73 28 70 56 61 6c 29 3b 0a 20  e_bytes(pVal);. 
12bd0 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
12be0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58  pendElement(i,pX
12bf0 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4e 65  ,.        Tcl_Ne
12c00 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72  wStringObj((char
12c10 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
12c20 74 65 78 74 28 70 56 61 6c 29 2c 6e 29 29 3b 0a  text(pVal),n));.
12c30 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
12c40 53 65 74 53 74 72 28 70 56 61 6c 2c 20 6e 42 2c  SetStr(pVal, nB,
12c50 20 7a 42 2c 20 65 6e 63 69 6e 2c 20 53 51 4c 49   zB, encin, SQLI
12c60 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
12c70 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
12c80 65 5f 62 79 74 65 73 28 70 56 61 6c 29 3b 0a 20  e_bytes(pVal);. 
12c90 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
12ca0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58  pendElement(i,pX
12cb0 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4e 65  ,.        Tcl_Ne
12cc0 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72  wStringObj((char
12cd0 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
12ce0 74 65 78 74 28 70 56 61 6c 29 2c 6e 29 29 3b 0a  text(pVal),n));.
12cf0 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
12d00 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 7d 0a  Free(pVal);.  }.
12d10 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
12d20 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 54  gnMalloc();..  T
12d30 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 2c 20  cl_EvalObjEx(i, 
12d40 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65  pX, 0);.  Tcl_De
12d50 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a  crRefCount(pX);.
12d60 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d    Tcl_GetIntFrom
12d70 4f 62 6a 28 69 2c 20 54 63 6c 5f 47 65 74 4f 62  Obj(i, Tcl_GetOb
12d80 6a 52 65 73 75 6c 74 28 69 29 2c 20 26 72 65 73  jResult(i), &res
12d90 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  );.  return res;
12da0 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  .}.static int te
12db0 73 74 5f 63 6f 6c 6c 61 74 65 28 0a 20 20 76 6f  st_collate(.  vo
12dc0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
12dd0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
12de0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
12df0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
12e00 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
12e10 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
12e20 6e 74 20 76 61 6c 3b 0a 20 20 73 71 6c 69 74 65  nt val;.  sqlite
12e30 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20  3_value *pVal;. 
12e40 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
12e50 6f 62 6a 63 21 3d 35 20 29 20 67 6f 74 6f 20 62  objc!=5 ) goto b
12e60 61 64 5f 61 72 67 73 3b 0a 20 20 70 54 65 73 74  ad_args;.  pTest
12e70 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 20 3d 20  CollateInterp = 
12e80 69 6e 74 65 72 70 3b 0a 20 20 69 66 28 20 67 65  interp;.  if( ge
12e90 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
12ea0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
12eb0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
12ec0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
12ed0 4f 52 3b 0a 0a 20 20 69 66 28 20 54 43 4c 5f 4f  OR;..  if( TCL_O
12ee0 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  K!=Tcl_GetBoolea
12ef0 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
12f00 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61 6c 29 20   objv[2], &val) 
12f10 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
12f20 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
12f30 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
12f40 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 63 6f  ion(db, "test_co
12f50 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 55  llate", SQLITE_U
12f60 54 46 38 2c 20 0a 20 20 20 20 20 20 20 20 20 20  TF8, .          
12f70 28 76 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f 55  (void *)SQLITE_U
12f80 54 46 38 2c 20 76 61 6c 3f 74 65 73 74 5f 63 6f  TF8, val?test_co
12f90 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b 0a 20  llate_func:0);. 
12fa0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
12fb0 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  OK ){.    const 
12fc0 76 6f 69 64 20 2a 7a 55 74 66 31 36 3b 0a 20 20  void *zUtf16;.  
12fd0 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
12fe0 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
12ff0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
13000 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74  [3], &val) ) ret
13010 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
13020 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
13030 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
13040 28 64 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61  (db, "test_colla
13050 74 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  te", SQLITE_UTF1
13060 36 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  6LE, .          
13070 20 20 28 76 6f 69 64 20 2a 29 53 51 4c 49 54 45    (void *)SQLITE
13080 5f 55 54 46 31 36 4c 45 2c 20 76 61 6c 3f 74 65  _UTF16LE, val?te
13090 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a  st_collate_func:
130a0 30 29 3b 0a 20 20 20 20 69 66 28 20 54 43 4c 5f  0);.    if( TCL_
130b0 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  OK!=Tcl_GetBoole
130c0 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
130d0 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 76 61 6c 29  , objv[4], &val)
130e0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
130f0 52 4f 52 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20  ROR;..#if 0.    
13100 69 66 28 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c  if( sqlite3_iMal
13110 6c 6f 63 46 61 69 6c 3e 30 20 29 7b 0a 20 20 20  locFail>0 ){.   
13120 20 20 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c     sqlite3_iMall
13130 6f 63 46 61 69 6c 2b 2b 3b 0a 20 20 20 20 7d 0a  ocFail++;.    }.
13140 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
13150 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
13160 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 70  b->mutex);.    p
13170 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Val = sqlite3Val
13180 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20 20 73  ueNew(db);.    s
13190 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
131a0 72 28 70 56 61 6c 2c 20 2d 31 2c 20 22 74 65 73  r(pVal, -1, "tes
131b0 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49  t_collate", SQLI
131c0 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
131d0 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7a 55 74  STATIC);.    zUt
131e0 66 31 36 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  f16 = sqlite3Val
131f0 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c  ueText(pVal, SQL
13200 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29  ITE_UTF16NATIVE)
13210 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
13220 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
13230 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
13240 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
13250 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
13260 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
13270 61 74 69 6f 6e 31 36 28 64 62 2c 20 7a 55 74 66  ation16(db, zUtf
13280 31 36 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  16, SQLITE_UTF16
13290 42 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28  BE, .          (
132a0 76 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f 55 54  void *)SQLITE_UT
132b0 46 31 36 42 45 2c 20 76 61 6c 3f 74 65 73 74 5f  F16BE, val?test_
132c0 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b  collate_func:0);
132d0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
132e0 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c  e3ValueFree(pVal
132f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
13300 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
13310 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28  utex);.  }.  if(
13320 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
13330 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20  ode(interp, db, 
13340 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
13350 5f 45 52 52 4f 52 3b 0a 20 20 0a 20 20 69 66 28  _ERROR;.  .  if(
13360 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13370 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
13380 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73  Result(interp, s
13390 71 6c 69 74 65 33 54 65 73 74 45 72 72 6f 72 4e  qlite3TestErrorN
133a0 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20  ame(rc), 0);.   
133b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
133c0 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
133d0 54 43 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67  TCL_OK;..bad_arg
133e0 73 3a 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  s:.  Tcl_AppendR
133f0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
13400 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
13410 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
13420 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
13430 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
13440 30 29 2c 20 22 20 3c 44 42 3e 20 3c 75 74 66 38  0), " <DB> <utf8
13450 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66  > <utf16le> <utf
13460 31 36 62 65 3e 22 2c 20 30 29 3b 0a 20 20 72 65  16be>", 0);.  re
13470 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13480 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  }../*.** When th
13490 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64  e collation need
134a0 65 64 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69  ed callback is i
134b0 6e 76 6f 6b 65 64 2c 20 72 65 63 6f 72 64 20 74  nvoked, record t
134c0 68 65 20 6e 61 6d 65 20 6f 66 20 0a 2a 2a 20 74  he name of .** t
134d0 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
134e0 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  lating function 
134f0 68 65 72 65 2e 20 20 54 68 65 20 72 65 63 6f 72  here.  The recor
13500 64 65 64 20 6e 61 6d 65 20 69 73 20 6c 69 6e 6b  ded name is link
13510 65 64 0a 2a 2a 20 74 6f 20 61 20 54 43 4c 20 76  ed.** to a TCL v
13520 61 72 69 61 62 6c 65 20 61 6e 64 20 75 73 65 64  ariable and used
13530 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
13540 61 74 20 74 68 65 20 72 65 71 75 65 73 74 65 64  at the requested
13550 20 63 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 6e 61   collation.** na
13560 6d 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a  me is correct..*
13570 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a 4e  /.static char zN
13580 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 32  eededCollation[2
13590 30 30 5d 3b 0a 73 74 61 74 69 63 20 63 68 61 72  00];.static char
135a0 20 2a 70 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74   *pzNeededCollat
135b0 69 6f 6e 20 3d 20 7a 4e 65 65 64 65 64 43 6f 6c  ion = zNeededCol
135c0 6c 61 74 69 6f 6e 3b 0a 0a 0a 2f 2a 0a 2a 2a 20  lation;.../*.** 
135d0 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f  Called when a co
135e0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
135f0 20 69 73 20 6e 65 65 64 65 64 2e 20 20 52 65 67   is needed.  Reg
13600 69 73 74 65 72 65 64 20 75 73 69 6e 67 0a 2a 2a  istered using.**
13610 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69   sqlite3_collati
13620 6f 6e 5f 6e 65 65 64 65 64 31 36 28 29 2e 0a 2a  on_needed16()..*
13630 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  /.static void te
13640 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65  st_collate_neede
13650 64 5f 63 62 28 0a 20 20 76 6f 69 64 20 2a 70 43  d_cb(.  void *pC
13660 74 78 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a  tx, .  sqlite3 *
13670 64 62 2c 0a 20 20 69 6e 74 20 65 54 65 78 74 52  db,.  int eTextR
13680 65 70 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  ep,.  const void
13690 20 2a 70 4e 61 6d 65 0a 29 7b 0a 20 20 69 6e 74   *pName.){.  int
136a0 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a   enc = ENC(db);.
136b0 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
136c0 2a 7a 3b 0a 20 20 66 6f 72 28 7a 20 3d 20 28 63  *z;.  for(z = (c
136d0 68 61 72 2a 29 70 4e 61 6d 65 2c 20 69 3d 30 3b  har*)pName, i=0;
136e0 20 2a 7a 20 7c 7c 20 7a 5b 31 5d 3b 20 7a 2b 2b   *z || z[1]; z++
136f0 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 20 29 20  ){.    if( *z ) 
13700 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e  zNeededCollation
13710 5b 69 2b 2b 5d 20 3d 20 2a 7a 3b 0a 20 20 7d 0a  [i++] = *z;.  }.
13720 20 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69    zNeededCollati
13730 6f 6e 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c  on[i] = 0;.  sql
13740 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
13750 61 74 69 6f 6e 28 0a 20 20 20 20 20 20 64 62 2c  ation(.      db,
13760 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c   "test_collate",
13770 20 45 4e 43 28 64 62 29 2c 20 53 51 4c 49 54 45   ENC(db), SQLITE
13780 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 65 6e 63 29  _INT_TO_PTR(enc)
13790 2c 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66  , test_collate_f
137a0 75 6e 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  unc);.}../*.** U
137b0 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 63  sage: add_test_c
137c0 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 20 44 42  ollate_needed DB
137d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
137e0 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64  est_collate_need
137f0 65 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ed(.  void * cli
13800 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
13810 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
13820 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
13830 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
13840 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
13850 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  *db;.  int rc;..
13860 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 20    if( objc!=2 ) 
13870 67 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20  goto bad_args;. 
13880 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
13890 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
138a0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
138b0 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
138c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
138d0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74  = sqlite3_collat
138e0 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 64 62 2c  ion_needed16(db,
138f0 20 30 2c 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65   0, test_collate
13900 5f 6e 65 65 64 65 64 5f 63 62 29 3b 0a 20 20 7a  _needed_cb);.  z
13910 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b  NeededCollation[
13920 30 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71  0] = 0;.  if( sq
13930 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
13940 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
13950 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
13960 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ROR;.  return TC
13970 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67 73 3a  L_OK;..bad_args:
13980 0a 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  .  Tcl_WrongNumA
13990 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
139a0 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 72 65  bjv, "DB");.  re
139b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
139c0 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
139d0 20 20 20 61 64 64 5f 61 6c 69 67 6e 6d 65 6e 74     add_alignment
139e0 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73  _test_collations
139f0 20 20 44 42 0a 2a 2a 0a 2a 2a 20 41 64 64 20 74    DB.**.** Add t
13a00 77 6f 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67  wo new collating
13a10 20 73 65 71 75 65 6e 63 65 73 20 74 6f 20 74 68   sequences to th
13a20 65 20 64 61 74 61 62 61 73 65 20 44 42 0a 2a 2a  e database DB.**
13a30 0a 2a 2a 20 20 20 20 20 75 74 66 31 36 5f 61 6c  .**     utf16_al
13a40 69 67 6e 65 64 0a 2a 2a 20 20 20 20 20 75 74 66  igned.**     utf
13a50 31 36 5f 75 6e 61 6c 69 67 6e 65 64 0a 2a 2a 0a  16_unaligned.**.
13a60 2a 2a 20 42 6f 74 68 20 63 6f 6c 6c 61 74 69 6e  ** Both collatin
13a70 67 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 20  g sequences use 
13a80 74 68 65 20 73 61 6d 65 20 73 6f 72 74 20 6f 72  the same sort or
13a90 64 65 72 20 61 73 20 42 49 4e 41 52 59 2e 0a 2a  der as BINARY..*
13aa0 2a 20 54 68 65 20 6f 6e 6c 79 20 64 69 66 66 65  * The only diffe
13ab0 72 65 6e 63 65 20 69 73 20 74 68 61 74 20 74 68  rence is that th
13ac0 65 20 75 74 66 31 36 5f 61 6c 69 67 6e 65 64 20  e utf16_aligned 
13ad0 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
13ae0 75 65 6e 63 65 20 69 73 20 64 65 63 6c 61 72 65  uence is declare
13af0 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  d with the SQLIT
13b00 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20  E_UTF16_ALIGNED 
13b10 66 6c 61 67 2e 0a 2a 2a 20 42 6f 74 68 20 63 6f  flag..** Both co
13b20 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
13b30 73 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  s increment the 
13b40 75 6e 61 6c 69 67 6e 65 64 20 75 74 66 31 36 20  unaligned utf16 
13b50 63 6f 75 6e 74 65 72 0a 2a 2a 20 77 68 65 6e 65  counter.** whene
13b60 76 65 72 20 74 68 65 79 20 73 65 65 20 61 20 73  ver they see a s
13b70 74 72 69 6e 67 20 74 68 61 74 20 62 65 67 69 6e  tring that begin
13b80 73 20 6f 6e 20 61 6e 20 6f 64 64 20 62 79 74 65  s on an odd byte
13b90 20 62 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a 73 74   boundary..*/.st
13ba0 61 74 69 63 20 69 6e 74 20 75 6e 61 6c 69 67 6e  atic int unalign
13bb0 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65  ed_string_counte
13bc0 72 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e  r = 0;.static in
13bd0 74 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c 46  t alignmentCollF
13be0 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  unc(.  void *Not
13bf0 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Used,.  int nKey
13c00 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
13c10 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Key1,.  int nKey
13c20 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  2, const void *p
13c30 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Key2.){.  int rc
13c40 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31  , n;.  n = nKey1
13c50 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a  <nKey2 ? nKey1 :
13c60 20 6e 4b 65 79 32 3b 0a 20 20 69 66 28 20 6e 4b   nKey2;.  if( nK
13c70 65 79 31 3e 30 20 26 26 20 31 3d 3d 28 31 26 28  ey1>0 && 1==(1&(
13c80 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
13c90 54 28 70 4b 65 79 31 29 29 29 20 29 20 75 6e 61  T(pKey1))) ) una
13ca0 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f  ligned_string_co
13cb0 75 6e 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 6e  unter++;.  if( n
13cc0 4b 65 79 32 3e 30 20 26 26 20 31 3d 3d 28 31 26  Key2>0 && 1==(1&
13cd0 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49  (SQLITE_PTR_TO_I
13ce0 4e 54 28 70 4b 65 79 32 29 29 29 20 29 20 75 6e  NT(pKey2))) ) un
13cf0 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63  aligned_string_c
13d00 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 72 63 20 3d  ounter++;.  rc =
13d10 20 6d 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20 70   memcmp(pKey1, p
13d20 4b 65 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20  Key2, n);.  if( 
13d30 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  rc==0 ){.    rc 
13d40 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b  = nKey1 - nKey2;
13d50 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
13d60 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61  ;.}.static int a
13d70 64 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73  dd_alignment_tes
13d80 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73 28 0a 20 20  t_collations(.  
13d90 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
13da0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
13db0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
13dc0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
13dd0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
13de0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
13df0 20 69 66 28 20 6f 62 6a 63 3e 3d 32 20 29 7b 0a   if( objc>=2 ){.
13e00 20 20 20 20 69 66 28 20 67 65 74 44 62 50 6f 69      if( getDbPoi
13e10 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
13e20 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
13e30 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
13e40 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
13e50 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
13e60 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  _collation(db, "
13e70 75 74 66 31 36 5f 75 6e 61 6c 69 67 6e 65 64 22  utf16_unaligned"
13e80 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 2c 20  , SQLITE_UTF16, 
13e90 0a 20 20 20 20 20 20 20 20 30 2c 20 61 6c 69 67  .        0, alig
13ea0 6e 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b 0a  nmentCollFunc);.
13eb0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
13ec0 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  te_collation(db,
13ed0 20 22 75 74 66 31 36 5f 61 6c 69 67 6e 65 64 22   "utf16_aligned"
13ee0 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41  , SQLITE_UTF16_A
13ef0 4c 49 47 4e 45 44 2c 20 0a 20 20 20 20 20 20 20  LIGNED, .       
13f00 20 30 2c 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c   0, alignmentCol
13f10 6c 46 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 72 65  lFunc);.  }.  re
13f20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13f30 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
13f40 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
13f50 5f 55 54 46 31 36 29 20 2a 2f 0a 0a 2f 2a 0a 2a  _UTF16) */../*.*
13f60 2a 20 55 73 61 67 65 3a 20 61 64 64 5f 74 65 73  * Usage: add_tes
13f70 74 5f 66 75 6e 63 74 69 6f 6e 20 3c 64 62 20 70  t_function <db p
13f80 74 72 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31  tr> <utf8> <utf1
13f90 36 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 0a 2a  6le> <utf16be>.*
13fa0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
13fb0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  on is used to te
13fc0 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 73  st that SQLite s
13fd0 65 6c 65 63 74 73 20 74 68 65 20 63 6f 72 72 65  elects the corre
13fe0 63 74 20 75 73 65 72 0a 2a 2a 20 66 75 6e 63 74  ct user.** funct
13ff0 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 77 68 65  ion callback whe
14000 6e 20 6d 75 6c 74 69 70 6c 65 20 76 65 72 73 69  n multiple versi
14010 6f 6e 73 20 28 66 6f 72 20 64 69 66 66 65 72 65  ons (for differe
14020 6e 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  nt text encoding
14030 73 29 0a 2a 2a 20 61 72 65 20 61 76 61 69 6c 61  s).** are availa
14040 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69  ble..**.** Calli
14050 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
14060 72 65 67 69 73 74 65 72 73 20 75 70 20 74 6f 20  registers up to 
14070 74 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f  three versions o
14080 66 20 74 68 65 20 75 73 65 72 20 66 75 6e 63 74  f the user funct
14090 69 6f 6e 0a 2a 2a 20 22 74 65 73 74 5f 66 75 6e  ion.** "test_fun
140a0 63 74 69 6f 6e 22 20 77 69 74 68 20 64 61 74 61  ction" with data
140b0 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 64 62 3e  base handle <db>
140c0 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  .  If the second
140d0 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a 20   argument is.** 
140e0 74 72 75 65 2c 20 74 68 65 6e 20 61 20 76 65 72  true, then a ver
140f0 73 69 6f 6e 20 6f 66 20 74 65 73 74 5f 66 75 6e  sion of test_fun
14100 63 74 69 6f 6e 20 69 73 20 72 65 67 69 73 74 65  ction is registe
14110 72 65 64 20 66 6f 72 20 55 54 46 2d 38 2c 20 69  red for UTF-8, i
14120 66 20 74 68 65 0a 2a 2a 20 74 68 69 72 64 20 69  f the.** third i
14130 73 20 74 72 75 65 2c 20 61 20 76 65 72 73 69 6f  s true, a versio
14140 6e 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20  n is registered 
14150 66 6f 72 20 55 54 46 2d 31 36 6c 65 2c 20 69 66  for UTF-16le, if
14160 20 74 68 65 20 66 6f 75 72 74 68 20 69 73 0a 2a   the fourth is.*
14170 2a 20 74 72 75 65 2c 20 61 20 55 54 46 2d 31 36  * true, a UTF-16
14180 62 65 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76  be version is av
14190 61 69 6c 61 62 6c 65 2e 20 20 50 72 65 76 69 6f  ailable.  Previo
141a0 75 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 0a 2a  us versions of.*
141b0 2a 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20  * test_function 
141c0 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a  are deleted..**.
141d0 2a 2a 20 54 68 65 20 75 73 65 72 20 66 75 6e 63  ** The user func
141e0 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  tion is implemen
141f0 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ted by calling t
14200 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c  he following TCL
14210 20 73 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20   script:.**.**  
14220 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20   "test_function 
14230 3c 65 6e 63 3e 20 3c 61 72 67 3e 22 0a 2a 2a 0a  <enc> <arg>".**.
14240 2a 2a 20 57 68 65 72 65 20 3c 65 6e 63 3e 20 69  ** Where <enc> i
14250 73 20 6f 6e 65 20 6f 66 20 55 54 46 2d 38 2c 20  s one of UTF-8, 
14260 55 54 46 2d 31 36 4c 45 20 6f 72 20 55 54 46 31  UTF-16LE or UTF1
14270 36 42 45 2c 20 61 6e 64 20 3c 61 72 67 3e 20 69  6BE, and <arg> i
14280 73 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20  s the.** single 
14290 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
142a0 74 6f 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74  to the SQL funct
142b0 69 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65 20 72  ion. The value r
142c0 65 74 75 72 6e 65 64 20 62 79 0a 2a 2a 20 74 68  eturned by.** th
142d0 65 20 54 43 4c 20 73 63 72 69 70 74 20 69 73 20  e TCL script is 
142e0 75 73 65 64 20 61 73 20 74 68 65 20 72 65 74 75  used as the retu
142f0 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  rn value of the 
14300 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74  SQL function. It
14310 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 74 6f  .** is passed to
14320 20 53 51 4c 69 74 65 20 75 73 69 6e 67 20 55 54   SQLite using UT
14330 46 2d 31 36 42 45 20 66 6f 72 20 61 20 55 54 46  F-16BE for a UTF
14340 2d 38 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  -8 test_function
14350 28 29 2c 20 55 54 46 2d 38 0a 2a 2a 20 66 6f 72  (), UTF-8.** for
14360 20 61 20 55 54 46 2d 31 36 4c 45 20 74 65 73 74   a UTF-16LE test
14370 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 64  _function(), and
14380 20 55 54 46 2d 31 36 4c 45 20 66 6f 72 20 61 6e   UTF-16LE for an
14390 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
143a0 74 68 61 74 0a 2a 2a 20 70 72 65 66 65 72 73 20  that.** prefers 
143b0 55 54 46 2d 31 36 42 45 2e 0a 2a 2f 0a 23 69 66  UTF-16BE..*/.#if
143c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
143d0 5f 55 54 46 31 36 0a 73 74 61 74 69 63 20 76 6f  _UTF16.static vo
143e0 69 64 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  id test_function
143f0 5f 75 74 66 38 28 0a 20 20 73 71 6c 69 74 65 33  _utf8(.  sqlite3
14400 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
14410 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73  .  int nArg,.  s
14420 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
14430 72 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74  rgv.){.  Tcl_Int
14440 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54  erp *interp;.  T
14450 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71  cl_Obj *pX;.  sq
14460 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
14470 6c 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 28 54  l;.  interp = (T
14480 63 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c 69  cl_Interp *)sqli
14490 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43  te3_user_data(pC
144a0 74 78 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f  tx);.  pX = Tcl_
144b0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65  NewStringObj("te
144c0 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31  st_function", -1
144d0 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
144e0 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c  Count(pX);.  Tcl
144f0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
14500 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58  ement(interp, pX
14510 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
14520 62 6a 28 22 55 54 46 2d 38 22 2c 20 2d 31 29 29  bj("UTF-8", -1))
14530 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
14540 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
14550 65 72 70 2c 20 70 58 2c 20 0a 20 20 20 20 20 20  erp, pX, .      
14560 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
14570 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  ((char*)sqlite3_
14580 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
14590 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  0]), -1));.  Tcl
145a0 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72  _EvalObjEx(inter
145b0 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c  p, pX, 0);.  Tcl
145c0 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58  _DecrRefCount(pX
145d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
145e0 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 54  ult_text(pCtx, T
145f0 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
14600 6c 74 28 69 6e 74 65 72 70 29 2c 20 2d 31 2c 20  lt(interp), -1, 
14610 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
14620 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69  );.  pVal = sqli
14630 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a  te3ValueNew(0);.
14640 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
14650 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54  tStr(pVal, -1, T
14660 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
14670 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a 20 20 20  lt(interp), .   
14680 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20     SQLITE_UTF8, 
14690 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
146a0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
146b0 5f 74 65 78 74 31 36 62 65 28 70 43 74 78 2c 20  _text16be(pCtx, 
146c0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
146d0 78 74 31 36 62 65 28 70 56 61 6c 29 2c 0a 20 20  xt16be(pVal),.  
146e0 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54      -1, SQLITE_T
146f0 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c  RANSIENT);.  sql
14700 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
14710 61 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  al);.}.static vo
14720 69 64 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  id test_function
14730 5f 75 74 66 31 36 6c 65 28 0a 20 20 73 71 6c 69  _utf16le(.  sqli
14740 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
14750 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  x, .  int nArg,.
14760 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
14770 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54 63 6c 5f  **argv.){.  Tcl_
14780 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a  Interp *interp;.
14790 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20    Tcl_Obj *pX;. 
147a0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
147b0 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72 70 20 3d  pVal;.  interp =
147c0 20 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 73   (Tcl_Interp *)s
147d0 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
147e0 28 70 43 74 78 29 3b 0a 20 20 70 58 20 3d 20 54  (pCtx);.  pX = T
147f0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
14800 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c  "test_function",
14810 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72   -1);.  Tcl_Incr
14820 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20  RefCount(pX);.  
14830 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
14840 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
14850 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69   pX, Tcl_NewStri
14860 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 4c 45 22  ngObj("UTF-16LE"
14870 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
14880 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
14890 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 0a  nt(interp, pX, .
148a0 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72        Tcl_NewStr
148b0 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71  ingObj((char*)sq
148c0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
148d0 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b  (argv[0]), -1));
148e0 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  .  Tcl_EvalObjEx
148f0 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 30 29 3b  (interp, pX, 0);
14900 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
14910 75 6e 74 28 70 58 29 3b 0a 20 20 70 56 61 6c 20  unt(pX);.  pVal 
14920 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
14930 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  w(0);.  sqlite3V
14940 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c  alueSetStr(pVal,
14950 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72 69   -1, Tcl_GetStri
14960 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  ngResult(interp)
14970 2c 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f  , .      SQLITE_
14980 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41  UTF8, SQLITE_STA
14990 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  TIC);.  sqlite3_
149a0 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78  result_text(pCtx
149b0 2c 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  ,(char*)sqlite3_
149c0 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29  value_text(pVal)
149d0 2c 2d 31 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53  ,-1,SQLITE_TRANS
149e0 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  IENT);.  sqlite3
149f0 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
14a00 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  .}.static void t
14a10 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66  est_function_utf
14a20 31 36 62 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  16be(.  sqlite3_
14a30 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
14a40 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
14a50 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
14a60 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  gv.){.  Tcl_Inte
14a70 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63  rp *interp;.  Tc
14a80 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c  l_Obj *pX;.  sql
14a90 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
14aa0 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 28 54 63  ;.  interp = (Tc
14ab0 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c 69 74  l_Interp *)sqlit
14ac0 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74  e3_user_data(pCt
14ad0 78 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e  x);.  pX = Tcl_N
14ae0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73  ewStringObj("tes
14af0 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29  t_function", -1)
14b00 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
14b10 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f  ount(pX);.  Tcl_
14b20 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
14b30 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c  ment(interp, pX,
14b40 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
14b50 6a 28 22 55 54 46 2d 31 36 42 45 22 2c 20 2d 31  j("UTF-16BE", -1
14b60 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
14b70 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
14b80 6e 74 65 72 70 2c 20 70 58 2c 20 0a 20 20 20 20  nterp, pX, .    
14b90 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
14ba0 62 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65  bj((char*)sqlite
14bb0 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
14bc0 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54  v[0]), -1));.  T
14bd0 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74  cl_EvalObjEx(int
14be0 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54  erp, pX, 0);.  T
14bf0 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
14c00 70 58 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71  pX);.  pVal = sq
14c10 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29  lite3ValueNew(0)
14c20 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
14c30 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c  SetStr(pVal, -1,
14c40 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
14c50 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a 20  sult(interp), . 
14c60 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38       SQLITE_UTF8
14c70 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
14c80 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
14c90 6c 74 5f 74 65 78 74 31 36 28 70 43 74 78 2c 20  lt_text16(pCtx, 
14ca0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
14cb0 78 74 31 36 6c 65 28 70 56 61 6c 29 2c 0a 20 20  xt16le(pVal),.  
14cc0 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54      -1, SQLITE_T
14cd0 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c  RANSIENT);.  sql
14ce0 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
14cf0 31 36 62 65 28 70 43 74 78 2c 20 73 71 6c 69 74  16be(pCtx, sqlit
14d00 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 6c  e3_value_text16l
14d10 65 28 70 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d  e(pVal),.      -
14d20 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
14d30 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ENT);.  sqlite3_
14d40 72 65 73 75 6c 74 5f 74 65 78 74 31 36 6c 65 28  result_text16le(
14d50 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61  pCtx, sqlite3_va
14d60 6c 75 65 5f 74 65 78 74 31 36 6c 65 28 70 56 61  lue_text16le(pVa
14d70 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53 51  l),.      -1, SQ
14d80 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
14d90 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
14da0 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 23 65 6e  ree(pVal);.}.#en
14db0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
14dc0 49 54 5f 55 54 46 31 36 20 2a 2f 0a 73 74 61 74  IT_UTF16 */.stat
14dd0 69 63 20 69 6e 74 20 74 65 73 74 5f 66 75 6e 63  ic int test_func
14de0 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63  tion(.  void * c
14df0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
14e00 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
14e10 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
14e20 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
14e30 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20  jv[].){.#ifndef 
14e40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
14e50 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  6.  sqlite3 *db;
14e60 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 0a 20 20 69  .  int val;..  i
14e70 66 28 20 6f 62 6a 63 21 3d 35 20 29 20 67 6f 74  f( objc!=5 ) got
14e80 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 69 66  o bad_args;.  if
14e90 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
14ea0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
14eb0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
14ec0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
14ed0 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20 54  _ERROR;..  if( T
14ee0 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f  CL_OK!=Tcl_GetBo
14ef0 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
14f00 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76  erp, objv[2], &v
14f10 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  al) ) return TCL
14f20 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 76 61  _ERROR;.  if( va
14f30 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
14f40 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
14f50 28 64 62 2c 20 22 74 65 73 74 5f 66 75 6e 63 74  (db, "test_funct
14f60 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  ion", 1, SQLITE_
14f70 55 54 46 38 2c 20 0a 20 20 20 20 20 20 20 20 69  UTF8, .        i
14f80 6e 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e 63  nterp, test_func
14f90 74 69 6f 6e 5f 75 74 66 38 2c 20 30 2c 20 30 29  tion_utf8, 0, 0)
14fa0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 43 4c 5f  ;.  }.  if( TCL_
14fb0 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  OK!=Tcl_GetBoole
14fc0 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
14fd0 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29  , objv[3], &val)
14fe0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
14ff0 52 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c 20 29  ROR;.  if( val )
15000 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  {.    sqlite3_cr
15010 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
15020 2c 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  , "test_function
15030 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
15040 31 36 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 69  16LE, .        i
15050 6e 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e 63  nterp, test_func
15060 74 69 6f 6e 5f 75 74 66 31 36 6c 65 2c 20 30 2c  tion_utf16le, 0,
15070 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54   0);.  }.  if( T
15080 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f  CL_OK!=Tcl_GetBo
15090 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
150a0 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 76  erp, objv[4], &v
150b0 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  al) ) return TCL
150c0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 76 61  _ERROR;.  if( va
150d0 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
150e0 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
150f0 28 64 62 2c 20 22 74 65 73 74 5f 66 75 6e 63 74  (db, "test_funct
15100 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  ion", 1, SQLITE_
15110 55 54 46 31 36 42 45 2c 20 0a 20 20 20 20 20 20  UTF16BE, .      
15120 20 20 69 6e 74 65 72 70 2c 20 74 65 73 74 5f 66    interp, test_f
15130 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 62 65 2c  unction_utf16be,
15140 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72   0, 0);.  }..  r
15150 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 62 61  eturn TCL_OK;.ba
15160 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 41 70  d_args:.  Tcl_Ap
15170 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
15180 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
15190 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
151a0 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74  .      Tcl_GetSt
151b0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
151c0 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 44 42 3e 20  [0], 0), " <DB> 
151d0 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e  <utf8> <utf16le>
151e0 20 3c 75 74 66 31 36 62 65 3e 22 2c 20 30 29 3b   <utf16be>", 0);
151f0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
15200 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
15210 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
15220 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OR;.}../*.** Usa
15230 67 65 3a 20 20 20 20 20 20 20 20 20 73 71 6c 69  ge:         sqli
15240 74 65 33 5f 74 65 73 74 5f 65 72 72 73 74 72 20  te3_test_errstr 
15250 3c 65 72 72 20 63 6f 64 65 3e 0a 2a 2a 0a 2a 2a  <err code>.**.**
15260 20 54 65 73 74 20 74 68 61 74 20 74 68 65 20 65   Test that the e
15270 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20  nglish language 
15280 73 74 72 69 6e 67 20 65 71 75 69 76 61 6c 65 6e  string equivalen
15290 74 73 20 66 6f 72 20 73 71 6c 69 74 65 20 65 72  ts for sqlite er
152a0 72 6f 72 20 63 6f 64 65 73 0a 2a 2a 20 61 72 65  ror codes.** are
152b0 20 73 61 6e 65 2e 20 54 68 65 20 70 61 72 61 6d   sane. The param
152c0 65 74 65 72 20 69 73 20 61 6e 20 69 6e 74 65 67  eter is an integ
152d0 65 72 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  er representing 
152e0 61 6e 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20  an sqlite error 
152f0 63 6f 64 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73  code..** The res
15300 75 6c 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ult is a list of
15310 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 2c 20 74   two elements, t
15320 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  he string repres
15330 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  entation of the.
15340 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  ** error code an
15350 64 20 74 68 65 20 65 6e 67 6c 69 73 68 20 6c 61  d the english la
15360 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69  nguage explanati
15370 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
15380 74 20 74 65 73 74 5f 65 72 72 73 74 72 28 0a 20  t test_errstr(. 
15390 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
153a0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
153b0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
153c0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
153d0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
153e0 0a 20 20 63 68 61 72 20 2a 7a 43 6f 64 65 3b 0a  .  char *zCode;.
153f0 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 6f    int i;.  if( o
15400 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63  bjc!=1 ){.    Tc
15410 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
15420 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
15430 22 3c 65 72 72 6f 72 20 63 6f 64 65 3e 22 29 3b  "<error code>");
15440 0a 20 20 7d 0a 0a 20 20 7a 43 6f 64 65 20 3d 20  .  }..  zCode = 
15450 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
15460 6a 76 5b 31 5d 29 3b 0a 20 20 66 6f 72 28 69 3d  jv[1]);.  for(i=
15470 30 3b 20 69 3c 32 30 30 3b 20 69 2b 2b 29 7b 0a  0; i<200; i++){.
15480 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
15490 70 28 74 31 45 72 72 6f 72 4e 61 6d 65 28 69 29  p(t1ErrorName(i)
154a0 2c 20 7a 43 6f 64 65 29 20 29 20 62 72 65 61 6b  , zCode) ) break
154b0 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 52  ;.  }.  Tcl_SetR
154c0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
154d0 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72 72  har *)sqlite3Err
154e0 53 74 72 28 69 29 2c 20 30 29 3b 0a 20 20 72 65  Str(i), 0);.  re
154f0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
15500 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 20  /*.** Usage:    
15510 62 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a  breakpoint.**.**
15520 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 78   This routine ex
15530 69 73 74 73 20 66 6f 72 20 6f 6e 65 20 70 75 72  ists for one pur
15540 70 6f 73 65 20 2d 20 74 6f 20 70 72 6f 76 69 64  pose - to provid
15550 65 20 61 20 70 6c 61 63 65 20 74 6f 20 70 75 74  e a place to put
15560 20 61 0a 2a 2a 20 62 72 65 61 6b 70 6f 69 6e 74   a.** breakpoint
15570 20 77 69 74 68 20 47 44 42 20 74 68 61 74 20 63   with GDB that c
15580 61 6e 20 62 65 20 74 72 69 67 67 65 72 65 64 20  an be triggered 
15590 75 73 69 6e 67 20 54 43 4c 20 63 6f 64 65 2e 20  using TCL code. 
155a0 20 54 68 65 20 75 73 65 0a 2a 2a 20 66 6f 72 20   The use.** for 
155b0 74 68 69 73 20 69 73 20 77 68 65 6e 20 61 20 70  this is when a p
155c0 61 72 74 69 63 75 6c 61 72 20 74 65 73 74 20 66  articular test f
155d0 61 69 6c 73 20 6f 6e 20 28 73 61 79 29 20 74 68  ails on (say) th
155e0 65 20 31 34 38 35 74 68 20 69 74 65 72 61 74 69  e 1485th iterati
155f0 6f 6e 2e 0a 2a 2a 20 49 6e 20 74 68 65 20 54 43  on..** In the TC
15600 4c 20 74 65 73 74 20 73 63 72 69 70 74 2c 20 77  L test script, w
15610 65 20 63 61 6e 20 61 64 64 20 63 6f 64 65 20 6c  e can add code l
15620 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
15630 20 20 20 20 69 66 20 7b 24 69 3d 3d 31 34 38 35      if {$i==1485
15640 7d 20 62 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a  } breakpoint.**.
15650 2a 2a 20 54 68 65 6e 20 72 75 6e 20 74 65 73 74  ** Then run test
15660 66 69 78 74 75 72 65 20 69 6e 20 74 68 65 20 64  fixture in the d
15670 65 62 75 67 67 65 72 20 61 6e 64 20 77 61 69 74  ebugger and wait
15680 20 66 6f 72 20 74 68 65 20 62 72 65 61 6b 70 6f   for the breakpo
15690 69 6e 74 20 74 6f 0a 2a 2a 20 66 69 72 65 2e 20  int to.** fire. 
156a0 20 54 68 65 6e 20 61 64 64 69 74 69 6f 6e 61 6c   Then additional
156b0 20 62 72 65 61 6b 70 6f 69 6e 74 73 20 63 61 6e   breakpoints can
156c0 20 62 65 20 73 65 74 20 74 6f 20 74 72 61 63 65   be set to trace
156d0 20 64 6f 77 6e 20 74 68 65 20 62 75 67 2e 0a 2a   down the bug..*
156e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
156f0 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 0a 20 20  t_breakpoint(.  
15700 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
15710 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
15720 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
15730 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
15740 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
15750 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
15760 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
15770 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
15780 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
15790 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
157a0 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
157b0 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
157c0 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20   */.){.  return 
157d0 54 43 4c 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  TCL_OK;         
157e0 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
157f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
15800 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
15810 7a 65 72 6f 62 6c 6f 62 20 20 53 54 4d 54 20 49  zeroblob  STMT I
15820 44 58 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  DX N.**.** Test 
15830 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
15840 5f 7a 65 72 6f 62 6c 6f 62 20 69 6e 74 65 72 66  _zeroblob interf
15850 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20  ace.  STMT is a 
15860 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
15870 6e 74 2e 0a 2a 2a 20 49 44 58 20 69 73 20 74 68  nt..** IDX is th
15880 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c  e index of a wil
15890 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65  dcard in the pre
158a0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
158b0 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a    This command.*
158c0 2a 20 62 69 6e 64 73 20 61 20 4e 2d 62 79 74 65  * binds a N-byte
158d0 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 42 4c 4f   zero-filled BLO
158e0 42 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72  B to the wildcar
158f0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
15900 20 74 65 73 74 5f 62 69 6e 64 5f 7a 65 72 6f 62   test_bind_zerob
15910 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  lob(.  void * cl
15920 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
15930 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
15940 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
15950 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
15960 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
15970 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
15980 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 6e  int idx;.  int n
15990 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
159a0 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
159b0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
159c0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
159d0 6a 76 2c 20 22 53 54 4d 54 20 49 44 58 20 4e 22  jv, "STMT IDX N"
159e0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
159f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
15a00 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
15a10 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
15a20 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
15a30 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
15a40 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
15a50 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
15a60 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
15a70 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  bjv[2], &idx) ) 
15a80 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15a90 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
15aa0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
15ab0 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29  , objv[3], &n) )
15ac0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
15ad0 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
15ae0 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62  e3_bind_zeroblob
15af0 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 6e 29 3b  (pStmt, idx, n);
15b00 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
15b10 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
15b20 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74  , StmtToDb(pStmt
15b30 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  ), rc) ) return 
15b40 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
15b50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15b60 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
15b70 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72  _ERROR;.  }..  r
15b80 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
15b90 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
15ba0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
15bb0 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a 2a    STMT N VALUE.*
15bc0 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71  *.** Test the sq
15bd0 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20 69  lite3_bind_int i
15be0 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20  nterface.  STMT 
15bf0 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74  is a prepared st
15c00 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73  atement..** N is
15c10 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
15c20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20  wildcard in the 
15c30 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
15c40 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e  nt.  This comman
15c50 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 33 32 2d  d.** binds a 32-
15c60 62 69 74 20 69 6e 74 65 67 65 72 20 56 41 4c 55  bit integer VALU
15c70 45 20 74 6f 20 74 68 61 74 20 77 69 6c 64 63 61  E to that wildca
15c80 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rd..*/.static in
15c90 74 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74 28  t test_bind_int(
15ca0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
15cb0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
15cc0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
15cd0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
15ce0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
15cf0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
15d00 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
15d10 69 64 78 3b 0a 20 20 69 6e 74 20 76 61 6c 75 65  idx;.  int value
15d20 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
15d30 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
15d40 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
15d50 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
15d60 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
15d70 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
15d80 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
15d90 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
15da0 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55  ), " STMT N VALU
15db0 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  E", 0);.    retu
15dc0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15dd0 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
15de0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
15df0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
15e00 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
15e10 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
15e20 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
15e30 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
15e40 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64  rp, objv[2], &id
15e50 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  x) ) return TCL_
15e60 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
15e70 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
15e80 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
15e90 26 76 61 6c 75 65 29 20 29 20 72 65 74 75 72 6e  &value) ) return
15ea0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
15eb0 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
15ec0 5f 69 6e 74 28 70 53 74 6d 74 2c 20 69 64 78 2c  _int(pStmt, idx,
15ed0 20 76 61 6c 75 65 29 3b 0a 20 20 69 66 28 20 73   value);.  if( s
15ee0 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
15ef0 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f  e(interp, StmtTo
15f00 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29  Db(pStmt), rc) )
15f10 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
15f20 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  R;.  if( rc!=SQL
15f30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
15f40 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15f50 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43    }..  return TC
15f60 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
15f70 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
15f80 5f 62 69 6e 64 5f 69 6e 74 36 34 20 20 53 54 4d  _bind_int64  STM
15f90 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20  T N VALUE.**.** 
15fa0 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33  Test the sqlite3
15fb0 5f 62 69 6e 64 5f 69 6e 74 36 34 20 69 6e 74 65  _bind_int64 inte
15fc0 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20  rface.  STMT is 
15fd0 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
15fe0 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68  ment..** N is th
15ff0 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c  e index of a wil
16000 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65  dcard in the pre
16010 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
16020 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a    This command.*
16030 2a 20 62 69 6e 64 73 20 61 20 36 34 2d 62 69 74  * binds a 64-bit
16040 20 69 6e 74 65 67 65 72 20 56 41 4c 55 45 20 74   integer VALUE t
16050 6f 20 74 68 61 74 20 77 69 6c 64 63 61 72 64 2e  o that wildcard.
16060 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
16070 65 73 74 5f 62 69 6e 64 5f 69 6e 74 36 34 28 0a  est_bind_int64(.
16080 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
16090 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
160a0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
160b0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
160c0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
160d0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
160e0 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69   *pStmt;.  int i
160f0 64 78 3b 0a 20 20 69 36 34 20 76 61 6c 75 65 3b  dx;.  i64 value;
16100 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
16110 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
16120 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
16130 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
16140 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
16150 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
16160 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
16170 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
16180 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45  , " STMT N VALUE
16190 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
161a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
161b0 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
161c0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
161d0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
161e0 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
161f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16200 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
16210 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
16220 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78  p, objv[2], &idx
16230 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
16240 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
16250 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62  GetWideIntFromOb
16260 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
16270 5d 2c 20 26 76 61 6c 75 65 29 20 29 20 72 65 74  ], &value) ) ret
16280 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
16290 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
162a0 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  ind_int64(pStmt,
162b0 20 69 64 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20   idx, value);.  
162c0 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
162d0 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53  rrCode(interp, S
162e0 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20  tmtToDb(pStmt), 
162f0 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
16300 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
16310 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16320 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
16330 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ROR;.  }..  retu
16340 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
16350 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
16360 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c  lite3_bind_doubl
16370 65 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a  e  STMT N VALUE.
16380 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73  **.** Test the s
16390 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62  qlite3_bind_doub
163a0 6c 65 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53  le interface.  S
163b0 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65  TMT is a prepare
163c0 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  d statement..** 
163d0 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  N is the index o
163e0 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20  f a wildcard in 
163f0 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
16400 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  tement.  This co
16410 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61  mmand.** binds a
16420 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
16430 56 41 4c 55 45 20 74 6f 20 74 68 61 74 20 77 69  VALUE to that wi
16440 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69  ldcard..*/.stati
16450 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f  c int test_bind_
16460 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a  double(.  void *
16470 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
16480 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
16490 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
164a0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
164b0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
164c0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
164d0 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 64 6f  .  int idx;.  do
164e0 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20 69 6e  uble value;.  in
164f0 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68  t rc;.  const ch
16500 61 72 20 2a 7a 56 61 6c 3b 0a 20 20 69 6e 74 20  ar *zVal;.  int 
16510 69 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  i;.  static cons
16520 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63  t struct {.    c
16530 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
16540 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ;     /* Name of
16550 20 74 68 65 20 73 70 65 63 69 61 6c 20 66 6c 6f   the special flo
16560 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
16570 65 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65  e */.    unsigne
16580 64 20 69 6e 74 20 69 55 70 70 65 72 3b 20 20 20  d int iUpper;   
16590 2f 2a 20 55 70 70 65 72 20 33 32 20 62 69 74 73  /* Upper 32 bits
165a0 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64   */.    unsigned
165b0 20 69 6e 74 20 69 4c 6f 77 65 72 3b 20 20 20 2f   int iLower;   /
165c0 2a 20 4c 6f 77 65 72 20 33 32 20 62 69 74 73 20  * Lower 32 bits 
165d0 2a 2f 0a 20 20 7d 20 61 53 70 65 63 69 61 6c 46  */.  } aSpecialF
165e0 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 20 22  p[] = {.    {  "
165f0 4e 61 4e 22 2c 20 20 20 20 20 20 30 78 37 66 66  NaN",      0x7ff
16600 66 66 66 66 66 2c 20 30 78 66 66 66 66 66 66 66  fffff, 0xfffffff
16610 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22 53 4e 61  f },.    {  "SNa
16620 4e 22 2c 20 20 20 20 20 30 78 37 66 66 37 66 66  N",     0x7ff7ff
16630 66 66 2c 20 30 78 66 66 66 66 66 66 66 66 20 7d  ff, 0xffffffff }
16640 2c 0a 20 20 20 20 7b 20 20 22 2d 4e 61 4e 22 2c  ,.    {  "-NaN",
16650 20 20 20 20 20 30 78 66 66 66 66 66 66 66 66 2c       0xffffffff,
16660 20 30 78 66 66 66 66 66 66 66 66 20 7d 2c 0a 20   0xffffffff },. 
16670 20 20 20 7b 20 20 22 2d 53 4e 61 4e 22 2c 20 20     {  "-SNaN",  
16680 20 20 30 78 66 66 66 37 66 66 66 66 2c 20 30 78    0xfff7ffff, 0x
16690 66 66 66 66 66 66 66 66 20 7d 2c 0a 20 20 20 20  ffffffff },.    
166a0 7b 20 20 22 2b 49 6e 66 22 2c 20 20 20 20 20 30  {  "+Inf",     0
166b0 78 37 66 66 30 30 30 30 30 2c 20 30 78 30 30 30  x7ff00000, 0x000
166c0 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 20  00000 },.    {  
166d0 22 2d 49 6e 66 22 2c 20 20 20 20 20 30 78 66 66  "-Inf",     0xff
166e0 66 30 30 30 30 30 2c 20 30 78 30 30 30 30 30 30  f00000, 0x000000
166f0 30 30 20 7d 2c 0a 20 20 20 20 7b 20 20 22 45 70  00 },.    {  "Ep
16700 73 69 6c 6f 6e 22 2c 20 20 30 78 30 30 30 30 30  silon",  0x00000
16710 30 30 30 2c 20 30 78 30 30 30 30 30 30 30 31 20  000, 0x00000001 
16720 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 45 70 73 69  },.    {  "-Epsi
16730 6c 6f 6e 22 2c 20 30 78 38 30 30 30 30 30 30 30  lon", 0x80000000
16740 2c 20 30 78 30 30 30 30 30 30 30 31 20 7d 2c 0a  , 0x00000001 },.
16750 20 20 20 20 7b 20 20 22 4e 61 4e 30 22 2c 20 20      {  "NaN0",  
16760 20 20 20 30 78 37 66 66 38 30 30 30 30 2c 20 30     0x7ff80000, 0
16770 78 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 20  x00000000 },.   
16780 20 7b 20 20 22 2d 4e 61 4e 30 22 2c 20 20 20 20   {  "-NaN0",    
16790 30 78 66 66 66 38 30 30 30 30 2c 20 30 78 30 30  0xfff80000, 0x00
167a0 30 30 30 30 30 30 20 7d 2c 0a 20 20 7d 3b 0a 0a  000000 },.  };..
167b0 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
167c0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
167d0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
167e0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
167f0 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
16800 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
16810 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
16820 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56  , 0), " STMT N V
16830 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20 20 72  ALUE", 0);.    r
16840 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16850 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
16860 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
16870 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
16880 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
16890 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
168a0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
168b0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
168c0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
168d0 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54  &idx) ) return T
168e0 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20  CL_ERROR;..  /* 
168f0 49 6e 74 65 72 63 65 70 74 20 74 68 65 20 73 74  Intercept the st
16900 72 69 6e 67 20 22 4e 61 4e 22 20 61 6e 64 20 67  ring "NaN" and g
16910 65 6e 65 72 61 74 65 20 61 20 4e 61 4e 20 76 61  enerate a NaN va
16920 6c 75 65 20 66 6f 72 20 69 74 2e 0a 20 20 2a 2a  lue for it..  **
16930 20 41 6c 6c 20 6f 74 68 65 72 20 73 74 72 69 6e   All other strin
16940 67 73 20 61 72 65 20 70 61 73 73 65 64 20 74 68  gs are passed th
16950 72 6f 75 67 68 20 74 6f 20 54 63 6c 5f 47 65 74  rough to Tcl_Get
16960 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 29 2e  DoubleFromObj().
16970 0a 20 20 2a 2a 20 54 63 6c 5f 47 65 74 44 6f 75  .  ** Tcl_GetDou
16980 62 6c 65 46 72 6f 6d 4f 62 6a 28 29 20 73 68 6f  bleFromObj() sho
16990 75 6c 64 20 75 6e 64 65 72 73 74 61 6e 64 20 22  uld understand "
169a0 4e 61 4e 22 20 62 75 74 20 73 6f 6d 65 20 76 65  NaN" but some ve
169b0 72 73 69 6f 6e 73 0a 20 20 2a 2a 20 63 6f 6e 74  rsions.  ** cont
169c0 61 69 6e 20 61 20 62 75 67 2e 0a 20 20 2a 2f 0a  ain a bug..  */.
169d0 20 20 7a 56 61 6c 20 3d 20 54 63 6c 5f 47 65 74    zVal = Tcl_Get
169e0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b  String(objv[3]);
169f0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
16a00 7a 65 6f 66 28 61 53 70 65 63 69 61 6c 46 70 29  zeof(aSpecialFp)
16a10 2f 73 69 7a 65 6f 66 28 61 53 70 65 63 69 61 6c  /sizeof(aSpecial
16a20 46 70 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  Fp[0]); i++){.  
16a30 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 53 70    if( strcmp(aSp
16a40 65 63 69 61 6c 46 70 5b 69 5d 2e 7a 4e 61 6d 65  ecialFp[i].zName
16a50 2c 20 7a 56 61 6c 29 3d 3d 30 20 29 7b 0a 20 20  , zVal)==0 ){.  
16a60 20 20 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74      sqlite3_uint
16a70 36 34 20 78 3b 0a 20 20 20 20 20 20 78 20 3d 20  64 x;.      x = 
16a80 61 53 70 65 63 69 61 6c 46 70 5b 69 5d 2e 69 55  aSpecialFp[i].iU
16a90 70 70 65 72 3b 0a 20 20 20 20 20 20 78 20 3c 3c  pper;.      x <<
16aa0 3d 20 33 32 3b 0a 20 20 20 20 20 20 78 20 7c 3d  = 32;.      x |=
16ab0 20 61 53 70 65 63 69 61 6c 46 70 5b 69 5d 2e 69   aSpecialFp[i].i
16ac0 4c 6f 77 65 72 3b 0a 20 20 20 20 20 20 61 73 73  Lower;.      ass
16ad0 65 72 74 28 20 73 69 7a 65 6f 66 28 76 61 6c 75  ert( sizeof(valu
16ae0 65 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 61  e)==8 );.      a
16af0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29  ssert( sizeof(x)
16b00 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  ==8 );.      mem
16b10 63 70 79 28 26 76 61 6c 75 65 2c 20 26 78 2c 20  cpy(&value, &x, 
16b20 38 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  8);.      break;
16b30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
16b40 20 69 3e 3d 73 69 7a 65 6f 66 28 61 53 70 65 63   i>=sizeof(aSpec
16b50 69 61 6c 46 70 29 2f 73 69 7a 65 6f 66 28 61 53  ialFp)/sizeof(aS
16b60 70 65 63 69 61 6c 46 70 5b 30 5d 29 20 26 26 0a  pecialFp[0]) &&.
16b70 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74           Tcl_Get
16b80 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e  DoubleFromObj(in
16b90 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
16ba0 76 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 72 65  value) ){.    re
16bb0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
16bc0 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
16bd0 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70  e3_bind_double(p
16be0 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65  Stmt, idx, value
16bf0 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
16c00 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
16c10 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74  rp, StmtToDb(pSt
16c20 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72  mt), rc) ) retur
16c30 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
16c40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16c50 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
16c60 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
16c70 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
16c80 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
16c90 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e    sqlite3_bind_n
16ca0 75 6c 6c 20 20 53 54 4d 54 20 4e 0a 2a 2a 0a 2a  ull  STMT N.**.*
16cb0 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74  * Test the sqlit
16cc0 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 69 6e 74  e3_bind_null int
16cd0 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73  erface.  STMT is
16ce0 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
16cf0 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74  ement..** N is t
16d00 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69  he index of a wi
16d10 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72  ldcard in the pr
16d20 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
16d30 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a  .  This command.
16d40 2a 2a 20 62 69 6e 64 73 20 61 20 4e 55 4c 4c 20  ** binds a NULL 
16d50 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e  to the wildcard.
16d60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
16d70 65 73 74 5f 62 69 6e 64 5f 6e 75 6c 6c 28 0a 20  est_bind_null(. 
16d80 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
16d90 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
16da0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
16db0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
16dc0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
16dd0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
16de0 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64  *pStmt;.  int id
16df0 78 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  x;.  int rc;..  
16e00 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
16e10 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
16e20 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
16e30 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
16e40 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
16e50 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
16e60 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
16e70 30 29 2c 20 22 20 53 54 4d 54 20 4e 22 2c 20 30  0), " STMT N", 0
16e80 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
16e90 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
16ea0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
16eb0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
16ec0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
16ed0 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
16ee0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16ef0 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
16f00 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
16f10 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  bjv[2], &idx) ) 
16f20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16f30 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
16f40 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d  3_bind_null(pStm
16f50 74 2c 20 69 64 78 29 3b 0a 20 20 69 66 28 20 73  t, idx);.  if( s
16f60 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
16f70 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f  e(interp, StmtTo
16f80 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29  Db(pStmt), rc) )
16f90 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16fa0 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  R;.  if( rc!=SQL
16fb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
16fc0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
16fd0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43    }..  return TC
16fe0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
16ff0 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
17000 62 69 6e 64 5f 74 65 78 74 20 20 53 54 4d 54 20  bind_text  STMT 
17010 4e 20 53 54 52 49 4e 47 20 42 59 54 45 53 0a 2a  N STRING BYTES.*
17020 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71  *.** Test the sq
17030 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 20  lite3_bind_text 
17040 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54  interface.  STMT
17050 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73   is a prepared s
17060 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69  tatement..** N i
17070 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  s the index of a
17080 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65   wildcard in the
17090 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
170a0 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61  ent.  This comma
170b0 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 55 54  nd.** binds a UT
170c0 46 2d 38 20 73 74 72 69 6e 67 20 53 54 52 49 4e  F-8 string STRIN
170d0 47 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72  G to the wildcar
170e0 64 2e 20 20 54 68 65 20 73 74 72 69 6e 67 20 69  d.  The string i
170f0 73 20 42 59 54 45 53 20 62 79 74 65 73 0a 2a 2a  s BYTES bytes.**
17100 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63   long..*/.static
17110 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 74   int test_bind_t
17120 65 78 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ext(.  void * cl
17130 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
17140 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
17150 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
17160 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
17170 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
17180 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
17190 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 62  int idx;.  int b
171a0 79 74 65 73 3b 0a 20 20 63 68 61 72 20 2a 76 61  ytes;.  char *va
171b0 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  lue;.  int rc;..
171c0 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b    if( objc!=5 ){
171d0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
171e0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
171f0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
17200 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
17210 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
17220 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
17230 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56  , 0), " STMT N V
17240 41 4c 55 45 20 42 59 54 45 53 22 2c 20 30 29 3b  ALUE BYTES", 0);
17250 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
17260 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
17270 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
17280 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
17290 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
172a0 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
172b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
172c0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
172d0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
172e0 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65  v[2], &idx) ) re
172f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17300 20 20 76 61 6c 75 65 20 3d 20 28 63 68 61 72 2a    value = (char*
17310 29 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61  )Tcl_GetByteArra
17320 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d  yFromObj(objv[3]
17330 2c 20 26 62 79 74 65 73 29 3b 0a 20 20 69 66 28  , &bytes);.  if(
17340 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
17350 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
17360 34 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65  4], &bytes) ) re
17370 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17380 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
17390 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
173a0 20 69 64 78 2c 20 76 61 6c 75 65 2c 20 62 79 74   idx, value, byt
173b0 65 73 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  es, SQLITE_TRANS
173c0 49 45 4e 54 29 3b 0a 20 20 69 66 28 20 73 71 6c  IENT);.  if( sql
173d0 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
173e0 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62  interp, StmtToDb
173f0 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72  (pStmt), rc) ) r
17400 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17410 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
17420 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
17430 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
17440 65 72 70 2c 20 73 71 6c 69 74 65 33 54 65 73 74  erp, sqlite3Test
17450 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30  ErrorName(rc), 0
17460 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
17470 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
17480 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
17490 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
174a0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
174b0 78 74 31 36 20 3f 2d 73 74 61 74 69 63 3f 20 53  xt16 ?-static? S
174c0 54 4d 54 20 4e 20 53 54 52 49 4e 47 20 42 59 54  TMT N STRING BYT
174d0 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68  ES.**.** Test th
174e0 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74  e sqlite3_bind_t
174f0 65 78 74 31 36 20 69 6e 74 65 72 66 61 63 65 2e  ext16 interface.
17500 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70    STMT is a prep
17510 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
17520 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65  ** N is the inde
17530 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20  x of a wildcard 
17540 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
17550 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73  statement.  This
17560 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64   command.** bind
17570 73 20 61 20 55 54 46 2d 31 36 20 73 74 72 69 6e  s a UTF-16 strin
17580 67 20 53 54 52 49 4e 47 20 74 6f 20 74 68 65 20  g STRING to the 
17590 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 73  wildcard.  The s
175a0 74 72 69 6e 67 20 69 73 20 42 59 54 45 53 20 62  tring is BYTES b
175b0 79 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f  ytes.** long..*/
175c0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
175d0 5f 62 69 6e 64 5f 74 65 78 74 31 36 28 0a 20 20  _bind_text16(.  
175e0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
175f0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
17600 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
17610 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
17620 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
17630 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17640 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69  MIT_UTF16.  sqli
17650 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
17660 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e  .  int idx;.  in
17670 74 20 62 79 74 65 73 3b 0a 20 20 63 68 61 72 20  t bytes;.  char 
17680 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63  *value;.  int rc
17690 3b 0a 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c  ;..  void (*xDel
176a0 29 28 29 20 3d 20 28 6f 62 6a 63 3d 3d 36 3f 53  )() = (objc==6?S
176b0 51 4c 49 54 45 5f 53 54 41 54 49 43 3a 53 51 4c  QLITE_STATIC:SQL
176c0 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
176d0 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 53 74 6d 74    Tcl_Obj *oStmt
176e0 20 20 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d      = objv[objc-
176f0 34 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f  4];.  Tcl_Obj *o
17700 4e 20 20 20 20 20 20 20 3d 20 6f 62 6a 76 5b 6f  N       = objv[o
17710 62 6a 63 2d 33 5d 3b 0a 20 20 54 63 6c 5f 4f 62  bjc-3];.  Tcl_Ob
17720 6a 20 2a 6f 53 74 72 69 6e 67 20 20 3d 20 6f 62  j *oString  = ob
17730 6a 76 5b 6f 62 6a 63 2d 32 5d 3b 0a 20 20 54 63  jv[objc-2];.  Tc
17740 6c 5f 4f 62 6a 20 2a 6f 42 79 74 65 73 20 20 20  l_Obj *oBytes   
17750 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a  = objv[objc-1];.
17760 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26  .  if( objc!=5 &
17770 26 20 6f 62 6a 63 21 3d 36 29 7b 0a 20 20 20 20  & objc!=6){.    
17780 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
17790 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
177a0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
177b0 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
177c0 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
177d0 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
177e0 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 20   " STMT N VALUE 
177f0 42 59 54 45 53 22 2c 20 30 29 3b 0a 20 20 20 20  BYTES", 0);.    
17800 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17810 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
17820 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
17830 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
17840 67 28 6f 53 74 6d 74 29 2c 20 26 70 53 74 6d 74  g(oStmt), &pStmt
17850 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
17860 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
17870 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
17880 74 65 72 70 2c 20 6f 4e 2c 20 26 69 64 78 29 20  terp, oN, &idx) 
17890 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
178a0 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d 20 28 63  OR;.  value = (c
178b0 68 61 72 2a 29 54 63 6c 5f 47 65 74 42 79 74 65  har*)Tcl_GetByte
178c0 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 53 74  ArrayFromObj(oSt
178d0 72 69 6e 67 2c 20 30 29 3b 0a 20 20 69 66 28 20  ring, 0);.  if( 
178e0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
178f0 6a 28 69 6e 74 65 72 70 2c 20 6f 42 79 74 65 73  j(interp, oBytes
17900 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75  , &bytes) ) retu
17910 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
17920 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69   rc = sqlite3_bi
17930 6e 64 5f 74 65 78 74 31 36 28 70 53 74 6d 74 2c  nd_text16(pStmt,
17940 20 69 64 78 2c 20 28 76 6f 69 64 20 2a 29 76 61   idx, (void *)va
17950 6c 75 65 2c 20 62 79 74 65 73 2c 20 78 44 65 6c  lue, bytes, xDel
17960 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
17970 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
17980 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74  rp, StmtToDb(pSt
17990 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72  mt), rc) ) retur
179a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
179b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
179c0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
179d0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
179e0 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 6f   sqlite3TestErro
179f0 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
17a00 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
17a10 52 4f 52 3b 0a 20 20 7d 0a 0a 23 65 6e 64 69 66  ROR;.  }..#endif
17a20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
17a30 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72  UTF16 */.  retur
17a40 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
17a50 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
17a60 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 20 3f 2d  te3_bind_blob ?-
17a70 73 74 61 74 69 63 3f 20 53 54 4d 54 20 4e 20 44  static? STMT N D
17a80 41 54 41 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20  ATA BYTES.**.** 
17a90 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33  Test the sqlite3
17aa0 5f 62 69 6e 64 5f 62 6c 6f 62 20 69 6e 74 65 72  _bind_blob inter
17ab0 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61  face.  STMT is a
17ac0 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
17ad0 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65  ent..** N is the
17ae0 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64   index of a wild
17af0 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70  card in the prep
17b00 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20  ared statement. 
17b10 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a   This command.**
17b20 20 62 69 6e 64 73 20 61 20 42 4c 4f 42 20 74 6f   binds a BLOB to
17b30 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e 20 20   the wildcard.  
17b40 54 68 65 20 42 4c 4f 42 20 69 73 20 42 59 54 45  The BLOB is BYTE
17b50 53 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  S bytes in size.
17b60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
17b70 65 73 74 5f 62 69 6e 64 5f 62 6c 6f 62 28 0a 20  est_bind_blob(. 
17b80 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
17b90 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
17ba0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
17bb0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
17bc0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
17bd0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
17be0 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64  *pStmt;.  int id
17bf0 78 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a  x;.  int bytes;.
17c00 20 20 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20    char *value;. 
17c10 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
17c20 65 33 5f 64 65 73 74 72 75 63 74 6f 72 5f 74 79  e3_destructor_ty
17c30 70 65 20 78 44 65 73 74 72 75 63 74 6f 72 20 3d  pe xDestructor =
17c40 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
17c50 54 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  T;..  if( objc!=
17c60 35 20 26 26 20 6f 62 6a 63 21 3d 36 20 29 7b 0a  5 && objc!=6 ){.
17c70 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
17c80 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
17c90 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
17ca0 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
17cb0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
17cc0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
17cd0 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 44 41   0), " STMT N DA
17ce0 54 41 20 42 59 54 45 53 22 2c 20 30 29 3b 0a 20  TA BYTES", 0);. 
17cf0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
17d00 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
17d10 6f 62 6a 63 3d 3d 36 20 29 7b 0a 20 20 20 20 78  objc==6 ){.    x
17d20 44 65 73 74 72 75 63 74 6f 72 20 3d 20 53 51 4c  Destructor = SQL
17d30 49 54 45 5f 53 54 41 54 49 43 3b 0a 20 20 20 20  ITE_STATIC;.    
17d40 6f 62 6a 76 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 69  objv++;.  }..  i
17d50 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
17d60 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
17d70 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
17d80 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
17d90 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
17da0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
17db0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
17dc0 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72  jv[2], &idx) ) r
17dd0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17de0 0a 20 20 76 61 6c 75 65 20 3d 20 54 63 6c 5f 47  .  value = Tcl_G
17df0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
17e00 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  );.  if( Tcl_Get
17e10 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
17e20 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74  p, objv[4], &byt
17e30 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  es) ) return TCL
17e40 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
17e50 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f  sqlite3_bind_blo
17e60 62 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61  b(pStmt, idx, va
17e70 6c 75 65 2c 20 62 79 74 65 73 2c 20 78 44 65 73  lue, bytes, xDes
17e80 74 72 75 63 74 6f 72 29 3b 0a 20 20 69 66 28 20  tructor);.  if( 
17e90 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
17ea0 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54  de(interp, StmtT
17eb0 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20  oDb(pStmt), rc) 
17ec0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
17ed0 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  OR;.  if( rc!=SQ
17ee0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
17ef0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17f00 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
17f10 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
17f20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
17f30 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
17f40 63 6f 75 6e 74 20 20 53 54 4d 54 0a 2a 2a 0a 2a  count  STMT.**.*
17f50 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
17f60 62 65 72 20 6f 66 20 77 69 6c 64 63 61 72 64 73  ber of wildcards
17f70 20 69 6e 20 74 68 65 20 67 69 76 65 6e 20 73 74   in the given st
17f80 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  atement..*/.stat
17f90 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
17fa0 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74  _parameter_count
17fb0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
17fc0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
17fd0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
17fe0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
17ff0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
18000 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
18010 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66  mt *pStmt;..  if
18020 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
18030 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
18040 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
18050 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20  v, "STMT");.    
18060 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
18070 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53  ;.  }.  if( getS
18080 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
18090 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
180a0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
180b0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
180c0 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74  ERROR;.  Tcl_Set
180d0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
180e0 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
180f0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
18100 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74  ameter_count(pSt
18110 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  mt)));.  return 
18120 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
18130 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
18140 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
18150 5f 6e 61 6d 65 20 20 53 54 4d 54 20 20 4e 0a 2a  _name  STMT  N.*
18160 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
18170 6e 61 6d 65 20 6f 66 20 74 68 65 20 4e 74 68 20  name of the Nth 
18180 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 66  wildcard.  The f
18190 69 72 73 74 20 77 69 6c 64 63 61 72 64 20 69 73  irst wildcard is
181a0 20 31 2e 0a 2a 2a 20 41 6e 20 65 6d 70 74 79 20   1..** An empty 
181b0 73 74 72 69 6e 67 20 69 73 20 72 65 74 75 72 6e  string is return
181c0 65 64 20 69 66 20 4e 20 69 73 20 6f 75 74 20 6f  ed if N is out o
181d0 66 20 72 61 6e 67 65 20 6f 72 20 69 66 20 74 68  f range or if th
181e0 65 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69 73  e wildcard.** is
181f0 20 6e 61 6d 65 6c 65 73 73 2e 0a 2a 2f 0a 73 74   nameless..*/.st
18200 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69  atic int test_bi
18210 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
18220 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
18230 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
18240 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
18250 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
18260 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
18270 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
18280 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
18290 74 20 69 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  t i;..  if( objc
182a0 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=3 ){.    Tcl_W
182b0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
182c0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54  rp, 1, objv, "ST
182d0 4d 54 20 4e 22 29 3b 0a 20 20 20 20 72 65 74 75  MT N");.    retu
182e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
182f0 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
18300 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
18310 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
18320 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
18330 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
18340 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
18350 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
18360 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 29 20  p, objv[2], &i) 
18370 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
18380 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  OR;.  Tcl_SetObj
18390 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a  Result(interp, .
183a0 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69       Tcl_NewStri
183b0 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f 62 69  ngObj(sqlite3_bi
183c0 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
183d0 65 28 70 53 74 6d 74 2c 69 29 2c 2d 31 29 0a 20  e(pStmt,i),-1). 
183e0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   );.  return TCL
183f0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
18400 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
18410 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e  ind_parameter_in
18420 64 65 78 20 20 53 54 4d 54 20 20 4e 41 4d 45 0a  dex  STMT  NAME.
18430 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
18440 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 77 69   index of the wi
18450 6c 64 63 61 72 64 20 63 61 6c 6c 65 64 20 4e 41  ldcard called NA
18460 4d 45 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  ME.  Return 0 if
18470 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20   there is.** no 
18480 73 75 63 68 20 77 69 6c 64 63 61 72 64 2e 0a 2a  such wildcard..*
18490 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
184a0 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  t_bind_parameter
184b0 5f 69 6e 64 65 78 28 0a 20 20 76 6f 69 64 20 2a  _index(.  void *
184c0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
184d0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
184e0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
184f0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
18500 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
18510 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
18520 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
18530 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
18540 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
18550 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20 4e  1, objv, "STMT N
18560 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72  AME");.    retur
18570 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
18580 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
18590 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
185a0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
185b0 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
185c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
185d0 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
185e0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20  sult(interp, .  
185f0 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a     Tcl_NewIntObj
18600 28 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  (.       sqlite3
18610 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
18620 69 6e 64 65 78 28 70 53 74 6d 74 2c 54 63 6c 5f  index(pStmt,Tcl_
18630 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
18640 5d 29 29 0a 20 20 20 20 20 29 0a 20 20 29 3b 0a  ])).     ).  );.
18650 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
18660 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
18670 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 65 61 72     sqlite3_clear
18680 5f 62 69 6e 64 69 6e 67 73 20 53 54 4d 54 0a 2a  _bindings STMT.*
18690 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  *.*/.static int 
186a0 74 65 73 74 5f 63 6c 65 61 72 5f 62 69 6e 64 69  test_clear_bindi
186b0 6e 67 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ngs(.  void * cl
186c0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
186d0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
186e0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
186f0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
18700 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
18710 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20  _stmt *pStmt;.. 
18720 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
18730 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
18740 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
18750 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20  objv, "STMT");. 
18760 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
18770 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
18780 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
18790 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
187a0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
187b0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
187c0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
187d0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
187e0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
187f0 62 6a 28 73 71 6c 69 74 65 33 5f 63 6c 65 61 72  bj(sqlite3_clear
18800 5f 62 69 6e 64 69 6e 67 73 28 70 53 74 6d 74 29  _bindings(pStmt)
18810 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
18820 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
18830 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 73  age:   sqlite3_s
18840 6c 65 65 70 20 4d 49 4c 4c 49 53 45 43 4f 4e 44  leep MILLISECOND
18850 53 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  S.*/.static int 
18860 74 65 73 74 5f 73 6c 65 65 70 28 0a 20 20 76 6f  test_sleep(.  vo
18870 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
18880 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
18890 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
188a0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
188b0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
188c0 69 6e 74 20 6d 73 3b 0a 0a 20 20 69 66 28 20 6f  int ms;..  if( o
188d0 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
188e0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
188f0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
18900 22 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 22 29 3b  "MILLISECONDS");
18910 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
18920 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
18930 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
18940 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
18950 31 5d 2c 20 26 6d 73 29 20 29 7b 0a 20 20 20 20  1], &ms) ){.    
18960 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
18970 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f  ;.  }.  Tcl_SetO
18980 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
18990 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
189a0 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 6d 73 29  qlite3_sleep(ms)
189b0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
189c0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
189d0 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 78 74  age: sqlite3_ext
189e0 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 20 44 42  ended_errcode DB
189f0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
18a00 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  e string represe
18a10 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  ntation of the m
18a20 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74  ost recent sqlit
18a30 65 33 5f 2a 20 41 50 49 0a 2a 2a 20 65 72 72 6f  e3_* API.** erro
18a40 72 20 63 6f 64 65 2e 20 65 2e 67 2e 20 22 53 51  r code. e.g. "SQ
18a50 4c 49 54 45 5f 45 52 52 4f 52 22 2e 0a 2a 2f 0a  LITE_ERROR"..*/.
18a60 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
18a70 65 78 5f 65 72 72 63 6f 64 65 28 0a 20 20 76 6f  ex_errcode(.  vo
18a80 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
18a90 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
18aa0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
18ab0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
18ac0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
18ad0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
18ae0 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
18af0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
18b00 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
18b10 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
18b20 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
18b30 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
18b40 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
18b50 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20  ]), " DB", 0);. 
18b60 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
18b70 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
18b80 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
18b90 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
18ba0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
18bb0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
18bc0 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
18bd0 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72  te3_extended_err
18be0 63 6f 64 65 28 64 62 29 3b 0a 20 20 54 63 6c 5f  code(db);.  Tcl_
18bf0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
18c00 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
18c10 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29  rrorName(rc), 0)
18c20 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
18c30 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  K;.}.../*.** Usa
18c40 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 72 72 63  ge: sqlite3_errc
18c50 6f 64 65 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74  ode DB.**.** Ret
18c60 75 72 6e 20 74 68 65 20 73 74 72 69 6e 67 20 72  urn the string r
18c70 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
18c80 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
18c90 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 0a 2a   sqlite3_* API.*
18ca0 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 65 2e  * error code. e.
18cb0 67 2e 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52  g. "SQLITE_ERROR
18cc0 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  "..*/.static int
18cd0 20 74 65 73 74 5f 65 72 72 63 6f 64 65 28 0a 20   test_errcode(. 
18ce0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
18cf0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
18d00 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
18d10 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
18d20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
18d30 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
18d40 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
18d50 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
18d60 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
18d70 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
18d80 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
18d90 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
18da0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
18db0 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29  v[0]), " DB", 0)
18dc0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
18dd0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
18de0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
18df0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
18e00 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
18e10 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
18e20 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
18e30 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64  qlite3_errcode(d
18e40 62 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  b);.  Tcl_Append
18e50 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
18e60 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
18e70 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65  me(rc), 0);.  re
18e80 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
18e90 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
18ea0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 20 44 42  qlite3_errmsg DB
18eb0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74  .**.** Returns t
18ec0 68 65 20 55 54 46 2d 38 20 72 65 70 72 65 73 65  he UTF-8 represe
18ed0 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 65  ntation of the e
18ee0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72  rror message str
18ef0 69 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6d  ing for the.** m
18f00 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74  ost recent sqlit
18f10 65 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e 0a 2a  e3_* API call..*
18f20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
18f30 74 5f 65 72 72 6d 73 67 28 0a 20 20 76 6f 69 64  t_errmsg(.  void
18f40 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
18f50 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
18f60 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
18f70 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
18f80 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
18f90 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
18fa0 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 0a  st char *zErr;..
18fb0 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
18fc0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
18fd0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
18fe0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
18ff0 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
19000 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
19010 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42  g(objv[0]), " DB
19020 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
19030 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
19040 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
19050 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
19060 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
19070 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
19080 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
19090 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 65  zErr = sqlite3_e
190a0 72 72 6d 73 67 28 64 62 29 3b 0a 20 20 54 63 6c  rrmsg(db);.  Tcl
190b0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
190c0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72  terp, Tcl_NewStr
190d0 69 6e 67 4f 62 6a 28 7a 45 72 72 2c 20 2d 31 29  ingObj(zErr, -1)
190e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
190f0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
19100 67 65 3a 20 20 20 74 65 73 74 5f 65 72 72 6d 73  ge:   test_errms
19110 67 31 36 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74  g16 DB.**.** Ret
19120 75 72 6e 73 20 74 68 65 20 55 54 46 2d 31 36 20  urns the UTF-16 
19130 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
19140 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  f the error mess
19150 61 67 65 20 73 74 72 69 6e 67 20 66 6f 72 20 74  age string for t
19160 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e  he.** most recen
19170 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 20  t sqlite3_* API 
19180 63 61 6c 6c 2e 20 54 68 69 73 20 69 73 20 61 20  call. This is a 
19190 62 79 74 65 20 61 72 72 61 79 20 6f 62 6a 65 63  byte array objec
191a0 74 20 61 74 20 74 68 65 20 54 43 4c 20 0a 2a 2a  t at the TCL .**
191b0 20 6c 65 76 65 6c 2c 20 61 6e 64 20 69 74 20 69   level, and it i
191c0 6e 63 6c 75 64 65 73 20 74 68 65 20 30 78 30 30  ncludes the 0x00
191d0 20 30 78 30 30 20 74 65 72 6d 69 6e 61 74 6f 72   0x00 terminator
191e0 20 62 79 74 65 73 20 61 74 20 74 68 65 20 65 6e   bytes at the en
191f0 64 20 6f 66 20 74 68 65 0a 2a 2a 20 55 54 46 2d  d of the.** UTF-
19200 31 36 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74  16 string..*/.st
19210 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72  atic int test_er
19220 72 6d 73 67 31 36 28 0a 20 20 76 6f 69 64 20 2a  rmsg16(.  void *
19230 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
19240 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
19250 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
19260 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
19270 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65  objv[].){.#ifnde
19280 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
19290 46 31 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  F16.  sqlite3 *d
192a0 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  b;.  const void 
192b0 2a 7a 45 72 72 3b 0a 20 20 63 6f 6e 73 74 20 63  *zErr;.  const c
192c0 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 62 79  har *z;.  int by
192d0 74 65 73 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  tes = 0;..  if( 
192e0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
192f0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
19300 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
19310 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
19320 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
19330 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
19340 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b  [0]), " DB", 0);
19350 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
19360 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
19370 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
19380 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
19390 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
193a0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
193b0 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20 3d  ERROR;..  zErr =
193c0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31   sqlite3_errmsg1
193d0 36 28 64 62 29 3b 0a 20 20 69 66 28 20 7a 45 72  6(db);.  if( zEr
193e0 72 20 29 7b 0a 20 20 20 20 7a 20 3d 20 7a 45 72  r ){.    z = zEr
193f0 72 3b 0a 20 20 20 20 66 6f 72 28 62 79 74 65 73  r;.    for(bytes
19400 3d 30 3b 20 7a 5b 62 79 74 65 73 5d 20 7c 7c 20  =0; z[bytes] || 
19410 7a 5b 62 79 74 65 73 2b 31 5d 3b 20 62 79 74 65  z[bytes+1]; byte
19420 73 2b 3d 32 29 7b 7d 0a 20 20 7d 0a 20 20 54 63  s+=2){}.  }.  Tc
19430 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
19440 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79  nterp, Tcl_NewBy
19450 74 65 41 72 72 61 79 4f 62 6a 28 7a 45 72 72 2c  teArrayObj(zErr,
19460 20 62 79 74 65 73 29 29 3b 0a 23 65 6e 64 69 66   bytes));.#endif
19470 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
19480 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72  UTF16 */.  retur
19490 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
194a0 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
194b0 33 5f 70 72 65 70 61 72 65 20 44 42 20 73 71 6c  3_prepare DB sql
194c0 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f   bytes ?tailvar?
194d0 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75  .**.** Compile u
194e0 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74  p to <bytes> byt
194f0 65 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69  es of the suppli
19500 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73  ed SQL string <s
19510 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74  ql> using.** dat
19520 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42  abase handle <DB
19530 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  >. The parameter
19540 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68   <tailval> is th
19550 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62  e name of a glob
19560 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74  al.** variable t
19570 68 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  hat is set to th
19580 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e  e unused portion
19590 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e   of <sql> (if an
195a0 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61  y). A.** STMT ha
195b0 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64  ndle is returned
195c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
195d0 74 65 73 74 5f 70 72 65 70 61 72 65 28 0a 20 20  test_prepare(.  
195e0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
195f0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
19600 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
19610 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
19620 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
19630 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
19640 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
19650 6c 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a  l;.  int bytes;.
19660 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
19670 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ail = 0;.  sqlit
19680 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
19690 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b   0;.  char zBuf[
196a0 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  50];.  int rc;..
196b0 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26    if( objc!=5 &&
196c0 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
196d0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
196e0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
196f0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
19700 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
19710 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
19720 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20  v[0]), " DB sql 
19730 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 22  bytes ?tailvar?"
19740 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
19750 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
19760 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
19770 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
19780 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
19790 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
197a0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53   TCL_ERROR;.  zS
197b0 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ql = Tcl_GetStri
197c0 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69  ng(objv[2]);.  i
197d0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
197e0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
197f0 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20  v[3], &bytes) ) 
19800 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19810 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
19820 33 5f 70 72 65 70 61 72 65 28 64 62 2c 20 7a 53  3_prepare(db, zS
19830 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d  ql, bytes, &pStm
19840 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54  t, objc>=5 ? &zT
19850 61 69 6c 20 3a 20 30 29 3b 0a 20 20 54 63 6c 5f  ail : 0);.  Tcl_
19860 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65  ResetResult(inte
19870 72 70 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  rp);.  if( sqlit
19880 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
19890 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
198a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
198b0 3b 0a 20 20 69 66 28 20 7a 54 61 69 6c 20 26 26  ;.  if( zTail &&
198c0 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20 20   objc>=5 ){.    
198d0 69 66 28 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a  if( bytes>=0 ){.
198e0 20 20 20 20 20 20 62 79 74 65 73 20 3d 20 62 79        bytes = by
198f0 74 65 73 20 2d 20 28 7a 54 61 69 6c 2d 7a 53 71  tes - (zTail-zSq
19900 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  l);.    }.    if
19910 28 20 73 74 72 6c 65 6e 28 7a 54 61 69 6c 29 3c  ( strlen(zTail)<
19920 62 79 74 65 73 20 29 7b 0a 20 20 20 20 20 20 62  bytes ){.      b
19930 79 74 65 73 20 3d 20 73 74 72 6c 65 6e 28 7a 54  ytes = strlen(zT
19940 61 69 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ail);.    }.    
19950 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69  Tcl_ObjSetVar2(i
19960 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
19970 30 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  0, Tcl_NewString
19980 4f 62 6a 28 7a 54 61 69 6c 2c 20 62 79 74 65 73  Obj(zTail, bytes
19990 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ), 0);.  }.  if(
199a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
199b0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  {.    assert( pS
199c0 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 70  tmt==0 );.    sp
199d0 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 28 25 64  rintf(zBuf, "(%d
199e0 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54 63  ) ", rc);.    Tc
199f0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
19a00 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c  nterp, zBuf, sql
19a10 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c  ite3_errmsg(db),
19a20 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
19a30 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
19a40 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
19a50 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65     if( sqlite3Te
19a60 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  stMakePointerStr
19a70 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70  (interp, zBuf, p
19a80 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
19a90 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63  CL_ERROR;.    Tc
19aa0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
19ab0 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b  nterp, zBuf, 0);
19ac0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
19ad0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
19ae0 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72  sage: sqlite3_pr
19af0 65 70 61 72 65 5f 76 32 20 44 42 20 73 71 6c 20  epare_v2 DB sql 
19b00 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 0a  bytes ?tailvar?.
19b10 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70  **.** Compile up
19b20 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65   to <bytes> byte
19b30 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  s of the supplie
19b40 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71  d SQL string <sq
19b50 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61  l> using.** data
19b60 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e  base handle <DB>
19b70 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20  . The parameter 
19b80 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65  <tailval> is the
19b90 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61   name of a globa
19ba0 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68  l.** variable th
19bb0 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  at is set to the
19bc0 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20   unused portion 
19bd0 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79  of <sql> (if any
19be0 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e  ). A.** STMT han
19bf0 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  dle is returned.
19c00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
19c10 65 73 74 5f 70 72 65 70 61 72 65 5f 76 32 28 0a  est_prepare_v2(.
19c20 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
19c30 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
19c40 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
19c50 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
19c60 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
19c70 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
19c80 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
19c90 53 71 6c 3b 0a 20 20 69 6e 74 20 62 79 74 65 73  Sql;.  int bytes
19ca0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
19cb0 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c  zTail = 0;.  sql
19cc0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
19cd0 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75   = 0;.  char zBu
19ce0 66 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b  f[50];.  int rc;
19cf0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20  ..  if( objc!=5 
19d00 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  && objc!=4 ){.  
19d10 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
19d20 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
19d30 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
19d40 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
19d50 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
19d60 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71  bjv[0]), " DB sq
19d70 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 22  l bytes tailvar"
19d80 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
19d90 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
19da0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
19db0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
19dc0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
19dd0 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
19de0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53   TCL_ERROR;.  zS
19df0 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ql = Tcl_GetStri
19e00 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69  ng(objv[2]);.  i
19e10 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
19e20 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
19e30 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20  v[3], &bytes) ) 
19e40 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19e50 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
19e60 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
19e70 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70   zSql, bytes, &p
19e80 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20  Stmt, objc>=5 ? 
19e90 26 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20 20 61  &zTail : 0);.  a
19ea0 73 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45  ssert(rc==SQLITE
19eb0 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d 30 29  _OK || pStmt==0)
19ec0 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73  ;.  Tcl_ResetRes
19ed0 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 69  ult(interp);.  i
19ee0 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
19ef0 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62  rCode(interp, db
19f00 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
19f10 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
19f20 7a 54 61 69 6c 20 26 26 20 6f 62 6a 63 3e 3d 35  zTail && objc>=5
19f30 20 29 7b 0a 20 20 20 20 69 66 28 20 62 79 74 65   ){.    if( byte
19f40 73 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 79  s>=0 ){.      by
19f50 74 65 73 20 3d 20 62 79 74 65 73 20 2d 20 28 7a  tes = bytes - (z
19f60 54 61 69 6c 2d 7a 53 71 6c 29 3b 0a 20 20 20 20  Tail-zSql);.    
19f70 7d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74  }.    Tcl_ObjSet
19f80 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a  Var2(interp, obj
19f90 76 5b 34 5d 2c 20 30 2c 20 54 63 6c 5f 4e 65 77  v[4], 0, Tcl_New
19fa0 53 74 72 69 6e 67 4f 62 6a 28 7a 54 61 69 6c 2c  StringObj(zTail,
19fb0 20 62 79 74 65 73 29 2c 20 30 29 3b 0a 20 20 7d   bytes), 0);.  }
19fc0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
19fd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
19fe0 72 74 28 20 70 53 74 6d 74 3d 3d 30 20 29 3b 0a  rt( pStmt==0 );.
19ff0 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66      sprintf(zBuf
1a000 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b 0a  , "(%d) ", rc);.
1a010 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1a020 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
1a030 66 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  f, sqlite3_errms
1a040 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 72  g(db), 0);.    r
1a050 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1a060 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d  .  }..  if( pStm
1a070 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  t ){.    if( sql
1a080 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e  ite3TestMakePoin
1a090 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a  terStr(interp, z
1a0a0 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65  Buf, pStmt) ) re
1a0b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1a0c0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1a0d0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
1a0e0 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  f, 0);.  }.  ret
1a0f0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1a100 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1a110 74 65 33 5f 70 72 65 70 61 72 65 5f 74 6b 74 33  te3_prepare_tkt3
1a120 31 33 34 20 44 42 0a 2a 2a 0a 2a 2a 20 47 65 6e  134 DB.**.** Gen
1a130 65 72 61 74 65 20 61 20 70 72 65 70 61 72 65 64  erate a prepared
1a140 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 61   statement for a
1a150 20 7a 65 72 6f 2d 62 79 74 65 20 73 74 72 69 6e   zero-byte strin
1a160 67 20 61 73 20 61 20 74 65 73 74 0a 2a 2a 20 66  g as a test.** f
1a170 6f 72 20 74 69 63 6b 65 74 20 23 33 31 33 34 2e  or ticket #3134.
1a180 20 20 54 68 65 20 73 74 72 69 6e 67 20 73 68 6f    The string sho
1a190 75 6c 64 20 62 65 20 70 72 65 63 65 65 64 65 64  uld be preceeded
1a1a0 20 62 79 20 61 20 7a 65 72 6f 20 62 79 74 65 2e   by a zero byte.
1a1b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1a1c0 65 73 74 5f 70 72 65 70 61 72 65 5f 74 6b 74 33  est_prepare_tkt3
1a1d0 31 33 34 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  134(.  void * cl
1a1e0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1a1f0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1a200 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1a210 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1a220 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
1a230 20 2a 64 62 3b 0a 20 20 73 74 61 74 69 63 20 63   *db;.  static c
1a240 6f 6e 73 74 20 63 68 61 72 20 7a 53 71 6c 5b 5d  onst char zSql[]
1a250 20 3d 20 22 5c 30 30 30 53 45 4c 45 43 54 20 31   = "\000SELECT 1
1a260 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ";.  sqlite3_stm
1a270 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
1a280 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20  char zBuf[50];. 
1a290 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
1a2a0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1a2b0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1a2c0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1a2d0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1a2e0 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
1a2f0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1a300 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62  [0]), " DB sql b
1a310 79 74 65 73 20 74 61 69 6c 76 61 72 22 2c 20 30  ytes tailvar", 0
1a320 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1a330 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1a340 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
1a350 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1a360 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1a370 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
1a380 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
1a390 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
1a3a0 76 32 28 64 62 2c 20 26 7a 53 71 6c 5b 31 5d 2c  v2(db, &zSql[1],
1a3b0 20 30 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a   0, &pStmt, 0);.
1a3c0 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51 4c    assert(rc==SQL
1a3d0 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d  ITE_OK || pStmt=
1a3e0 3d 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  =0);.  if( sqlit
1a3f0 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
1a400 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
1a410 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1a420 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1a430 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
1a440 65 72 74 28 20 70 53 74 6d 74 3d 3d 30 20 29 3b  ert( pStmt==0 );
1a450 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
1a460 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b  f, "(%d) ", rc);
1a470 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1a480 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
1a490 75 66 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  uf, sqlite3_errm
1a4a0 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20  sg(db), 0);.    
1a4b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1a4c0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74  ;.  }..  if( pSt
1a4d0 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  mt ){.    if( sq
1a4e0 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
1a4f0 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
1a500 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72  zBuf, pStmt) ) r
1a510 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1a520 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1a530 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
1a540 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  uf, 0);.  }.  re
1a550 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1a560 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1a570 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 20 44  ite3_prepare16 D
1a580 42 20 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c  B sql bytes tail
1a590 76 61 72 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c  var.**.** Compil
1a5a0 65 20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20  e up to <bytes> 
1a5b0 62 79 74 65 73 20 6f 66 20 74 68 65 20 73 75 70  bytes of the sup
1a5c0 70 6c 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67  plied SQL string
1a5d0 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20   <sql> using.** 
1a5e0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
1a5f0 3c 44 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65  <DB>. The parame
1a600 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73  ter <tailval> is
1a610 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67   the name of a g
1a620 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  lobal.** variabl
1a630 65 20 74 68 61 74 20 69 73 20 73 65 74 20 74 6f  e that is set to
1a640 20 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74   the unused port
1a650 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66  ion of <sql> (if
1a660 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54   any). A.** STMT
1a670 20 68 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72   handle is retur
1a680 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
1a690 6e 74 20 74 65 73 74 5f 70 72 65 70 61 72 65 31  nt test_prepare1
1a6a0 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  6(.  void * clie
1a6b0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1a6c0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1a6d0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1a6e0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1a6f0 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ].){.#ifndef SQL
1a700 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
1a710 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1a720 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c  const void *zSql
1a730 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ;.  const void *
1a740 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 54 63 6c  zTail = 0;.  Tcl
1a750 5f 4f 62 6a 20 2a 70 54 61 69 6c 20 3d 20 30 3b  _Obj *pTail = 0;
1a760 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1a770 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68  *pStmt = 0;.  ch
1a780 61 72 20 7a 42 75 66 5b 35 30 5d 3b 20 0a 20 20  ar zBuf[50]; .  
1a790 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 79  int rc;.  int by
1a7a0 74 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  tes;            
1a7b0 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67      /* The integ
1a7c0 65 72 20 73 70 65 63 69 66 69 65 64 20 61 73 20  er specified as 
1a7d0 61 72 67 20 33 20 2a 2f 0a 20 20 69 6e 74 20 6f  arg 3 */.  int o
1a7e0 62 6a 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20  bjlen;          
1a7f0 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65       /* The byte
1a800 2d 61 72 72 61 79 20 6c 65 6e 67 74 68 20 6f 66  -array length of
1a810 20 61 72 67 20 32 20 2a 2f 0a 0a 20 20 69 66 28   arg 2 */..  if(
1a820 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63   objc!=5 && objc
1a830 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
1a840 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1a850 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1a860 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1a870 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1a880 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1a890 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73  , " DB sql bytes
1a8a0 20 3f 74 61 69 6c 76 61 72 3f 22 2c 20 30 29 3b   ?tailvar?", 0);
1a8b0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1a8c0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1a8d0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
1a8e0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1a8f0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
1a900 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1a910 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20  ERROR;.  zSql = 
1a920 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
1a930 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
1a940 20 26 6f 62 6a 6c 65 6e 29 3b 0a 20 20 69 66 28   &objlen);.  if(
1a950 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1a960 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
1a970 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65  3], &bytes) ) re
1a980 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1a990 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1a9a0 70 72 65 70 61 72 65 31 36 28 64 62 2c 20 7a 53  prepare16(db, zS
1a9b0 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d  ql, bytes, &pStm
1a9c0 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54  t, objc>=5 ? &zT
1a9d0 61 69 6c 20 3a 20 30 29 3b 0a 20 20 69 66 28 20  ail : 0);.  if( 
1a9e0 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
1a9f0 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
1aa00 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
1aa10 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 20  ERROR;.  if( rc 
1aa20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
1aa30 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1aa40 69 66 28 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20  if( objc>=5 ){. 
1aa50 20 20 20 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a     if( zTail ){.
1aa60 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 6f        objlen = o
1aa70 62 6a 6c 65 6e 20 2d 20 28 28 75 38 20 2a 29 7a  bjlen - ((u8 *)z
1aa80 54 61 69 6c 2d 28 75 38 20 2a 29 7a 53 71 6c 29  Tail-(u8 *)zSql)
1aa90 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1aaa0 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 30 3b 0a 20     objlen = 0;. 
1aab0 20 20 20 7d 0a 20 20 20 20 70 54 61 69 6c 20 3d     }.    pTail =
1aac0 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
1aad0 79 4f 62 6a 28 28 75 38 20 2a 29 7a 54 61 69 6c  yObj((u8 *)zTail
1aae0 2c 20 6f 62 6a 6c 65 6e 29 3b 0a 20 20 20 20 54  , objlen);.    T
1aaf0 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
1ab00 70 54 61 69 6c 29 3b 0a 20 20 20 20 54 63 6c 5f  pTail);.    Tcl_
1ab10 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72  ObjSetVar2(inter
1ab20 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 70  p, objv[4], 0, p
1ab30 54 61 69 6c 2c 20 30 29 3b 0a 20 20 20 20 54 63  Tail, 0);.    Tc
1ab40 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
1ab50 54 61 69 6c 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  Tail);.  }..  if
1ab60 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69  ( pStmt ){.    i
1ab70 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61  f( sqlite3TestMa
1ab80 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74  kePointerStr(int
1ab90 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74  erp, zBuf, pStmt
1aba0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1abb0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  RROR;.  }.  Tcl_
1abc0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1abd0 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 23  erp, zBuf, 0);.#
1abe0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1abf0 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20  OMIT_UTF16 */.  
1ac00 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1ac10 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1ac20 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36  qlite3_prepare16
1ac30 5f 76 32 20 44 42 20 73 71 6c 20 62 79 74 65 73  _v2 DB sql bytes
1ac40 20 3f 74 61 69 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a   ?tailvar?.**.**
1ac50 20 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c   Compile up to <
1ac60 62 79 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20  bytes> bytes of 
1ac70 74 68 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c  the supplied SQL
1ac80 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73   string <sql> us
1ac90 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ing.** database 
1aca0 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65  handle <DB>. The
1acb0 20 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c   parameter <tail
1acc0 76 61 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65  val> is the name
1acd0 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20   of a global.** 
1ace0 76 61 72 69 61 62 6c 65 20 74 68 61 74 20 69 73  variable that is
1acf0 20 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73   set to the unus
1ad00 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73  ed portion of <s
1ad10 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a  ql> (if any). A.
1ad20 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69  ** STMT handle i
1ad30 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
1ad40 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70  tatic int test_p
1ad50 72 65 70 61 72 65 31 36 5f 76 32 28 0a 20 20 76  repare16_v2(.  v
1ad60 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1ad70 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1ad80 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1ad90 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1ada0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
1adb0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1adc0 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74  IT_UTF16.  sqlit
1add0 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
1ade0 76 6f 69 64 20 2a 7a 53 71 6c 3b 0a 20 20 63 6f  void *zSql;.  co
1adf0 6e 73 74 20 76 6f 69 64 20 2a 7a 54 61 69 6c 20  nst void *zTail 
1ae00 3d 20 30 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  = 0;.  Tcl_Obj *
1ae10 70 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c  pTail = 0;.  sql
1ae20 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1ae30 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75   = 0;.  char zBu
1ae40 66 5b 35 30 5d 3b 20 0a 20 20 69 6e 74 20 72 63  f[50]; .  int rc
1ae50 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 20 20  ;.  int bytes;  
1ae60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ae70 20 54 68 65 20 69 6e 74 65 67 65 72 20 73 70 65   The integer spe
1ae80 63 69 66 69 65 64 20 61 73 20 61 72 67 20 33 20  cified as arg 3 
1ae90 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 6c 65 6e 3b  */.  int objlen;
1aea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1aeb0 2a 20 54 68 65 20 62 79 74 65 2d 61 72 72 61 79  * The byte-array
1aec0 20 6c 65 6e 67 74 68 20 6f 66 20 61 72 67 20 32   length of arg 2
1aed0 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   */..  if( objc!
1aee0 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b  =5 && objc!=4 ){
1aef0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1af00 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1af10 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1af20 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
1af30 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
1af40 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42  g(objv[0]), " DB
1af50 20 73 71 6c 20 62 79 74 65 73 20 3f 74 61 69 6c   sql bytes ?tail
1af60 76 61 72 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72  var?", 0);.    r
1af70 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1af80 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
1af90 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1afa0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1afb0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
1afc0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1afd0 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65  .  zSql = Tcl_Ge
1afe0 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
1aff0 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6f 62 6a 6c  j(objv[2], &objl
1b000 65 6e 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  en);.  if( Tcl_G
1b010 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
1b020 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62  erp, objv[3], &b
1b030 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54  ytes) ) return T
1b040 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
1b050 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
1b060 65 31 36 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c  e16_v2(db, zSql,
1b070 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c 20   bytes, &pStmt, 
1b080 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54 61 69 6c  objc>=5 ? &zTail
1b090 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 73 71 6c   : 0);.  if( sql
1b0a0 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
1b0b0 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20  interp, db, rc) 
1b0c0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1b0d0 4f 52 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  OR;.  if( rc ){.
1b0e0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1b0f0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
1b100 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20 20   objc>=5 ){.    
1b110 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20 20 20  if( zTail ){.   
1b120 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 6f 62 6a 6c     objlen = objl
1b130 65 6e 20 2d 20 28 28 75 38 20 2a 29 7a 54 61 69  en - ((u8 *)zTai
1b140 6c 2d 28 75 38 20 2a 29 7a 53 71 6c 29 3b 0a 20  l-(u8 *)zSql);. 
1b150 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b160 6f 62 6a 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20  objlen = 0;.    
1b170 7d 0a 20 20 20 20 70 54 61 69 6c 20 3d 20 54 63  }.    pTail = Tc
1b180 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
1b190 6a 28 28 75 38 20 2a 29 7a 54 61 69 6c 2c 20 6f  j((u8 *)zTail, o
1b1a0 62 6a 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f  bjlen);.    Tcl_
1b1b0 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 54 61  IncrRefCount(pTa
1b1c0 69 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  il);.    Tcl_Obj
1b1d0 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
1b1e0 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 70 54 61 69  objv[4], 0, pTai
1b1f0 6c 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 44  l, 0);.    Tcl_D
1b200 65 63 72 52 65 66 43 6f 75 6e 74 28 70 54 61 69  ecrRefCount(pTai
1b210 6c 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  l);.  }..  if( p
1b220 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20  Stmt ){.    if( 
1b230 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50  sqlite3TestMakeP
1b240 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70  ointerStr(interp
1b250 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29  , zBuf, pStmt) )
1b260 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1b270 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70  R;.  }.  Tcl_App
1b280 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1b290 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 23 65 6e 64  , zBuf, 0);.#end
1b2a0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1b2b0 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74  T_UTF16 */.  ret
1b2c0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1b2d0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1b2e0 74 65 33 5f 6f 70 65 6e 20 66 69 6c 65 6e 61 6d  te3_open filenam
1b2f0 65 20 3f 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 3f  e ?options-list?
1b300 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1b310 65 73 74 5f 6f 70 65 6e 28 0a 20 20 76 6f 69 64  est_open(.  void
1b320 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1b330 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1b340 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1b350 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1b360 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f  T objv[].){.  co
1b370 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1b380 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ame;.  sqlite3 *
1b390 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
1b3a0 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a  char zBuf[100];.
1b3b0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26  .  if( objc!=3 &
1b3c0 26 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a  & objc!=2 && obj
1b3d0 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=1 ){.    Tcl_
1b3e0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1b3f0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1b400 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1b410 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
1b420 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
1b430 29 2c 20 22 20 66 69 6c 65 6e 61 6d 65 20 6f 70  ), " filename op
1b440 74 69 6f 6e 73 2d 6c 69 73 74 22 2c 20 30 29 3b  tions-list", 0);
1b450 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1b460 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46  ERROR;.  }..  zF
1b470 69 6c 65 6e 61 6d 65 20 3d 20 6f 62 6a 63 3e 31  ilename = objc>1
1b480 20 3f 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   ? Tcl_GetString
1b490 28 6f 62 6a 76 5b 31 5d 29 20 3a 20 30 3b 0a 20  (objv[1]) : 0;. 
1b4a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70   rc = sqlite3_op
1b4b0 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 64  en(zFilename, &d
1b4c0 62 29 3b 0a 20 20 0a 20 20 69 66 28 20 73 71 6c  b);.  .  if( sql
1b4d0 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e  ite3TestMakePoin
1b4e0 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a  terStr(interp, z
1b4f0 42 75 66 2c 20 64 62 29 20 29 20 72 65 74 75 72  Buf, db) ) retur
1b500 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
1b510 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1b520 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
1b530 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1b540 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1b550 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  e: sqlite3_open_
1b560 76 32 20 46 49 4c 45 4e 41 4d 45 20 46 4c 41 47  v2 FILENAME FLAG
1b570 53 20 56 46 53 0a 2a 2f 0a 73 74 61 74 69 63 20  S VFS.*/.static 
1b580 69 6e 74 20 74 65 73 74 5f 6f 70 65 6e 5f 76 32  int test_open_v2
1b590 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1b5a0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1b5b0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1b5c0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1b5d0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1b5e0 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
1b5f0 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 63   *zFilename;.  c
1b600 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 3b  onst char *zVfs;
1b610 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 30  .  int flags = 0
1b620 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
1b630 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
1b640 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20  r zBuf[100];..  
1b650 69 6e 74 20 6e 46 6c 61 67 3b 0a 20 20 54 63 6c  int nFlag;.  Tcl
1b660 5f 4f 62 6a 20 2a 2a 61 70 46 6c 61 67 3b 0a 20  _Obj **apFlag;. 
1b670 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 6f   int i;..  if( o
1b680 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
1b690 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
1b6a0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
1b6b0 22 46 49 4c 45 4e 41 4d 45 20 46 4c 41 47 53 20  "FILENAME FLAGS 
1b6c0 56 46 53 22 29 3b 0a 20 20 20 20 72 65 74 75 72  VFS");.    retur
1b6d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1b6e0 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 54  .  zFilename = T
1b6f0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1b700 76 5b 31 5d 29 3b 0a 20 20 7a 56 66 73 20 3d 20  v[1]);.  zVfs = 
1b710 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1b720 6a 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20 7a 56  jv[3]);.  if( zV
1b730 66 73 5b 30 5d 3d 3d 30 78 30 30 20 29 20 7a 56  fs[0]==0x00 ) zV
1b740 66 73 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20  fs = 0;..  rc = 
1b750 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c  Tcl_ListObjGetEl
1b760 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f  ements(interp, o
1b770 62 6a 76 5b 32 5d 2c 20 26 6e 46 6c 61 67 2c 20  bjv[2], &nFlag, 
1b780 26 61 70 46 6c 61 67 29 3b 0a 20 20 69 66 28 20  &apFlag);.  if( 
1b790 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72 65 74  rc!=TCL_OK ) ret
1b7a0 75 72 6e 20 72 63 3b 0a 20 20 66 6f 72 28 69 3d  urn rc;.  for(i=
1b7b0 30 3b 20 69 3c 6e 46 6c 61 67 3b 20 69 2b 2b 29  0; i<nFlag; i++)
1b7c0 7b 0a 20 20 20 20 69 6e 74 20 69 46 6c 61 67 3b  {.    int iFlag;
1b7d0 0a 20 20 20 20 73 74 72 75 63 74 20 4f 70 65 6e  .    struct Open
1b7e0 46 6c 61 67 20 7b 0a 20 20 20 20 20 20 63 6f 6e  Flag {.      con
1b7f0 73 74 20 63 68 61 72 20 2a 7a 46 6c 61 67 3b 0a  st char *zFlag;.
1b800 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 3b 0a        int flag;.
1b810 20 20 20 20 7d 20 61 46 6c 61 67 5b 5d 20 3d 20      } aFlag[] = 
1b820 7b 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  {.      { "SQLIT
1b830 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 22  E_OPEN_READONLY"
1b840 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  , SQLITE_OPEN_RE
1b850 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20 20 20  ADONLY },.      
1b860 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  { "SQLITE_OPEN_R
1b870 45 41 44 57 52 49 54 45 22 2c 20 53 51 4c 49 54  EADWRITE", SQLIT
1b880 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
1b890 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1b8a0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 22  ITE_OPEN_CREATE"
1b8b0 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  , SQLITE_OPEN_CR
1b8c0 45 41 54 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20  EATE },.      { 
1b8d0 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c  "SQLITE_OPEN_DEL
1b8e0 45 54 45 4f 4e 43 4c 4f 53 45 22 2c 20 53 51 4c  ETEONCLOSE", SQL
1b8f0 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
1b900 4e 43 4c 4f 53 45 20 7d 2c 0a 20 20 20 20 20 20  NCLOSE },.      
1b910 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45  { "SQLITE_OPEN_E
1b920 58 43 4c 55 53 49 56 45 22 2c 20 53 51 4c 49 54  XCLUSIVE", SQLIT
1b930 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
1b940 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1b950 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f  ITE_OPEN_AUTOPRO
1b960 58 59 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  XY", SQLITE_OPEN
1b970 5f 41 55 54 4f 50 52 4f 58 59 20 7d 2c 0a 20 20  _AUTOPROXY },.  
1b980 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
1b990 45 4e 5f 4d 41 49 4e 5f 44 42 22 2c 20 53 51 4c  EN_MAIN_DB", SQL
1b9a0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
1b9b0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1b9c0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
1b9d0 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  ", SQLITE_OPEN_T
1b9e0 45 4d 50 5f 44 42 20 7d 2c 0a 20 20 20 20 20 20  EMP_DB },.      
1b9f0 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  { "SQLITE_OPEN_T
1ba00 52 41 4e 53 49 45 4e 54 5f 44 42 22 2c 20 53 51  RANSIENT_DB", SQ
1ba10 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49  LITE_OPEN_TRANSI
1ba20 45 4e 54 5f 44 42 20 7d 2c 0a 20 20 20 20 20 20  ENT_DB },.      
1ba30 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  { "SQLITE_OPEN_M
1ba40 41 49 4e 5f 4a 4f 55 52 4e 41 4c 22 2c 20 53 51  AIN_JOURNAL", SQ
1ba50 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
1ba60 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20 20 20 20  OURNAL },.      
1ba70 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  { "SQLITE_OPEN_T
1ba80 45 4d 50 5f 4a 4f 55 52 4e 41 4c 22 2c 20 53 51  EMP_JOURNAL", SQ
1ba90 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
1baa0 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20 20 20 20  OURNAL },.      
1bab0 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  { "SQLITE_OPEN_S
1bac0 55 42 4a 4f 55 52 4e 41 4c 22 2c 20 53 51 4c 49  UBJOURNAL", SQLI
1bad0 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
1bae0 41 4c 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  AL },.      { "S
1baf0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
1bb00 52 5f 4a 4f 55 52 4e 41 4c 22 2c 20 53 51 4c 49  R_JOURNAL", SQLI
1bb10 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
1bb20 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20 20 20 20  OURNAL },.      
1bb30 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e  { "SQLITE_OPEN_N
1bb40 4f 4d 55 54 45 58 22 2c 20 53 51 4c 49 54 45 5f  OMUTEX", SQLITE_
1bb50 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 7d 2c 0a  OPEN_NOMUTEX },.
1bb60 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
1bb70 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 22 2c  OPEN_FULLMUTEX",
1bb80 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c   SQLITE_OPEN_FUL
1bb90 4c 4d 55 54 45 58 20 7d 2c 0a 20 20 20 20 20 20  LMUTEX },.      
1bba0 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  { "SQLITE_OPEN_S
1bbb0 48 41 52 45 44 43 41 43 48 45 22 2c 20 53 51 4c  HAREDCACHE", SQL
1bbc0 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
1bbd0 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20  ACHE },.      { 
1bbe0 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49  "SQLITE_OPEN_PRI
1bbf0 56 41 54 45 43 41 43 48 45 22 2c 20 53 51 4c 49  VATECACHE", SQLI
1bc00 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43  TE_OPEN_PRIVATEC
1bc10 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20  ACHE },.      { 
1bc20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  "SQLITE_OPEN_WAL
1bc30 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  ", SQLITE_OPEN_W
1bc40 41 4c 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  AL },.      { "S
1bc50 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 22 2c  QLITE_OPEN_URI",
1bc60 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49   SQLITE_OPEN_URI
1bc70 20 7d 2c 0a 20 20 20 20 20 20 7b 20 30 2c 20 30   },.      { 0, 0
1bc80 20 7d 0a 20 20 20 20 7d 3b 0a 20 20 20 20 72 63   }.    };.    rc
1bc90 20 3d 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46   = Tcl_GetIndexF
1bca0 72 6f 6d 4f 62 6a 53 74 72 75 63 74 28 69 6e 74  romObjStruct(int
1bcb0 65 72 70 2c 20 61 70 46 6c 61 67 5b 69 5d 2c 20  erp, apFlag[i], 
1bcc0 61 46 6c 61 67 2c 20 73 69 7a 65 6f 66 28 61 46  aFlag, sizeof(aF
1bcd0 6c 61 67 5b 30 5d 29 2c 20 0a 20 20 20 20 20 20  lag[0]), .      
1bce0 20 20 22 66 6c 61 67 22 2c 20 30 2c 20 26 69 46    "flag", 0, &iF
1bcf0 6c 61 67 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  lag.    );.    i
1bd00 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20  f( rc!=TCL_OK ) 
1bd10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 66  return rc;.    f
1bd20 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67 5b 69 46  lags |= aFlag[iF
1bd30 6c 61 67 5d 2e 66 6c 61 67 3b 0a 20 20 7d 0a 0a  lag].flag;.  }..
1bd40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f    rc = sqlite3_o
1bd50 70 65 6e 5f 76 32 28 7a 46 69 6c 65 6e 61 6d 65  pen_v2(zFilename
1bd60 2c 20 26 64 62 2c 20 66 6c 61 67 73 2c 20 7a 56  , &db, flags, zV
1bd70 66 73 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  fs);.  if( sqlit
1bd80 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65  e3TestMakePointe
1bd90 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75  rStr(interp, zBu
1bda0 66 2c 20 64 62 29 20 29 20 72 65 74 75 72 6e 20  f, db) ) return 
1bdb0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c  TCL_ERROR;.  Tcl
1bdc0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1bdd0 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
1bde0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1bdf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1be00 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 20   sqlite3_open16 
1be10 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e 73  filename options
1be20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1be30 65 73 74 5f 6f 70 65 6e 31 36 28 0a 20 20 76 6f  est_open16(.  vo
1be40 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1be50 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1be60 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1be70 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1be80 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69  NST objv[].){.#i
1be90 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1bea0 54 5f 55 54 46 31 36 0a 20 20 63 6f 6e 73 74 20  T_UTF16.  const 
1beb0 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  void *zFilename;
1bec0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
1bed0 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
1bee0 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69   zBuf[100];..  i
1bef0 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
1bf00 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1bf10 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1bf20 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1bf30 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
1bf40 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1bf50 62 6a 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65 6e  bjv[0]), " filen
1bf60 61 6d 65 20 6f 70 74 69 6f 6e 73 2d 6c 69 73 74  ame options-list
1bf70 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1bf80 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1bf90 0a 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  ..  zFilename = 
1bfa0 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
1bfb0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
1bfc0 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   0);.  rc = sqli
1bfd0 74 65 33 5f 6f 70 65 6e 31 36 28 7a 46 69 6c 65  te3_open16(zFile
1bfe0 6e 61 6d 65 2c 20 26 64 62 29 3b 0a 20 20 0a 20  name, &db);.  . 
1bff0 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
1c000 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69  MakePointerStr(i
1c010 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 64 62 29  nterp, zBuf, db)
1c020 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1c030 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  ROR;.  Tcl_Appen
1c040 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1c050 7a 42 75 66 2c 20 30 29 3b 0a 23 65 6e 64 69 66  zBuf, 0);.#endif
1c060 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1c070 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72  UTF16 */.  retur
1c080 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1c090 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1c0a0 33 5f 63 6f 6d 70 6c 65 74 65 31 36 20 3c 55 54  3_complete16 <UT
1c0b0 46 2d 31 36 20 73 74 72 69 6e 67 3e 0a 2a 2a 0a  F-16 string>.**.
1c0c0 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  ** Return 1 if t
1c0d0 68 65 20 73 75 70 70 6c 69 65 64 20 61 72 67 75  he supplied argu
1c0e0 6d 65 6e 74 20 69 73 20 61 20 63 6f 6d 70 6c 65  ment is a comple
1c0f0 74 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  te SQL statement
1c100 2c 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20 6f 74 68  , or zero.** oth
1c110 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
1c120 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6d 70 6c  c int test_compl
1c130 65 74 65 31 36 28 0a 20 20 76 6f 69 64 20 2a 20  ete16(.  void * 
1c140 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1c150 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1c160 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1c170 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1c180 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 20 21 64 65  bjv[].){.#if !de
1c190 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1c1a0 54 5f 43 4f 4d 50 4c 45 54 45 29 20 26 26 20 21  T_COMPLETE) && !
1c1b0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1c1c0 4d 49 54 5f 55 54 46 31 36 29 0a 20 20 63 68 61  MIT_UTF16).  cha
1c1d0 72 20 2a 7a 42 75 66 3b 0a 0a 20 20 69 66 28 20  r *zBuf;..  if( 
1c1e0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1c1f0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
1c200 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
1c210 20 22 3c 75 74 66 2d 31 36 20 73 71 6c 3e 22 29   "<utf-16 sql>")
1c220 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1c230 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a  _ERROR;.  }..  z
1c240 42 75 66 20 3d 20 28 63 68 61 72 2a 29 54 63 6c  Buf = (char*)Tcl
1c250 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
1c260 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29  mObj(objv[1], 0)
1c270 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
1c280 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
1c290 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
1c2a0 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 28 7a 42  e3_complete16(zB
1c2b0 75 66 29 29 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  uf)));.#endif /*
1c2c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
1c2d0 50 4c 45 54 45 20 26 26 20 53 51 4c 49 54 45 5f  PLETE && SQLITE_
1c2e0 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20  OMIT_UTF16 */.  
1c2f0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1c300 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1c310 71 6c 69 74 65 33 5f 73 74 65 70 20 53 54 4d 54  qlite3_step STMT
1c320 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  .**.** Advance t
1c330 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  he statement to 
1c340 74 68 65 20 6e 65 78 74 20 72 6f 77 2e 0a 2a 2f  the next row..*/
1c350 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1c360 5f 73 74 65 70 28 0a 20 20 76 6f 69 64 20 2a 20  _step(.  void * 
1c370 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1c380 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1c390 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1c3a0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1c3b0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
1c3c0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
1c3d0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
1c3e0 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
1c3f0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1c400 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1c410 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1c420 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
1c430 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1c440 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 22 2c 20  v[0]), " STMT", 
1c450 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1c460 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1c470 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
1c480 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
1c490 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1c4a0 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
1c4b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1c4c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
1c4d0 74 65 70 28 70 53 74 6d 74 29 3b 0a 0a 20 20 2f  tep(pStmt);..  /
1c4e0 2a 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45  * if( rc!=SQLITE
1c4f0 5f 44 4f 4e 45 20 26 26 20 72 63 21 3d 53 51 4c  _DONE && rc!=SQL
1c500 49 54 45 5f 52 4f 57 20 29 20 72 65 74 75 72 6e  ITE_ROW ) return
1c510 20 54 43 4c 5f 45 52 52 4f 52 3b 20 2a 2f 0a 20   TCL_ERROR; */. 
1c520 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
1c530 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
1c540 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
1c550 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
1c560 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  _OK;.}..static i
1c570 6e 74 20 74 65 73 74 5f 73 71 6c 28 0a 20 20 76  nt test_sql(.  v
1c580 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1c590 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1c5a0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1c5b0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1c5c0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1c5d0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1c5e0 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  Stmt;..  if( obj
1c5f0 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1c600 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
1c610 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
1c620 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72  TMT");.    retur
1c630 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1c640 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
1c650 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
1c660 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1c670 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
1c680 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1c690 52 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  R;.  Tcl_SetResu
1c6a0 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
1c6b0 20 2a 29 73 71 6c 69 74 65 33 5f 73 71 6c 28 70   *)sqlite3_sql(p
1c6c0 53 74 6d 74 29 2c 20 54 43 4c 5f 56 4f 4c 41 54  Stmt), TCL_VOLAT
1c6d0 49 4c 45 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ILE);.  return T
1c6e0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1c6f0 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
1c700 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 53 54 4d 54  olumn_count STMT
1c710 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74   .**.** Return t
1c720 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
1c730 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79  umns returned by
1c740 20 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d 65   the sql stateme
1c750 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74  nt STMT..*/.stat
1c760 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75  ic int test_colu
1c770 6d 6e 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64  mn_count(.  void
1c780 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1c790 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1c7a0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1c7b0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1c7c0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
1c7d0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1c7e0 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  t;..  if( objc!=
1c7f0 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
1c800 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1c810 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1c820 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1c830 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
1c840 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
1c850 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20  " STMT column", 
1c860 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1c870 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1c880 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
1c890 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
1c8a0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1c8b0 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
1c8c0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1c8d0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
1c8e0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
1c8f0 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65  NewIntObj(sqlite
1c900 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
1c910 53 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72  Stmt)));.  retur
1c920 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1c930 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1c940 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 53 54  3_column_type ST
1c950 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
1c960 52 65 74 75 72 6e 20 74 68 65 20 74 79 70 65 20  Return the type 
1c970 6f 66 20 74 68 65 20 64 61 74 61 20 69 6e 20 63  of the data in c
1c980 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f  olumn 'column' o
1c990 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  f the current ro
1c9a0 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  w..*/.static int
1c9b0 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79 70   test_column_typ
1c9c0 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
1c9d0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1c9e0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1c9f0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1ca00 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1ca10 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
1ca20 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
1ca30 74 20 63 6f 6c 3b 0a 20 20 69 6e 74 20 74 70 3b  t col;.  int tp;
1ca40 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
1ca50 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1ca60 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1ca70 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1ca80 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
1ca90 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
1caa0 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
1cab0 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29  STMT column", 0)
1cac0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1cad0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
1cae0 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
1caf0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1cb00 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1cb10 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
1cb20 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1cb30 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
1cb40 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
1cb50 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72  jv[2], &col) ) r
1cb60 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1cb70 0a 0a 20 20 74 70 20 3d 20 73 71 6c 69 74 65 33  ..  tp = sqlite3
1cb80 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74  _column_type(pSt
1cb90 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 73 77 69 74  mt, col);.  swit
1cba0 63 68 28 20 74 70 20 29 7b 0a 20 20 20 20 63 61  ch( tp ){.    ca
1cbb0 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  se SQLITE_INTEGE
1cbc0 52 3a 20 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  R: .      Tcl_Se
1cbd0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
1cbe0 22 49 4e 54 45 47 45 52 22 2c 20 54 43 4c 5f 53  "INTEGER", TCL_S
1cbf0 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62  TATIC); .      b
1cc00 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
1cc10 51 4c 49 54 45 5f 4e 55 4c 4c 3a 0a 20 20 20 20  QLITE_NULL:.    
1cc20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
1cc30 69 6e 74 65 72 70 2c 20 22 4e 55 4c 4c 22 2c 20  interp, "NULL", 
1cc40 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20  TCL_STATIC); .  
1cc50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1cc60 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54  ase SQLITE_FLOAT
1cc70 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52  :.      Tcl_SetR
1cc80 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 46  esult(interp, "F
1cc90 4c 4f 41 54 22 2c 20 54 43 4c 5f 53 54 41 54 49  LOAT", TCL_STATI
1cca0 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b  C); .      break
1ccb0 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1ccc0 45 5f 54 45 58 54 3a 0a 20 20 20 20 20 20 54 63  E_TEXT:.      Tc
1ccd0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
1cce0 72 70 2c 20 22 54 45 58 54 22 2c 20 54 43 4c 5f  rp, "TEXT", TCL_
1ccf0 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20  STATIC); .      
1cd00 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1cd10 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 0a 20 20 20  SQLITE_BLOB:.   
1cd20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
1cd30 28 69 6e 74 65 72 70 2c 20 22 42 4c 4f 42 22 2c  (interp, "BLOB",
1cd40 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20   TCL_STATIC); . 
1cd50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1cd60 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61  default:.      a
1cd70 73 73 65 72 74 28 30 29 3b 0a 20 20 7d 0a 0a 20  ssert(0);.  }.. 
1cd80 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1cd90 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1cda0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
1cdb0 6e 74 36 34 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  nt64 STMT column
1cdc0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
1cdd0 65 20 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d 6e  e data in column
1cde0 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68 65   'column' of the
1cdf0 20 63 75 72 72 65 6e 74 20 72 6f 77 20 63 61 73   current row cas
1ce00 74 20 61 73 20 61 6e 0a 2a 2a 20 77 69 64 65 20  t as an.** wide 
1ce10 28 36 34 2d 62 69 74 29 20 69 6e 74 65 67 65 72  (64-bit) integer
1ce20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ce30 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  test_column_int6
1ce40 34 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  4(.  void * clie
1ce50 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1ce60 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1ce70 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1ce80 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1ce90 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
1cea0 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
1ceb0 74 20 63 6f 6c 3b 0a 20 20 69 36 34 20 69 56 61  t col;.  i64 iVa
1cec0 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  l;..  if( objc!=
1ced0 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
1cee0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1cef0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1cf00 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1cf10 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
1cf20 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
1cf30 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20  " STMT column", 
1cf40 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1cf50 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1cf60 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
1cf70 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
1cf80 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1cf90 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
1cfa0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1cfb0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1cfc0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1cfd0 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29  objv[2], &col) )
1cfe0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1cff0 52 3b 0a 0a 20 20 69 56 61 6c 20 3d 20 73 71 6c  R;..  iVal = sql
1d000 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
1d010 34 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20  4(pStmt, col);. 
1d020 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
1d030 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
1d040 77 57 69 64 65 49 6e 74 4f 62 6a 28 69 56 61 6c  wWideIntObj(iVal
1d050 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
1d060 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1d070 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
1d080 75 6d 6e 5f 62 6c 6f 62 20 53 54 4d 54 20 63 6f  umn_blob STMT co
1d090 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lumn.*/.static i
1d0a0 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 62  nt test_column_b
1d0b0 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  lob(.  void * cl
1d0c0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1d0d0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1d0e0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1d0f0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1d100 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
1d110 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
1d120 69 6e 74 20 63 6f 6c 3b 0a 0a 20 20 69 6e 74 20  int col;..  int 
1d130 6c 65 6e 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  len;.  const voi
1d140 64 20 2a 70 42 6c 6f 62 3b 0a 0a 20 20 69 66 28  d *pBlob;..  if(
1d150 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
1d160 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1d170 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1d180 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1d190 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
1d1a0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1d1b0 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f  v[0]), " STMT co
1d1c0 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72  lumn", 0);.    r
1d1d0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1d1e0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
1d1f0 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
1d200 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1d210 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
1d220 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
1d230 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
1d240 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
1d250 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
1d260 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &col) ) return T
1d270 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 6c 65 6e  CL_ERROR;..  len
1d280 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
1d290 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 63  n_bytes(pStmt, c
1d2a0 6f 6c 29 3b 0a 20 20 70 42 6c 6f 62 20 3d 20 73  ol);.  pBlob = s
1d2b0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
1d2c0 6f 62 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a  ob(pStmt, col);.
1d2d0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
1d2e0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
1d2f0 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 70  ewByteArrayObj(p
1d300 42 6c 6f 62 2c 20 6c 65 6e 29 29 3b 0a 20 20 72  Blob, len));.  r
1d310 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1d320 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1d330 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75  lite3_column_dou
1d340 62 6c 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a  ble STMT column.
1d350 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
1d360 20 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20   data in column 
1d370 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20  'column' of the 
1d380 63 75 72 72 65 6e 74 20 72 6f 77 20 63 61 73 74  current row cast
1d390 20 61 73 20 61 20 64 6f 75 62 6c 65 2e 0a 2a 2f   as a double..*/
1d3a0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1d3b0 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 0a  _column_double(.
1d3c0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1d3d0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1d3e0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1d3f0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1d400 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1d410 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
1d420 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63   *pStmt;.  int c
1d430 6f 6c 3b 0a 20 20 64 6f 75 62 6c 65 20 72 56 61  ol;.  double rVa
1d440 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  l;..  if( objc!=
1d450 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
1d460 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1d470 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1d480 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1d490 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
1d4a0 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
1d4b0 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20  " STMT column", 
1d4c0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1d4d0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1d4e0 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
1d4f0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
1d500 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1d510 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
1d520 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1d530 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1d540 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1d550 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29  objv[2], &col) )
1d560 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1d570 52 3b 0a 0a 20 20 72 56 61 6c 20 3d 20 73 71 6c  R;..  rVal = sql
1d580 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62  ite3_column_doub
1d590 6c 65 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a  le(pStmt, col);.
1d5a0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
1d5b0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
1d5c0 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 56 61 6c  ewDoubleObj(rVal
1d5d0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
1d5e0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1d5f0 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 64 61 74  age: sqlite3_dat
1d600 61 5f 63 6f 75 6e 74 20 53 54 4d 54 20 0a 2a 2a  a_count STMT .**
1d610 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
1d620 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
1d630 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
1d640 20 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 20 53   sql statement S
1d650 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  TMT..*/.static i
1d660 6e 74 20 74 65 73 74 5f 64 61 74 61 5f 63 6f 75  nt test_data_cou
1d670 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  nt(.  void * cli
1d680 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1d690 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1d6a0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1d6b0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1d6c0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
1d6d0 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20  stmt *pStmt;..  
1d6e0 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
1d6f0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1d700 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1d710 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1d720 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
1d730 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
1d740 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54  objv[0]), " STMT
1d750 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20   column", 0);.  
1d760 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1d770 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
1d780 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
1d790 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1d7a0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
1d7b0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
1d7c0 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c  CL_ERROR;..  Tcl
1d7d0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
1d7e0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
1d7f0 4f 62 6a 28 73 71 6c 69 74 65 33 5f 64 61 74 61  Obj(sqlite3_data
1d800 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 29 29 3b  _count(pStmt)));
1d810 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1d820 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1d830 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
1d840 5f 74 65 78 74 20 53 54 4d 54 20 63 6f 6c 75 6d  _text STMT colum
1d850 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  n.**.** Usage: s
1d860 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65  qlite3_column_de
1d870 63 6c 74 79 70 65 20 53 54 4d 54 20 63 6f 6c 75  cltype STMT colu
1d880 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  mn.**.** Usage: 
1d890 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
1d8a0 61 6d 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a  ame STMT column.
1d8b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1d8c0 73 74 5f 73 74 6d 74 5f 75 74 66 38 28 0a 20 20  st_stmt_utf8(.  
1d8d0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1d8e0 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  a,        /* Poi
1d8f0 6e 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20 41  nter to SQLite A
1d900 50 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62  PI function to b
1d910 65 20 69 6e 76 6f 6b 65 20 2a 2f 0a 20 20 54 63  e invoke */.  Tc
1d920 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1d930 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1d940 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1d950 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
1d960 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
1d970 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 63 6f 6e    int col;.  con
1d980 73 74 20 63 68 61 72 20 2a 28 2a 78 46 75 6e 63  st char *(*xFunc
1d990 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c  )(sqlite3_stmt*,
1d9a0 20 69 6e 74 29 3b 0a 20 20 63 6f 6e 73 74 20 63   int);.  const c
1d9b0 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 78 46  har *zRet;..  xF
1d9c0 75 6e 63 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  unc = (const cha
1d9d0 72 20 2a 28 2a 29 28 73 71 6c 69 74 65 33 5f 73  r *(*)(sqlite3_s
1d9e0 74 6d 74 2a 2c 20 69 6e 74 29 29 63 6c 69 65 6e  tmt*, int))clien
1d9f0 74 44 61 74 61 3b 0a 20 20 69 66 28 20 6f 62 6a  tData;.  if( obj
1da00 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
1da10 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1da20 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1da30 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1da40 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
1da50 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
1da60 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  ), " STMT column
1da70 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1da80 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1da90 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
1daa0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
1dab0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1dac0 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
1dad0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1dae0 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
1daf0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
1db00 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c  p, objv[2], &col
1db10 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1db20 52 52 4f 52 3b 0a 20 20 7a 52 65 74 20 3d 20 78  RROR;.  zRet = x
1db30 46 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29  Func(pStmt, col)
1db40 3b 0a 20 20 69 66 28 20 7a 52 65 74 20 29 7b 0a  ;.  if( zRet ){.
1db50 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
1db60 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
1db70 2a 29 7a 52 65 74 2c 20 30 29 3b 0a 20 20 7d 0a  *)zRet, 0);.  }.
1db80 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1db90 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .}..static int t
1dba0 65 73 74 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76  est_global_recov
1dbb0 65 72 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  er(.  void * cli
1dbc0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1dbd0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1dbe0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1dbf0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1dc00 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  [].){.#ifndef SQ
1dc10 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
1dc20 41 54 45 44 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ATED.  int rc;. 
1dc30 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a   if( objc!=1 ){.
1dc40 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
1dc50 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
1dc60 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 72  objv, "");.    r
1dc70 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1dc80 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
1dc90 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76  te3_global_recov
1dca0 65 72 28 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52  er();.  Tcl_SetR
1dcb0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
1dcc0 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
1dcd0 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
1dce0 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  C);.#endif.  ret
1dcf0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
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 74 65 78 74 20  te3_column_text 
1dd20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a  STMT column.**.*
1dd30 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1dd40 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65  _column_decltype
1dd50 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a   STMT column.**.
1dd60 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1dd70 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 53 54  3_column_name ST
1dd80 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61  MT column.*/.sta
1dd90 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d  tic int test_stm
1dda0 74 5f 75 74 66 31 36 28 0a 20 20 76 6f 69 64 20  t_utf16(.  void 
1ddb0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 20 20  * clientData,   
1ddc0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1ddd0 53 51 4c 69 74 65 20 41 50 49 20 66 75 6e 63 74  SQLite API funct
1dde0 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ion to be invoke
1ddf0 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  d */.  Tcl_Inter
1de00 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1de10 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1de20 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1de30 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
1de40 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71  _OMIT_UTF16.  sq
1de50 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1de60 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20  t;.  int col;.  
1de70 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 20  Tcl_Obj *pRet;. 
1de80 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61   const void *zNa
1de90 6d 65 31 36 3b 0a 20 20 63 6f 6e 73 74 20 76 6f  me16;.  const vo
1dea0 69 64 20 2a 28 2a 78 46 75 6e 63 29 28 73 71 6c  id *(*xFunc)(sql
1deb0 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29  ite3_stmt*, int)
1dec0 3b 0a 0a 20 20 78 46 75 6e 63 20 3d 20 28 63 6f  ;..  xFunc = (co
1ded0 6e 73 74 20 76 6f 69 64 20 2a 28 2a 29 28 73 71  nst void *(*)(sq
1dee0 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74  lite3_stmt*, int
1def0 29 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20  ))clientData;.  
1df00 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
1df10 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1df20 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1df30 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1df40 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
1df50 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
1df60 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54  objv[0]), " STMT
1df70 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20   column", 0);.  
1df80 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1df90 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
1dfa0 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
1dfb0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1dfc0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
1dfd0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
1dfe0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
1dff0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
1e000 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
1e010 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72  ], &col) ) retur
1e020 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
1e030 7a 4e 61 6d 65 31 36 20 3d 20 78 46 75 6e 63 28  zName16 = xFunc(
1e040 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 69  pStmt, col);.  i
1e050 66 28 20 7a 4e 61 6d 65 31 36 20 29 7b 0a 20 20  f( zName16 ){.  
1e060 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 63 6f 6e    int n;.    con
1e070 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 7a 4e 61  st char *z = zNa
1e080 6d 65 31 36 3b 0a 20 20 20 20 66 6f 72 28 6e 3d  me16;.    for(n=
1e090 30 3b 20 7a 5b 6e 5d 20 7c 7c 20 7a 5b 6e 2b 31  0; z[n] || z[n+1
1e0a0 5d 3b 20 6e 2b 3d 32 29 7b 7d 0a 20 20 20 20 70  ]; n+=2){}.    p
1e0b0 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74  Ret = Tcl_NewByt
1e0c0 65 41 72 72 61 79 4f 62 6a 28 7a 4e 61 6d 65 31  eArrayObj(zName1
1e0d0 36 2c 20 6e 2b 32 29 3b 0a 20 20 20 20 54 63 6c  6, n+2);.    Tcl
1e0e0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
1e0f0 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 7d  terp, pRet);.  }
1e100 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1e110 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
1e120 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1e130 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1e140 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
1e150 5f 69 6e 74 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  _int STMT column
1e160 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  .**.** Usage: sq
1e170 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
1e180 65 73 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  es STMT column.*
1e190 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1e1a0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
1e1b0 31 36 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  16 STMT column.*
1e1c0 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  *.*/.static int 
1e1d0 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 28 0a 20  test_stmt_int(. 
1e1e0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1e1f0 74 61 2c 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ta,    /* Pointe
1e200 72 20 74 6f 20 53 51 4c 69 74 65 20 41 50 49 20  r to SQLite API 
1e210 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69  function to be i
1e220 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  nvoked */.  Tcl_
1e230 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1e240 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1e250 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1e260 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
1e270 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
1e280 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 6e 74 20 28  int col;.  int (
1e290 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  *xFunc)(sqlite3_
1e2a0 73 74 6d 74 2a 2c 20 69 6e 74 29 3b 0a 0a 20 20  stmt*, int);..  
1e2b0 78 46 75 6e 63 20 3d 20 28 69 6e 74 20 28 2a 29  xFunc = (int (*)
1e2c0 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20  (sqlite3_stmt*, 
1e2d0 69 6e 74 29 29 63 6c 69 65 6e 74 44 61 74 61 3b  int))clientData;
1e2e0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
1e2f0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1e300 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1e310 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1e320 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
1e330 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
1e340 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53  ng(objv[0]), " S
1e350 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b  TMT column", 0);
1e360 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1e370 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
1e380 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
1e390 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1e3a0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1e3b0 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
1e3c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
1e3d0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
1e3e0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
1e3f0 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65  v[2], &col) ) re
1e400 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1e410 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
1e420 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
1e430 4e 65 77 49 6e 74 4f 62 6a 28 78 46 75 6e 63 28  NewIntObj(xFunc(
1e440 70 53 74 6d 74 2c 20 63 6f 6c 29 29 29 3b 0a 20  pStmt, col)));. 
1e450 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1e460 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1e470 20 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69   sqlite_set_magi
1e480 63 20 20 44 42 20 20 4d 41 47 49 43 2d 4e 55 4d  c  DB  MAGIC-NUM
1e490 42 45 52 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68  BER.**.** Set th
1e4a0 65 20 64 62 2d 3e 6d 61 67 69 63 20 76 61 6c 75  e db->magic valu
1e4b0 65 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  e.  This is used
1e4c0 20 74 6f 20 74 65 73 74 20 65 72 72 6f 72 20 72   to test error r
1e4d0 65 63 6f 76 65 72 79 20 6c 6f 67 69 63 2e 0a 2a  ecovery logic..*
1e4e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
1e4f0 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 28 0a 20  ite_set_magic(. 
1e500 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1e510 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1e520 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1e530 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61  argc,.  char **a
1e540 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  rgv.){.  sqlite3
1e550 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63   *db;.  if( argc
1e560 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
1e570 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1e580 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1e590 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1e5a0 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
1e5b0 20 20 20 20 22 20 44 42 20 4d 41 47 49 43 22 2c      " DB MAGIC",
1e5c0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1e5d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1e5e0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
1e5f0 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
1e600 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
1e610 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
1e620 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 32 5d  ( strcmp(argv[2]
1e630 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  , "SQLITE_MAGIC_
1e640 4f 50 45 4e 22 29 3d 3d 30 20 29 7b 0a 20 20 20  OPEN")==0 ){.   
1e650 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
1e660 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a  ITE_MAGIC_OPEN;.
1e670 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
1e680 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c  mp(argv[2], "SQL
1e690 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44  ITE_MAGIC_CLOSED
1e6a0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  ")==0 ){.    db-
1e6b0 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
1e6c0 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20  MAGIC_CLOSED;.  
1e6d0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
1e6e0 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54  (argv[2], "SQLIT
1e6f0 45 5f 4d 41 47 49 43 5f 42 55 53 59 22 29 3d 3d  E_MAGIC_BUSY")==
1e700 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67  0 ){.    db->mag
1e710 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
1e720 43 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 20  C_BUSY;.  }else 
1e730 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
1e740 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49  2], "SQLITE_MAGI
1e750 43 5f 45 52 52 4f 52 22 29 3d 3d 30 20 29 7b 0a  C_ERROR")==0 ){.
1e760 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20      db->magic = 
1e770 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52  SQLITE_MAGIC_ERR
1e780 4f 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  OR;.  }else if( 
1e790 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72  Tcl_GetInt(inter
1e7a0 70 2c 20 61 72 67 76 5b 32 5d 2c 20 28 69 6e 74  p, argv[2], (int
1e7b0 2a 29 26 64 62 2d 3e 6d 61 67 69 63 29 20 29 7b  *)&db->magic) ){
1e7c0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1e7d0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
1e7e0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1e7f0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
1e800 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 20 20  ite3_interrupt  
1e810 44 42 20 0a 2a 2a 0a 2a 2a 20 54 72 69 67 67 65  DB .**.** Trigge
1e820 72 20 61 6e 20 69 6e 74 65 72 72 75 70 74 20 6f  r an interrupt o
1e830 6e 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n DB.*/.static i
1e840 6e 74 20 74 65 73 74 5f 69 6e 74 65 72 72 75 70  nt test_interrup
1e850 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
1e860 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1e870 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1e880 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72  int argc,.  char
1e890 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c   **argv.){.  sql
1e8a0 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
1e8b0 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  argc!=2 ){.    T
1e8c0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1e8d0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1e8e0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1e8f0 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 22   \"", argv[0], "
1e900 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
1e910 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1e920 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
1e930 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
1e940 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
1e950 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1e960 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72  .  sqlite3_inter
1e970 72 75 70 74 28 64 62 29 3b 0a 20 20 72 65 74 75  rupt(db);.  retu
1e980 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74  rn TCL_OK;.}..st
1e990 61 74 69 63 20 75 38 20 2a 73 71 6c 69 74 65 33  atic u8 *sqlite3
1e9a0 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65 20  _stack_baseline 
1e9b0 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c  = 0;../*.** Fill
1e9c0 20 74 68 65 20 73 74 61 63 6b 20 77 69 74 68 20   the stack with 
1e9d0 61 20 6b 6e 6f 77 6e 20 62 69 74 70 61 74 74 65  a known bitpatte
1e9e0 72 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rn..*/.static vo
1e9f0 69 64 20 70 72 65 70 53 74 61 63 6b 28 76 6f 69  id prepStack(voi
1ea00 64 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75  d){.  int i;.  u
1ea10 33 32 20 62 69 67 42 75 66 5b 36 35 35 33 36 5d  32 bigBuf[65536]
1ea20 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
1ea30 69 7a 65 6f 66 28 62 69 67 42 75 66 29 2f 73 69  izeof(bigBuf)/si
1ea40 7a 65 6f 66 28 62 69 67 42 75 66 5b 30 5d 29 3b  zeof(bigBuf[0]);
1ea50 20 69 2b 2b 29 20 62 69 67 42 75 66 5b 69 5d 20   i++) bigBuf[i] 
1ea60 3d 20 30 78 64 65 61 64 62 65 65 66 3b 0a 20 20  = 0xdeadbeef;.  
1ea70 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62 61  sqlite3_stack_ba
1ea80 73 65 6c 69 6e 65 20 3d 20 28 75 38 2a 29 26 62  seline = (u8*)&b
1ea90 69 67 42 75 66 5b 36 35 35 33 36 5d 3b 0a 7d 0a  igBuf[65536];.}.
1eaa0 0a 2f 2a 0a 2a 2a 20 47 65 74 20 74 68 65 20 63  ./*.** Get the c
1eab0 75 72 72 65 6e 74 20 73 74 61 63 6b 20 64 65 70  urrent stack dep
1eac0 74 68 2e 20 20 55 73 65 64 20 66 6f 72 20 64 65  th.  Used for de
1ead0 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
1eae0 0a 75 36 34 20 73 71 6c 69 74 65 33 53 74 61 63  .u64 sqlite3Stac
1eaf0 6b 44 65 70 74 68 28 76 6f 69 64 29 7b 0a 20 20  kDepth(void){.  
1eb00 75 38 20 78 3b 0a 20 20 72 65 74 75 72 6e 20 28  u8 x;.  return (
1eb10 75 36 34 29 28 73 71 6c 69 74 65 33 5f 73 74 61  u64)(sqlite3_sta
1eb20 63 6b 5f 62 61 73 65 6c 69 6e 65 20 2d 20 26 78  ck_baseline - &x
1eb30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  );.}../*.** Usag
1eb40 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 74 61 63  e:  sqlite3_stac
1eb50 6b 5f 75 73 65 64 20 44 42 20 53 51 4c 0a 2a 2a  k_used DB SQL.**
1eb60 0a 2a 2a 20 54 72 79 20 74 6f 20 6d 65 61 73 75  .** Try to measu
1eb70 72 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  re the amount of
1eb80 20 73 74 61 63 6b 20 73 70 61 63 65 20 75 73 65   stack space use
1eb90 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20 73  d by a call to s
1eba0 71 6c 69 74 65 33 5f 65 78 65 63 0a 2a 2f 0a 73  qlite3_exec.*/.s
1ebb0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
1ebc0 74 61 63 6b 5f 75 73 65 64 28 0a 20 20 76 6f 69  tack_used(.  voi
1ebd0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1ebe0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1ebf0 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63  terp,.  int argc
1ec00 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a  ,.  char **argv.
1ec10 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1ec20 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
1ec30 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
1ec40 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1ec50 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1ec60 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1ec70 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
1ec80 0a 20 20 20 20 20 20 20 20 22 20 44 42 20 53 51  .        " DB SQ
1ec90 4c 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  L", 0);.    retu
1eca0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1ecb0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
1ecc0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
1ecd0 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
1ece0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1ecf0 20 70 72 65 70 53 74 61 63 6b 28 29 3b 0a 20 20   prepStack();.  
1ed00 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65 78  (void)sqlite3_ex
1ed10 65 63 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20  ec(db, argv[2], 
1ed20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 66 6f 72 28  0, 0, 0);.  for(
1ed30 69 3d 36 35 35 33 35 3b 20 69 3e 3d 30 20 26 26  i=65535; i>=0 &&
1ed40 20 28 28 75 33 32 2a 29 73 71 6c 69 74 65 33 5f   ((u32*)sqlite3_
1ed50 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65 29 5b  stack_baseline)[
1ed60 2d 69 5d 3d 3d 30 78 64 65 61 64 62 65 65 66 3b  -i]==0xdeadbeef;
1ed70 20 69 2d 2d 29 7b 7d 0a 20 20 54 63 6c 5f 53 65   i--){}.  Tcl_Se
1ed80 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1ed90 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
1eda0 28 69 2a 34 29 29 3b 0a 20 20 72 65 74 75 72 6e  (i*4));.  return
1edb0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1edc0 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 5f  * Usage: sqlite_
1edd0 64 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e 20  delete_function 
1ede0 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65  DB function-name
1edf0 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  .**.** Delete th
1ee00 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20  e user function 
1ee10 27 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 27 20  'function-name' 
1ee20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 68 61  from database ha
1ee30 6e 64 6c 65 20 44 42 2e 20 49 74 0a 2a 2a 20 69  ndle DB. It.** i
1ee40 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
1ee50 68 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e  he user function
1ee60 20 77 61 73 20 63 72 65 61 74 65 64 20 61 73 20   was created as 
1ee70 55 54 46 38 2c 20 61 6e 79 20 6e 75 6d 62 65 72  UTF8, any number
1ee80 20 6f 66 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73   of.** arguments
1ee90 20 28 74 68 65 20 77 61 79 20 74 68 65 20 54 43   (the way the TC
1eea0 4c 20 69 6e 74 65 72 66 61 63 65 20 64 6f 65 73  L interface does
1eeb0 20 69 74 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   it)..*/.static 
1eec0 69 6e 74 20 64 65 6c 65 74 65 5f 66 75 6e 63 74  int delete_funct
1eed0 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ion(.  void * cl
1eee0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1eef0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1ef00 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68    int argc,.  ch
1ef10 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69  ar **argv.){.  i
1ef20 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
1ef30 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63   *db;.  if( argc
1ef40 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
1ef50 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1ef60 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1ef70 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1ef80 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
1ef90 20 20 20 20 22 20 44 42 20 66 75 6e 63 74 69 6f      " DB functio
1efa0 6e 2d 6e 61 6d 65 22 2c 20 30 29 3b 0a 20 20 20  n-name", 0);.   
1efb0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1efc0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
1efd0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
1efe0 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
1eff0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1f000 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
1f010 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
1f020 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20  on(db, argv[2], 
1f030 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
1f040 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
1f050 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
1f060 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
1f070 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
1f080 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65  CL_STATIC);.  re
1f090 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1f0a0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1f0b0 69 74 65 5f 64 65 6c 65 74 65 5f 63 6f 6c 6c 61  ite_delete_colla
1f0c0 74 69 6f 6e 20 44 42 20 63 6f 6c 6c 61 74 69 6f  tion DB collatio
1f0d0 6e 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 44 65 6c  n-name.**.** Del
1f0e0 65 74 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ete the collatio
1f0f0 6e 20 73 65 71 75 65 6e 63 65 20 27 63 6f 6c 6c  n sequence 'coll
1f100 61 74 69 6f 6e 2d 6e 61 6d 65 27 20 66 72 6f 6d  ation-name' from
1f110 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
1f120 20 0a 2a 2a 20 44 42 2e 20 49 74 20 69 73 20 61   .** DB. It is a
1f130 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
1f140 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1f150 63 65 20 77 61 73 20 63 72 65 61 74 65 64 20 61  ce was created a
1f160 73 20 55 54 46 38 20 28 74 68 65 20 0a 2a 2a 20  s UTF8 (the .** 
1f170 77 61 79 20 74 68 65 20 54 43 4c 20 69 6e 74 65  way the TCL inte
1f180 72 66 61 63 65 20 64 6f 65 73 20 69 74 29 2e 0a  rface does it)..
1f190 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
1f1a0 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a  lete_collation(.
1f1b0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1f1c0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1f1d0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1f1e0 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a   argc,.  char **
1f1f0 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63  argv.){.  int rc
1f200 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
1f210 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29  .  if( argc!=3 )
1f220 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1f230 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1f240 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1f250 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
1f260 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22  v[0], .        "
1f270 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d   DB function-nam
1f280 65 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  e", 0);.    retu
1f290 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1f2a0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
1f2b0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
1f2c0 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
1f2d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1f2e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
1f2f0 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64  eate_collation(d
1f300 62 2c 20 61 72 67 76 5b 32 5d 2c 20 53 51 4c 49  b, argv[2], SQLI
1f310 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 29 3b 0a  TE_UTF8, 0, 0);.
1f320 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
1f330 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
1f340 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  t1ErrorName(rc),
1f350 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20   TCL_STATIC);.  
1f360 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1f370 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1f380 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63  qlite3_get_autoc
1f390 6f 6d 6d 69 74 20 44 42 0a 2a 2a 0a 2a 2a 20 52  ommit DB.**.** R
1f3a0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
1f3b0 65 20 64 61 74 61 62 61 73 65 20 44 42 20 69 73  e database DB is
1f3c0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 61 75   currently in au
1f3d0 74 6f 2d 63 6f 6d 6d 69 74 20 6d 6f 64 65 2e 0a  to-commit mode..
1f3e0 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  ** Return false 
1f3f0 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69  if not..*/.stati
1f400 63 20 69 6e 74 20 67 65 74 5f 61 75 74 6f 63 6f  c int get_autoco
1f410 6d 6d 69 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  mmit(.  void * c
1f420 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1f430 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1f440 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63  .  int argc,.  c
1f450 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  har **argv.){.  
1f460 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20  char zBuf[30];. 
1f470 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1f480 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20  if( argc!=2 ){. 
1f490 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1f4a0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1f4b0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1f4c0 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
1f4d0 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44 42  ], .        " DB
1f4e0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1f4f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1f500 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
1f510 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
1f520 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
1f530 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1f540 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25  sprintf(zBuf, "%
1f550 64 22 2c 20 73 71 6c 69 74 65 33 5f 67 65 74 5f  d", sqlite3_get_
1f560 61 75 74 6f 63 6f 6d 6d 69 74 28 64 62 29 29 3b  autocommit(db));
1f570 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
1f580 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
1f590 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
1f5a0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1f5b0 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 62  Usage: sqlite3_b
1f5c0 75 73 79 5f 74 69 6d 65 6f 75 74 20 44 42 20 4d  usy_timeout DB M
1f5d0 53 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  S.**.** Set the 
1f5e0 62 75 73 79 20 74 69 6d 65 6f 75 74 2e 20 20 54  busy timeout.  T
1f5f0 68 69 73 20 69 73 20 6d 6f 72 65 20 65 61 73 69  his is more easi
1f600 6c 79 20 64 6f 6e 65 20 75 73 69 6e 67 20 74 68  ly done using th
1f610 65 20 74 69 6d 65 6f 75 74 0a 2a 2a 20 6d 65 74  e timeout.** met
1f620 68 6f 64 20 6f 66 20 74 68 65 20 54 43 4c 20 69  hod of the TCL i
1f630 6e 74 65 72 66 61 63 65 2e 20 20 42 75 74 20 77  nterface.  But w
1f640 65 20 6e 65 65 64 20 61 20 77 61 79 20 74 6f 20  e need a way to 
1f650 74 65 73 74 20 74 68 65 20 63 61 73 65 0a 2a 2a  test the case.**
1f660 20 77 68 65 72 65 20 69 74 20 72 65 74 75 72 6e   where it return
1f670 73 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e  s SQLITE_MISUSE.
1f680 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1f690 65 73 74 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74  est_busy_timeout
1f6a0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1f6b0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1f6c0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1f6d0 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20  nt argc,.  char 
1f6e0 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20  **argv.){.  int 
1f6f0 72 63 2c 20 6d 73 3b 0a 20 20 73 71 6c 69 74 65  rc, ms;.  sqlite
1f700 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67  3 *db;.  if( arg
1f710 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
1f720 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1f730 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1f740 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1f750 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
1f760 20 20 20 20 20 22 20 44 42 22 2c 20 30 29 3b 0a       " DB", 0);.
1f770 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1f780 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1f790 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1f7a0 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
1f7b0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1f7c0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
1f7d0 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20  _GetInt(interp, 
1f7e0 61 72 67 76 5b 32 5d 2c 20 26 6d 73 29 20 29 20  argv[2], &ms) ) 
1f7f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1f800 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1f810 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 64 62  _busy_timeout(db
1f820 2c 20 6d 73 29 3b 0a 20 20 54 63 6c 5f 41 70 70  , ms);.  Tcl_App
1f830 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1f840 2c 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  , sqlite3TestErr
1f850 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a  orName(rc), 0);.
1f860 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1f870 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1f880 20 20 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74    tcl_variable_t
1f890 79 70 65 20 56 41 52 49 41 42 4c 45 4e 41 4d 45  ype VARIABLENAME
1f8a0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
1f8b0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
1f8c0 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65 6e 74  ternal represent
1f8d0 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a 2a 2a  ation for the.**
1f8e0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 67 69   value of the gi
1f8f0 76 65 6e 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f  ven variable..*/
1f900 0a 73 74 61 74 69 63 20 69 6e 74 20 74 63 6c 5f  .static int tcl_
1f910 76 61 72 69 61 62 6c 65 5f 74 79 70 65 28 0a 20  variable_type(. 
1f920 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1f930 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1f940 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1f950 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1f960 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1f970 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 72  .  Tcl_Obj *pVar
1f980 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ;.  if( objc!=2 
1f990 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
1f9a0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
1f9b0 31 2c 20 6f 62 6a 76 2c 20 22 56 41 52 49 41 42  1, objv, "VARIAB
1f9c0 4c 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  LE");.    return
1f9d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1f9e0 20 20 70 56 61 72 20 3d 20 54 63 6c 5f 47 65 74    pVar = Tcl_Get
1f9f0 56 61 72 32 45 78 28 69 6e 74 65 72 70 2c 20 54  Var2Ex(interp, T
1fa00 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1fa10 76 5b 31 5d 29 2c 20 30 2c 20 54 43 4c 5f 4c 45  v[1]), 0, TCL_LE
1fa20 41 56 45 5f 45 52 52 5f 4d 53 47 29 3b 0a 20 20  AVE_ERR_MSG);.  
1fa30 69 66 28 20 70 56 61 72 3d 3d 30 20 29 20 72 65  if( pVar==0 ) re
1fa40 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1fa50 20 20 69 66 28 20 70 56 61 72 2d 3e 74 79 70 65    if( pVar->type
1fa60 50 74 72 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  Ptr ){.    Tcl_S
1fa70 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1fa80 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
1fa90 67 4f 62 6a 28 70 56 61 72 2d 3e 74 79 70 65 50  gObj(pVar->typeP
1faa0 74 72 2d 3e 6e 61 6d 65 2c 20 2d 31 29 29 3b 0a  tr->name, -1));.
1fab0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
1fac0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1fad0 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 72 65  age:  sqlite3_re
1fae0 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 20 3f 4e 3f  lease_memory ?N?
1faf0 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  .**.** Attempt t
1fb00 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79  o release memory
1fb10 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20   currently held 
1fb20 62 75 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  but not actually
1fb30 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 20 54 68   required..** Th
1fb40 65 20 69 6e 74 65 67 65 72 20 4e 20 69 73 20 74  e integer N is t
1fb50 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1fb60 65 73 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  es we are trying
1fb70 20 74 6f 20 72 65 6c 65 61 73 65 2e 20 20 54 68   to release.  Th
1fb80 65 20 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  e .** return val
1fb90 75 65 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74  ue is the amount
1fba0 20 6f 66 20 6d 65 6d 6f 72 79 20 61 63 74 75 61   of memory actua
1fbb0 6c 6c 79 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2f  lly released..*/
1fbc0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1fbd0 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
1fbe0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1fbf0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1fc00 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1fc10 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1fc20 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1fc30 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ){.#if defined(S
1fc40 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
1fc50 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 29 20  ORY_MANAGEMENT) 
1fc60 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
1fc70 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
1fc80 20 20 69 6e 74 20 4e 3b 0a 20 20 69 6e 74 20 61    int N;.  int a
1fc90 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  mt;.  if( objc!=
1fca0 31 20 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b 0a  1 && objc!=2 ){.
1fcb0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
1fcc0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
1fcd0 6f 62 6a 76 2c 20 22 3f 4e 3f 22 29 3b 0a 20 20  objv, "?N?");.  
1fce0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1fcf0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62  OR;.  }.  if( ob
1fd00 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66 28  jc==2 ){.    if(
1fd10 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1fd20 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
1fd30 31 5d 2c 20 26 4e 29 20 29 20 72 65 74 75 72 6e  1], &N) ) return
1fd40 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65   TCL_ERROR;.  }e
1fd50 6c 73 65 7b 0a 20 20 20 20 4e 20 3d 20 2d 31 3b  lse{.    N = -1;
1fd60 0a 20 20 7d 0a 20 20 61 6d 74 20 3d 20 73 71 6c  .  }.  amt = sql
1fd70 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  ite3_release_mem
1fd80 6f 72 79 28 4e 29 3b 0a 20 20 54 63 6c 5f 53 65  ory(N);.  Tcl_Se
1fd90 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1fda0 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
1fdb0 28 61 6d 74 29 29 3b 0a 23 65 6e 64 69 66 0a 20  (amt));.#endif. 
1fdc0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1fdd0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  }.../*.** Usage:
1fde0 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c    sqlite3_db_rel
1fdf0 65 61 73 65 5f 6d 65 6d 6f 72 79 20 44 42 0a 2a  ease_memory DB.*
1fe00 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
1fe10 72 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79 20 63  release memory c
1fe20 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 62 79  urrently held by
1fe30 20 64 61 74 61 62 61 73 65 20 44 42 2e 20 20 52   database DB.  R
1fe40 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 72 65 73  eturn the.** res
1fe50 75 6c 74 20 63 6f 64 65 20 28 77 68 69 63 68 20  ult code (which 
1fe60 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  in the current i
1fe70 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73  mplementation is
1fe80 20 61 6c 77 61 79 73 20 7a 65 72 6f 29 2e 0a 2a   always zero)..*
1fe90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1fea0 74 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  t_db_release_mem
1feb0 6f 72 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ory(.  void * cl
1fec0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1fed0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1fee0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1fef0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1ff00 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
1ff10 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
1ff20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
1ff30 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
1ff40 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
1ff50 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20   objv, "DB");.  
1ff60 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1ff70 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
1ff80 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
1ff90 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1ffa0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
1ffb0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1ffc0 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
1ffd0 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65  e3_db_release_me
1ffe0 6d 6f 72 79 28 64 62 29 3b 0a 20 20 54 63 6c 5f  mory(db);.  Tcl_
1fff0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
20000 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
20010 62 6a 28 72 63 29 29 3b 0a 20 20 72 65 74 75 72  bj(rc));.  retur
20020 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
20030 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
20040 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 20 44  e3_db_filename D
20050 42 20 44 42 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52  B DBNAME.**.** R
20060 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
20070 66 20 61 20 66 69 6c 65 20 61 73 73 6f 63 69 61  f a file associa
20080 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62  ted with a datab
20090 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
200a0 6e 74 20 74 65 73 74 5f 64 62 5f 66 69 6c 65 6e  nt test_db_filen
200b0 61 6d 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ame(.  void * cl
200c0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
200d0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
200e0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
200f0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
20100 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
20110 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *db;.  const ch
20120 61 72 20 2a 7a 44 62 4e 61 6d 65 3b 0a 20 20 69  ar *zDbName;.  i
20130 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
20140 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
20150 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
20160 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d 45 22 29  jv, "DB DBNAME")
20170 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
20180 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
20190 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
201a0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
201b0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
201c0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
201d0 5f 45 52 52 4f 52 3b 0a 20 20 7a 44 62 4e 61 6d  _ERROR;.  zDbNam
201e0 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
201f0 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 54 63  g(objv[2]);.  Tc
20200 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
20210 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 64  nterp, sqlite3_d
20220 62 5f 66 69 6c 65 6e 61 6d 65 28 64 62 2c 20 7a  b_filename(db, z
20230 44 62 4e 61 6d 65 29 2c 20 28 76 6f 69 64 2a 29  DbName), (void*)
20240 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
20250 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
20260 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 6f  age:  sqlite3_so
20270 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 20 3f 4e  ft_heap_limit ?N
20280 3f 0a 2a 2a 0a 2a 2a 20 51 75 65 72 79 20 6f 72  ?.**.** Query or
20290 20 73 65 74 20 74 68 65 20 73 6f 66 74 20 68 65   set the soft he
202a0 61 70 20 6c 69 6d 69 74 20 66 6f 72 20 74 68 65  ap limit for the
202b0 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 2e   current thread.
202c0 20 20 54 68 65 0a 2a 2a 20 6c 69 6d 69 74 20 69    The.** limit i
202d0 73 20 6f 6e 6c 79 20 63 68 61 6e 67 65 64 20 69  s only changed i
202e0 66 20 74 68 65 20 4e 20 69 73 20 70 72 65 73 65  f the N is prese
202f0 6e 74 2e 20 20 54 68 65 20 70 72 65 76 69 6f 75  nt.  The previou
20300 73 20 6c 69 6d 69 74 0a 2a 2a 20 69 73 20 72 65  s limit.** is re
20310 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
20320 63 20 69 6e 74 20 74 65 73 74 5f 73 6f 66 74 5f  c int test_soft_
20330 68 65 61 70 5f 6c 69 6d 69 74 28 0a 20 20 76 6f  heap_limit(.  vo
20340 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
20350 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
20360 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
20370 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
20380 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
20390 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 61 6d  sqlite3_int64 am
203a0 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  t;.  sqlite3_int
203b0 36 34 20 4e 20 3d 20 2d 31 3b 0a 20 20 69 66 28  64 N = -1;.  if(
203c0 20 6f 62 6a 63 21 3d 31 20 26 26 20 6f 62 6a 63   objc!=1 && objc
203d0 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
203e0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
203f0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 4e  rp, 1, objv, "?N
20400 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ?");.    return 
20410 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
20420 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
20430 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 57      if( Tcl_GetW
20440 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  ideIntFromObj(in
20450 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26  terp, objv[1], &
20460 4e 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  N) ) return TCL_
20470 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 6d 74  ERROR;.  }.  amt
20480 20 3d 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f   = sqlite3_soft_
20490 68 65 61 70 5f 6c 69 6d 69 74 36 34 28 4e 29 3b  heap_limit64(N);
204a0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
204b0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
204c0 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 61 6d  NewWideIntObj(am
204d0 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  t));.  return TC
204e0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
204f0 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
20500 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 0a 2a  thread_cleanup.*
20510 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 73 71  *.** Call the sq
20520 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65  lite3_thread_cle
20530 61 6e 75 70 20 41 50 49 2e 0a 2a 2f 0a 73 74 61  anup API..*/.sta
20540 74 69 63 20 69 6e 74 20 74 65 73 74 5f 74 68 72  tic int test_thr
20550 65 61 64 5f 63 6c 65 61 6e 75 70 28 0a 20 20 76  ead_cleanup(.  v
20560 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
20570 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
20580 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
20590 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
205a0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
205b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
205c0 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20 20  IT_DEPRECATED.  
205d0 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63  sqlite3_thread_c
205e0 6c 65 61 6e 75 70 28 29 3b 0a 23 65 6e 64 69 66  leanup();.#endif
205f0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
20600 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
20610 3a 20 20 20 73 71 6c 69 74 65 33 5f 70 61 67 65  :   sqlite3_page
20620 72 5f 72 65 66 63 6f 75 6e 74 73 20 20 44 42 0a  r_refcounts  DB.
20630 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6c  **.** Return a l
20640 69 73 74 20 6f 66 20 6e 75 6d 62 65 72 73 20 77  ist of numbers w
20650 68 69 63 68 20 61 72 65 20 74 68 65 20 50 61 67  hich are the Pag
20660 65 72 52 65 66 63 6f 75 6e 74 20 66 6f 72 20 61  erRefcount for a
20670 6c 6c 0a 2a 2a 20 70 61 67 65 72 73 20 6f 6e 20  ll.** pagers on 
20680 65 61 63 68 20 64 61 74 61 62 61 73 65 20 63 6f  each database co
20690 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nnection..*/.sta
206a0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 61 67  tic int test_pag
206b0 65 72 5f 72 65 66 63 6f 75 6e 74 73 28 0a 20 20  er_refcounts(.  
206c0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
206d0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
206e0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
206f0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
20700 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
20710 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
20720 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 76 2c   int i;.  int v,
20730 20 2a 61 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a   *a;.  Tcl_Obj *
20740 70 52 65 73 75 6c 74 3b 0a 0a 20 20 69 66 28 20  pResult;..  if( 
20750 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
20760 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
20770 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
20780 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
20790 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
207a0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
207b0 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
207c0 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72  " DB", 0);.    r
207d0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
207e0 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
207f0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
20800 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
20810 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
20820 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
20830 0a 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c  .  pResult = Tcl
20840 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 66 6f 72  _NewObj();.  for
20850 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
20860 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64   i++){.    if( d
20870 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3d 3d 30  b->aDb[i].pBt==0
20880 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 2d 31   ){.      v = -1
20890 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
208a0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
208b0 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
208c0 29 3b 0a 20 20 20 20 20 20 61 20 3d 20 73 71 6c  );.      a = sql
208d0 69 74 65 33 50 61 67 65 72 53 74 61 74 73 28 73  ite3PagerStats(s
208e0 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
208f0 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29  (db->aDb[i].pBt)
20900 29 3b 0a 20 20 20 20 20 20 76 20 3d 20 61 5b 30  );.      v = a[0
20910 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ];.      sqlite3
20920 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
20930 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20  >mutex);.    }. 
20940 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
20950 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
20960 52 65 73 75 6c 74 2c 20 54 63 6c 5f 4e 65 77 49  Result, Tcl_NewI
20970 6e 74 4f 62 6a 28 76 29 29 3b 0a 20 20 7d 0a 20  ntObj(v));.  }. 
20980 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
20990 74 28 69 6e 74 65 72 70 2c 20 70 52 65 73 75 6c  t(interp, pResul
209a0 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  t);.  return TCL
209b0 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74  _OK;.}.../*.** t
209c0 63 6c 63 6d 64 3a 20 20 20 77 6f 72 6b 69 6e 67  clcmd:   working
209d0 5f 36 34 62 69 74 5f 69 6e 74 0a 2a 2a 0a 2a 2a  _64bit_int.**.**
209e0 20 53 6f 6d 65 20 54 43 4c 20 62 75 69 6c 64 73   Some TCL builds
209f0 20 28 65 78 3a 20 63 79 67 77 69 6e 29 20 64 6f   (ex: cygwin) do
20a00 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 36 34 2d   not support 64-
20a10 62 69 74 20 69 6e 74 65 67 65 72 73 2e 20 20 54  bit integers.  T
20a20 68 69 73 0a 2a 2a 20 6c 65 61 64 73 20 74 6f 20  his.** leads to 
20a30 61 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 73 74  a number of test
20a40 20 66 61 69 6c 75 72 65 73 2e 20 20 54 68 65 20   failures.  The 
20a50 70 72 65 73 65 6e 74 20 63 6f 6d 6d 61 6e 64 20  present command 
20a60 63 68 65 63 6b 73 20 74 68 65 0a 2a 2a 20 54 43  checks the.** TC
20a70 4c 20 62 75 69 6c 64 20 74 6f 20 73 65 65 20 77  L build to see w
20a80 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 69 74  hether or not it
20a90 20 73 75 70 70 6f 72 74 73 20 36 34 2d 62 69 74   supports 64-bit
20aa0 20 69 6e 74 65 67 65 72 73 2e 20 20 49 74 0a 2a   integers.  It.*
20ab0 2a 20 72 65 74 75 72 6e 73 20 54 52 55 45 20 69  * returns TRUE i
20ac0 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 46 41  f it does and FA
20ad0 4c 53 45 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a  LSE if not..**.*
20ae0 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69  * This command i
20af0 73 20 75 73 65 64 20 74 6f 20 77 61 72 6e 20 75  s used to warn u
20b00 73 65 72 73 20 74 68 61 74 20 74 68 65 69 72 20  sers that their 
20b10 54 43 4c 20 62 75 69 6c 64 20 69 73 20 64 65 66  TCL build is def
20b20 65 63 74 69 76 65 0a 2a 2a 20 61 6e 64 20 74 68  ective.** and th
20b30 61 74 20 74 68 65 20 65 72 72 6f 72 73 20 74 68  at the errors th
20b40 65 79 20 61 72 65 20 73 65 65 69 6e 67 20 69 6e  ey are seeing in
20b50 20 74 68 65 20 74 65 73 74 20 73 63 72 69 70 74   the test script
20b60 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20  s might be.** a 
20b70 72 65 73 75 6c 74 20 6f 66 20 74 68 65 69 72 20  result of their 
20b80 64 65 66 65 63 74 69 76 65 20 54 43 4c 20 72 61  defective TCL ra
20b90 74 68 65 72 20 74 68 61 6e 20 70 72 6f 62 6c 65  ther than proble
20ba0 6d 73 20 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f  ms in SQLite..*/
20bb0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 6f 72 6b  .static int work
20bc0 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 28 0a 20  ing_64bit_int(. 
20bd0 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
20be0 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
20bf0 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
20c00 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
20c10 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
20c20 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
20c30 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
20c40 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
20c50 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
20c60 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
20c70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
20c80 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
20c90 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
20ca0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
20cb0 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
20cc0 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 4f  ts */.){.  Tcl_O
20cd0 62 6a 20 2a 70 54 65 73 74 4f 62 6a 3b 0a 20 20  bj *pTestObj;.  
20ce0 69 6e 74 20 77 6f 72 6b 69 6e 67 20 3d 20 30 3b  int working = 0;
20cf0 0a 0a 20 20 70 54 65 73 74 4f 62 6a 20 3d 20 54  ..  pTestObj = T
20d00 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
20d10 28 31 30 30 30 30 30 30 2a 28 69 36 34 29 31 32  (1000000*(i64)12
20d20 33 34 35 36 37 38 39 30 29 3b 0a 20 20 77 6f 72  34567890);.  wor
20d30 6b 69 6e 67 20 3d 20 73 74 72 63 6d 70 28 54 63  king = strcmp(Tc
20d40 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 54 65 73  l_GetString(pTes
20d50 74 4f 62 6a 29 2c 20 22 31 32 33 34 35 36 37 38  tObj), "12345678
20d60 39 30 30 30 30 30 30 30 22 29 3d 3d 30 3b 0a 20  90000000")==0;. 
20d70 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
20d80 74 28 70 54 65 73 74 4f 62 6a 29 3b 0a 20 20 54  t(pTestObj);.  T
20d90 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
20da0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
20db0 6f 6f 6c 65 61 6e 4f 62 6a 28 77 6f 72 6b 69 6e  ooleanObj(workin
20dc0 67 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  g));.  return TC
20dd0 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
20de0 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f 75 6e  tclcmd:   vfs_un
20df0 6c 69 6e 6b 5f 74 65 73 74 0a 2a 2a 0a 2a 2a 20  link_test.**.** 
20e00 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  This TCL command
20e10 20 75 6e 72 65 67 69 73 74 65 72 73 20 74 68 65   unregisters the
20e20 20 70 72 69 6d 61 72 79 20 56 46 53 20 61 6e 64   primary VFS and
20e30 20 74 68 65 6e 20 72 65 67 69 73 74 65 72 73 0a   then registers.
20e40 2a 2a 20 69 74 20 62 61 63 6b 20 61 67 61 69 6e  ** it back again
20e50 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
20e60 74 6f 20 74 65 73 74 20 74 68 65 20 61 62 69 6c  to test the abil
20e70 69 74 79 20 74 6f 20 72 65 67 69 73 74 65 72 20  ity to register 
20e80 61 0a 2a 2a 20 56 46 53 20 77 68 65 6e 20 6e 6f  a.** VFS when no
20e90 6e 65 20 61 72 65 20 70 72 65 76 69 6f 75 73 6c  ne are previousl
20ea0 79 20 72 65 67 69 73 74 65 72 65 64 2c 20 61 6e  y registered, an
20eb0 64 20 74 68 65 20 61 62 69 6c 69 74 79 20 74 6f  d the ability to
20ec0 20 0a 2a 2a 20 75 6e 72 65 67 69 73 74 65 72 20   .** unregister 
20ed0 74 68 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62  the only availab
20ee0 6c 65 20 56 46 53 2e 20 20 54 69 63 6b 65 74 20  le VFS.  Ticket 
20ef0 23 32 37 33 38 0a 2a 2f 0a 73 74 61 74 69 63 20  #2738.*/.static 
20f00 69 6e 74 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74  int vfs_unlink_t
20f10 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  est(.  ClientDat
20f20 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
20f30 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
20f40 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
20f50 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
20f60 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
20f70 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
20f80 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
20f90 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
20fa0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
20fb0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
20fc0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
20fd0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
20fe0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
20ff0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
21000 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
21010 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
21020 33 5f 76 66 73 20 2a 70 4d 61 69 6e 3b 0a 20 20  3_vfs *pMain;.  
21030 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 61 70 56  sqlite3_vfs *apV
21040 66 73 5b 32 30 5d 3b 0a 20 20 73 71 6c 69 74 65  fs[20];.  sqlite
21050 33 5f 76 66 73 20 6f 6e 65 2c 20 74 77 6f 3b 0a  3_vfs one, two;.
21060 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75  .  sqlite3_vfs_u
21070 6e 72 65 67 69 73 74 65 72 28 30 29 3b 20 20 20  nregister(0);   
21080 2f 2a 20 55 6e 72 65 67 69 73 74 65 72 20 6f 66  /* Unregister of
21090 20 4e 55 4c 4c 20 69 73 20 68 61 72 6d 6c 65 73   NULL is harmles
210a0 73 20 2a 2f 0a 20 20 6f 6e 65 2e 7a 4e 61 6d 65  s */.  one.zName
210b0 20 3d 20 22 5f 5f 6f 6e 65 22 3b 0a 20 20 74 77   = "__one";.  tw
210c0 6f 2e 7a 4e 61 6d 65 20 3d 20 22 5f 5f 74 77 6f  o.zName = "__two
210d0 22 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c 69 6e 67  ";..  /* Calling
210e0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
210f0 69 73 74 65 72 20 77 69 74 68 20 32 6e 64 20 61  ister with 2nd a
21100 72 67 75 6d 65 6e 74 20 6f 66 20 30 20 64 6f 65  rgument of 0 doe
21110 73 20 6e 6f 74 0a 20 20 2a 2a 20 63 68 61 6e 67  s not.  ** chang
21120 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46  e the default VF
21130 53 0a 20 20 2a 2f 0a 20 20 70 4d 61 69 6e 20 3d  S.  */.  pMain =
21140 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
21150 64 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  d(0);.  sqlite3_
21160 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 6f 6e  vfs_register(&on
21170 65 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  e, 0);.  assert(
21180 20 70 4d 61 69 6e 3d 3d 30 20 7c 7c 20 70 4d 61   pMain==0 || pMa
21190 69 6e 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f  in==sqlite3_vfs_
211a0 66 69 6e 64 28 30 29 20 29 3b 0a 20 20 73 71 6c  find(0) );.  sql
211b0 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
211c0 72 28 26 74 77 6f 2c 20 30 29 3b 0a 20 20 61 73  r(&two, 0);.  as
211d0 73 65 72 74 28 20 70 4d 61 69 6e 3d 3d 30 20 7c  sert( pMain==0 |
211e0 7c 20 70 4d 61 69 6e 3d 3d 73 71 6c 69 74 65 33  | pMain==sqlite3
211f0 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a  _vfs_find(0) );.
21200 0a 20 20 2f 2a 20 57 65 20 63 61 6e 20 66 69 6e  .  /* We can fin
21210 64 20 61 20 56 46 53 20 62 79 20 69 74 73 20 6e  d a VFS by its n
21220 61 6d 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ame */.  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 6f 6e 65 22 29 3d 3d 26 6f 6e 65  d("__one")==&one
21250 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
21260 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22  lite3_vfs_find("
21270 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b  __two")==&two );
21280 0a 0a 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 73  ..  /* Calling s
21290 71 6c 69 74 65 5f 76 66 73 5f 72 65 67 69 73 74  qlite_vfs_regist
212a0 65 72 20 77 69 74 68 20 6e 6f 6e 2d 7a 65 72 6f  er with non-zero
212b0 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
212c0 72 20 63 68 61 6e 67 65 73 20 74 68 65 0a 20 20  r changes the.  
212d0 2a 2a 20 64 65 66 61 75 6c 74 20 56 46 53 2c 20  ** default VFS, 
212e0 65 76 65 6e 20 69 66 20 74 68 65 20 31 73 74 20  even if the 1st 
212f0 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 6e 20  parameter is an 
21300 65 78 69 73 74 69 67 20 56 46 53 20 74 68 61 74  existig VFS that
21310 20 69 73 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75   is.  ** previou
21320 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 20 61  sly registered a
21330 73 20 74 68 65 20 6e 6f 6e 2d 64 65 66 61 75 6c  s the non-defaul
21340 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  t..  */.  sqlite
21350 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26  3_vfs_register(&
21360 6f 6e 65 2c 20 31 29 3b 0a 20 20 61 73 73 65 72  one, 1);.  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 6f 6e 65 22 29 3d 3d 26 6f  ind("__one")==&o
21390 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ne );.  assert( 
213a0 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
213b0 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20  ("__two")==&two 
213c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
213d0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
213e0 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 73 71 6c 69  ==&one );.  sqli
213f0 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
21400 28 26 74 77 6f 2c 20 31 29 3b 0a 20 20 61 73 73  (&two, 1);.  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 6f 6e 65 22 29 3d 3d  _find("__one")==
21430 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74  &one );.  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 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77  nd("__two")==&tw
21460 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  o );.  assert( s
21470 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
21480 30 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 69 66  0)==&two );.  if
21490 28 20 70 4d 61 69 6e 20 29 7b 0a 20 20 20 20 73  ( pMain ){.    s
214a0 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
214b0 74 65 72 28 70 4d 61 69 6e 2c 20 31 29 3b 0a 20  ter(pMain, 1);. 
214c0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
214d0 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f  e3_vfs_find("__o
214e0 6e 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20  ne")==&one );.  
214f0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
21500 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77  3_vfs_find("__tw
21510 6f 22 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 20  o")==&two );.   
21520 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
21530 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d 70 4d  _vfs_find(0)==pM
21540 61 69 6e 20 29 3b 0a 20 20 7d 0a 20 20 0a 20 20  ain );.  }.  .  
21550 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 64 65  /* Unlink the de
21560 66 61 75 6c 74 20 56 46 53 2e 20 20 52 65 70 65  fault VFS.  Repe
21570 61 74 20 75 6e 74 69 6c 20 74 68 65 72 65 20 61  at until there a
21580 72 65 20 6e 6f 20 6d 6f 72 65 20 56 46 53 65 73  re no more VFSes
21590 0a 20 20 2a 2a 20 72 65 67 69 73 74 65 72 65 64  .  ** registered
215a0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
215b0 3b 20 69 3c 73 69 7a 65 6f 66 28 61 70 56 66 73  ; i<sizeof(apVfs
215c0 29 2f 73 69 7a 65 6f 66 28 61 70 56 66 73 5b 30  )/sizeof(apVfs[0
215d0 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 70  ]); i++){.    ap
215e0 56 66 73 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33  Vfs[i] = sqlite3
215f0 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20  _vfs_find(0);.  
21600 20 20 69 66 28 20 61 70 56 66 73 5b 69 5d 20 29    if( apVfs[i] )
21610 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
21620 61 70 56 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65  apVfs[i]==sqlite
21630 33 5f 76 66 73 5f 66 69 6e 64 28 61 70 56 66 73  3_vfs_find(apVfs
21640 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20  [i]->zName) );. 
21650 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73       sqlite3_vfs
21660 5f 75 6e 72 65 67 69 73 74 65 72 28 61 70 56 66  _unregister(apVf
21670 73 5b 69 5d 29 3b 0a 20 20 20 20 20 20 61 73 73  s[i]);.      ass
21680 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f  ert( 0==sqlite3_
21690 76 66 73 5f 66 69 6e 64 28 61 70 56 66 73 5b 69  vfs_find(apVfs[i
216a0 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20 20 20  ]->zName) );.   
216b0 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
216c0 20 30 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f   0==sqlite3_vfs_
216d0 66 69 6e 64 28 30 29 20 29 3b 0a 20 20 0a 20 20  find(0) );.  .  
216e0 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20  /* Register the 
216f0 6d 61 69 6e 20 56 46 53 20 61 73 20 6e 6f 6e 2d  main VFS as non-
21700 64 65 66 61 75 6c 74 20 28 77 69 6c 6c 20 62 65  default (will be
21710 20 6d 61 64 65 20 64 65 66 61 75 6c 74 2c 20 73   made default, s
21720 69 6e 63 65 0a 20 20 2a 2a 20 69 74 27 6c 6c 20  ince.  ** it'll 
21730 62 65 20 74 68 65 20 6f 6e 6c 79 20 6f 6e 65 20  be the only one 
21740 69 6e 20 65 78 69 73 74 65 6e 63 65 29 2e 0a 20  in existence).. 
21750 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   */.  sqlite3_vf
21760 73 5f 72 65 67 69 73 74 65 72 28 70 4d 61 69 6e  s_register(pMain
21770 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
21780 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
21790 28 30 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a 20 20  (0)==pMain );.  
217a0 0a 20 20 2f 2a 20 55 6e 2d 72 65 67 69 73 74 65  .  /* Un-registe
217b0 72 20 74 68 65 20 6d 61 69 6e 20 56 46 53 20 61  r the main VFS a
217c0 67 61 69 6e 20 74 6f 20 72 65 73 74 6f 72 65 20  gain to restore 
217d0 61 6e 20 65 6d 70 74 79 20 56 46 53 20 6c 69 73  an empty VFS lis
217e0 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  t */.  sqlite3_v
217f0 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 70 4d  fs_unregister(pM
21800 61 69 6e 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ain);.  assert( 
21810 30 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  0==sqlite3_vfs_f
21820 69 6e 64 28 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  ind(0) );..  /* 
21830 52 65 6c 69 6e 6b 20 61 6c 6c 20 56 46 53 65 73  Relink all VFSes
21840 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
21850 72 2e 20 2a 2f 20 20 0a 20 20 66 6f 72 28 69 3d  r. */  .  for(i=
21860 73 69 7a 65 6f 66 28 61 70 56 66 73 29 2f 73 69  sizeof(apVfs)/si
21870 7a 65 6f 66 28 61 70 56 66 73 5b 30 5d 29 2d 31  zeof(apVfs[0])-1
21880 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
21890 20 20 69 66 28 20 61 70 56 66 73 5b 69 5d 20 29    if( apVfs[i] )
218a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
218b0 76 66 73 5f 72 65 67 69 73 74 65 72 28 61 70 56  vfs_register(apV
218c0 66 73 5b 69 5d 2c 20 31 29 3b 0a 20 20 20 20 20  fs[i], 1);.     
218d0 20 61 73 73 65 72 74 28 20 61 70 56 66 73 5b 69   assert( apVfs[i
218e0 5d 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  ]==sqlite3_vfs_f
218f0 69 6e 64 28 30 29 20 29 3b 0a 20 20 20 20 20 20  ind(0) );.      
21900 61 73 73 65 72 74 28 20 61 70 56 66 73 5b 69 5d  assert( apVfs[i]
21910 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ==sqlite3_vfs_fi
21920 6e 64 28 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61  nd(apVfs[i]->zNa
21930 6d 65 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  me) );.    }.  }
21940 0a 0a 20 20 2f 2a 20 55 6e 72 65 67 69 73 74 65  ..  /* Unregiste
21950 72 20 6f 75 74 20 73 61 6d 70 6c 65 20 56 46 53  r out sample VFS
21960 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  es. */.  sqlite3
21970 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28  _vfs_unregister(
21980 26 6f 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  &one);.  sqlite3
21990 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28  _vfs_unregister(
219a0 26 74 77 6f 29 3b 0a 0a 20 20 2f 2a 20 55 6e 72  &two);..  /* Unr
219b0 65 67 69 73 74 65 72 69 6e 67 20 61 20 56 46 53  egistering a VFS
219c0 20 74 68 61 74 20 69 73 20 6e 6f 74 20 63 75 72   that is not cur
219d0 72 65 6e 74 6c 79 20 72 65 67 69 73 74 65 72 65  rently registere
219e0 64 20 69 73 20 68 61 72 6d 6c 65 73 73 20 2a 2f  d is harmless */
219f0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75  .  sqlite3_vfs_u
21a00 6e 72 65 67 69 73 74 65 72 28 26 6f 6e 65 29 3b  nregister(&one);
21a10 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75  .  sqlite3_vfs_u
21a20 6e 72 65 67 69 73 74 65 72 28 26 74 77 6f 29 3b  nregister(&two);
21a30 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
21a40 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f  e3_vfs_find("__o
21a50 6e 65 22 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ne")==0 );.  ass
21a60 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
21a70 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d  _find("__two")==
21a80 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 73 68  0 );..  /* We sh
21a90 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 77 69 74  ould be left wit
21aa0 68 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  h the original d
21ab0 65 66 61 75 6c 74 20 56 46 53 20 62 61 63 6b 20  efault VFS back 
21ac0 61 73 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67  as the.  ** orig
21ad0 69 6e 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74  inal */.  assert
21ae0 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
21af0 6e 64 28 30 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a  nd(0)==pMain );.
21b00 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
21b10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  ;.}../*.** tclcm
21b20 64 3a 20 20 20 76 66 73 5f 69 6e 69 74 66 61 69  d:   vfs_initfai
21b30 6c 5f 74 65 73 74 0a 2a 2a 0a 2a 2a 20 54 68 69  l_test.**.** Thi
21b40 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 61 74  s TCL command at
21b50 74 65 6d 70 74 73 20 74 6f 20 76 66 73 5f 66 69  tempts to vfs_fi
21b60 6e 64 20 61 6e 64 20 76 66 73 5f 72 65 67 69 73  nd and vfs_regis
21b70 74 65 72 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20  ter when the.** 
21b80 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
21b90 7a 65 28 29 20 69 6e 74 65 72 66 61 63 65 20 69  ze() interface i
21ba0 73 20 66 61 69 6c 69 6e 67 2e 20 20 41 6c 6c 20  s failing.  All 
21bb0 63 61 6c 6c 73 20 73 68 6f 75 6c 64 20 66 61 69  calls should fai
21bc0 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
21bd0 20 76 66 73 5f 69 6e 69 74 66 61 69 6c 5f 74 65   vfs_initfail_te
21be0 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  st(.  ClientData
21bf0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
21c00 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
21c10 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
21c20 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
21c30 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
21c40 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
21c50 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
21c60 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
21c70 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
21c80 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
21c90 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
21ca0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
21cb0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
21cc0 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
21cd0 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
21ce0 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 6e 65 3b  sqlite3_vfs one;
21cf0 0a 20 20 6f 6e 65 2e 7a 4e 61 6d 65 20 3d 20 22  .  one.zName = "
21d00 5f 5f 6f 6e 65 22 3b 0a 0a 20 20 69 66 28 20 73  __one";..  if( s
21d10 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
21d20 30 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  0) ) return TCL_
21d30 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33  ERROR;.  sqlite3
21d40 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 6f  _vfs_register(&o
21d50 6e 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 73 71  ne, 0);.  if( sq
21d60 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
21d70 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
21d80 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f  RROR;.  sqlite3_
21d90 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 6f 6e  vfs_register(&on
21da0 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 73 71 6c  e, 1);.  if( sql
21db0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
21dc0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
21dd0 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ROR;.  return TC
21de0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  L_OK;.}../*.** S
21df0 61 76 65 64 20 56 46 53 65 73 0a 2a 2f 0a 73 74  aved VFSes.*/.st
21e00 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73  atic sqlite3_vfs
21e10 20 2a 61 70 56 66 73 5b 32 30 5d 3b 0a 73 74 61   *apVfs[20];.sta
21e20 74 69 63 20 69 6e 74 20 6e 56 66 73 20 3d 20 30  tic int nVfs = 0
21e30 3b 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  ;../*.** tclcmd:
21e40 20 20 20 76 66 73 5f 75 6e 72 65 67 69 73 74 65     vfs_unregiste
21e50 72 5f 61 6c 6c 0a 2a 2a 0a 2a 2a 20 55 6e 72 65  r_all.**.** Unre
21e60 67 69 73 74 65 72 20 61 6c 6c 20 56 46 53 65 73  gister all VFSes
21e70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21e80 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 5f 61  vfs_unregister_a
21e90 6c 6c 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  ll(.  ClientData
21ea0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
21eb0 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
21ec0 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
21ed0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
21ee0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
21ef0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
21f00 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
21f10 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
21f20 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
21f30 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
21f40 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
21f50 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
21f60 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
21f70 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
21f80 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
21f90 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
21fa0 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 70  ; i<ArraySize(ap
21fb0 56 66 73 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Vfs); i++){.    
21fc0 61 70 56 66 73 5b 69 5d 20 3d 20 73 71 6c 69 74  apVfs[i] = sqlit
21fd0 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a  e3_vfs_find(0);.
21fe0 20 20 20 20 69 66 28 20 61 70 56 66 73 5b 69 5d      if( apVfs[i]
21ff0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
22000 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72   sqlite3_vfs_unr
22010 65 67 69 73 74 65 72 28 61 70 56 66 73 5b 69 5d  egister(apVfs[i]
22020 29 3b 0a 20 20 7d 0a 20 20 6e 56 66 73 20 3d 20  );.  }.  nVfs = 
22030 69 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  i;.  return TCL_
22040 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  OK;.}./*.** tclc
22050 6d 64 3a 20 20 20 76 66 73 5f 72 65 72 65 67 69  md:   vfs_reregi
22060 73 74 65 72 5f 61 6c 6c 0a 2a 2a 0a 2a 2a 20 52  ster_all.**.** R
22070 65 73 74 6f 72 65 20 61 6c 6c 20 56 46 53 65 73  estore all VFSes
22080 20 74 68 61 74 20 77 65 72 65 20 72 65 6d 6f 76   that were remov
22090 65 64 20 75 73 69 6e 67 20 76 66 73 5f 75 6e 72  ed using vfs_unr
220a0 65 67 69 73 74 65 72 5f 61 6c 6c 0a 2a 2f 0a 73  egister_all.*/.s
220b0 74 61 74 69 63 20 69 6e 74 20 76 66 73 5f 72 65  tatic int vfs_re
220c0 72 65 67 69 73 74 65 72 5f 61 6c 6c 28 0a 20 20  register_all(.  
220d0 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
220e0 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
220f0 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
22100 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
22110 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
22120 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
22130 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
22140 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
22150 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
22160 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
22170 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
22180 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
22190 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
221a0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
221b0 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
221c0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
221d0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56  .  for(i=0; i<nV
221e0 66 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  fs; i++){.    sq
221f0 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
22200 65 72 28 61 70 56 66 73 5b 69 5d 2c 20 69 3d 3d  er(apVfs[i], i==
22210 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
22220 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
22230 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c  ** tclcmd:   fil
22240 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73 74 20 44  e_control_test D
22250 42 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c  B.**.** This TCL
22260 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68   command runs th
22270 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  e sqlite3_file_c
22280 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65  ontrol interface
22290 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73   and.** verifies
222a0 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69   correct operati
222b0 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d 65 2e 0a  on of the same..
222c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
222d0 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73 74 28  le_control_test(
222e0 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
222f0 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
22300 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
22310 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
22320 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
22330 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
22340 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
22350 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
22360 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
22370 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
22380 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22390 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
223a0 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
223b0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
223c0 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
223d0 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ents */.){.  int
223e0 20 69 41 72 67 20 3d 20 30 3b 0a 20 20 73 71 6c   iArg = 0;.  sql
223f0 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
22400 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
22410 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
22420 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
22430 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
22440 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
22450 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
22460 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
22470 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 22  jv[0], 0), " DB"
22480 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
22490 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
224a0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
224b0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
224c0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
224d0 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
224e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
224f0 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
22500 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 30 2c 20 30  control(db, 0, 0
22510 2c 20 26 69 41 72 67 29 3b 0a 20 20 61 73 73 65  , &iArg);.  asse
22520 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  rt( rc==SQLITE_N
22530 4f 54 46 4f 55 4e 44 20 29 3b 0a 20 20 72 63 20  OTFOUND );.  rc 
22540 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
22550 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6e 6f 74 61  ontrol(db, "nota
22560 64 61 74 61 62 61 73 65 22 2c 20 53 51 4c 49 54  database", SQLIT
22570 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54  E_FCNTL_LOCKSTAT
22580 45 2c 20 26 69 41 72 67 29 3b 0a 20 20 61 73 73  E, &iArg);.  ass
22590 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
225a0 45 52 52 4f 52 20 29 3b 0a 20 20 72 63 20 3d 20  ERROR );.  rc = 
225b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
225c0 74 72 6f 6c 28 64 62 2c 20 22 6d 61 69 6e 22 2c  trol(db, "main",
225d0 20 2d 31 2c 20 26 69 41 72 67 29 3b 0a 20 20 61   -1, &iArg);.  a
225e0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
225f0 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 3b 0a 20 20  E_NOTFOUND );.  
22600 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
22610 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 74  e_control(db, "t
22620 65 6d 70 22 2c 20 2d 31 2c 20 26 69 41 72 67 29  emp", -1, &iArg)
22630 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
22640 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
22650 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52  || rc==SQLITE_ER
22660 52 4f 52 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e  ROR );..  return
22670 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
22680 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c  ** tclcmd:   fil
22690 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72  e_control_laster
226a0 72 6e 6f 5f 74 65 73 74 20 44 42 0a 2a 2a 0a 2a  rno_test DB.**.*
226b0 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61  * This TCL comma
226c0 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69  nd runs the sqli
226d0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
226e0 20 69 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a   interface and.*
226f0 2a 20 76 65 72 69 66 69 65 73 20 63 6f 72 72 65  * verifies corre
22700 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  ct operation of 
22710 74 68 65 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f  the SQLITE_LAST_
22720 45 52 52 4e 4f 20 76 65 72 62 2e 0a 2a 2f 0a 73  ERRNO verb..*/.s
22730 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63  tatic int file_c
22740 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f  ontrol_lasterrno
22750 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44  _test(.  ClientD
22760 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
22770 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
22780 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
22790 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
227a0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
227b0 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
227c0 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
227d0 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
227e0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
227f0 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
22800 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
22810 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
22820 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
22830 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
22840 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
22850 0a 20 20 69 6e 74 20 69 41 72 67 20 3d 20 30 3b  .  int iArg = 0;
22860 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
22870 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
22880 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
22890 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
228a0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
228b0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
228c0 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
228d0 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
228e0 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
228f0 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
22900 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
22910 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
22920 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
22930 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
22940 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b  bjv[1]), &db) ){
22950 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
22960 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20  ERROR;.  }.  rc 
22970 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
22980 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c  ontrol(db, NULL,
22990 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52   SQLITE_LAST_ERR
229a0 4e 4f 2c 20 26 69 41 72 67 29 3b 0a 20 20 69 66  NO, &iArg);.  if
229b0 28 20 72 63 20 29 7b 20 0a 20 20 20 20 54 63 6c  ( rc ){ .    Tcl
229c0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
229d0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
229e0 4f 62 6a 28 72 63 29 29 3b 20 0a 20 20 20 20 72  Obj(rc)); .    r
229f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
22a00 20 0a 20 20 7d 0a 20 20 69 66 28 20 69 41 72 67   .  }.  if( iArg
22a10 21 3d 30 20 29 20 7b 0a 20 20 20 20 54 63 6c 5f  !=0 ) {.    Tcl_
22a20 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
22a30 65 72 70 2c 20 22 55 6e 65 78 70 65 63 74 65 64  erp, "Unexpected
22a40 20 6e 6f 6e 2d 7a 65 72 6f 20 65 72 72 6e 6f 3a   non-zero errno:
22a50 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ",.            
22a60 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74           Tcl_Get
22a70 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63  StringFromObj(Tc
22a80 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 69 41 72 67  l_NewIntObj(iArg
22a90 29 2c 20 30 29 2c 20 22 20 22 2c 20 30 29 3b 0a  ), 0), " ", 0);.
22aa0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
22ab0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
22ac0 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a  rn TCL_OK;  .}..
22ad0 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
22ae0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75  file_control_chu
22af0 6e 6b 73 69 7a 65 5f 74 65 73 74 20 44 42 20 44  nksize_test DB D
22b00 42 4e 41 4d 45 20 53 49 5a 45 0a 2a 2a 0a 2a 2a  BNAME SIZE.**.**
22b10 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e   This TCL comman
22b20 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74  d runs the sqlit
22b30 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20  e3_file_control 
22b40 69 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a  interface and.**
22b50 20 76 65 72 69 66 69 65 73 20 63 6f 72 72 65 63   verifies correc
22b60 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74  t operation of t
22b70 68 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f  he SQLITE_GET_LO
22b80 43 4b 50 52 4f 58 59 46 49 4c 45 20 61 6e 64 0a  CKPROXYFILE and.
22b90 2a 2a 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f  ** SQLITE_SET_LO
22ba0 43 4b 50 52 4f 58 59 46 49 4c 45 20 76 65 72 62  CKPROXYFILE verb
22bb0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
22bc0 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68   file_control_ch
22bd0 75 6e 6b 73 69 7a 65 5f 74 65 73 74 28 0a 20 20  unksize_test(.  
22be0 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
22bf0 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
22c00 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
22c10 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
22c20 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
22c30 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
22c40 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
22c50 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
22c60 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
22c70 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
22c80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
22c90 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
22ca0 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
22cb0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
22cc0 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
22cd0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 53  s */.){.  int nS
22ce0 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
22cf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
22d00 20 63 68 75 6e 6b 20 73 69 7a 65 20 2a 2f 0a 20   chunk size */. 
22d10 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20   char *zDb;     
22d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d30 20 2f 2a 20 44 62 20 6e 61 6d 65 20 28 22 6d 61   /* Db name ("ma
22d40 69 6e 22 2c 20 22 74 65 6d 70 22 20 65 74 63 2e  in", "temp" etc.
22d50 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  ) */.  sqlite3 *
22d60 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
22d70 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
22d80 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  se handle */.  i
22d90 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
22da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22db0 2a 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29  * file_control()
22dc0 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
22dd0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29  .  if( objc!=4 )
22de0 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
22df0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
22e00 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44 42 4e 41  , objv, "DB DBNA
22e10 4d 45 20 53 49 5a 45 22 29 3b 0a 20 20 20 20 72  ME SIZE");.    r
22e20 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
22e30 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
22e40 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
22e50 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
22e60 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 0a 20 20  jv[1]), &db) .  
22e70 20 7c 7c 20 54 63 6c 5f 47 65 74 49 6e 74 46 72   || Tcl_GetIntFr
22e80 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
22e90 6a 76 5b 33 5d 2c 20 26 6e 53 69 7a 65 29 0a 20  jv[3], &nSize). 
22ea0 20 29 7b 0a 20 20 20 72 65 74 75 72 6e 20 54 43   ){.   return TC
22eb0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
22ec0 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  Db = Tcl_GetStri
22ed0 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69  ng(objv[2]);.  i
22ee0 66 28 20 7a 44 62 5b 30 5d 3d 3d 27 5c 30 27 20  f( zDb[0]=='\0' 
22ef0 29 20 7a 44 62 20 3d 20 4e 55 4c 4c 3b 0a 0a 20  ) zDb = NULL;.. 
22f00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
22f10 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a  le_control(db, z
22f20 44 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  Db, SQLITE_FCNTL
22f30 5f 43 48 55 4e 4b 5f 53 49 5a 45 2c 20 28 76 6f  _CHUNK_SIZE, (vo
22f40 69 64 20 2a 29 26 6e 53 69 7a 65 29 3b 0a 20 20  id *)&nSize);.  
22f50 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 54 63  if( rc ){.    Tc
22f60 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
22f70 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69  rp, (char *)sqli
22f80 74 65 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65  te3TestErrorName
22f90 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43  (rc), TCL_STATIC
22fa0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
22fb0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
22fc0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
22fd0 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
22fe0 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69   file_control_si
22ff0 7a 65 68 69 6e 74 5f 74 65 73 74 20 44 42 20 44  zehint_test DB D
23000 42 4e 41 4d 45 20 53 49 5a 45 0a 2a 2a 0a 2a 2a  BNAME SIZE.**.**
23010 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e   This TCL comman
23020 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74  d runs the sqlit
23030 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20  e3_file_control 
23040 69 6e 74 65 72 66 61 63 65 20 0a 2a 2a 20 77 69  interface .** wi
23050 74 68 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  th SQLITE_FCNTL_
23060 53 49 5a 45 5f 48 49 4e 54 0a 2a 2f 0a 73 74 61  SIZE_HINT.*/.sta
23070 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e  tic int file_con
23080 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74 65  trol_sizehint_te
23090 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  st(.  ClientData
230a0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
230b0 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
230c0 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
230d0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
230e0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
230f0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
23100 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
23110 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
23120 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
23130 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
23140 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
23150 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
23160 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
23170 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
23180 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
23190 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 53  sqlite3_int64 nS
231a0 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
231b0 2f 2a 20 48 69 6e 74 65 64 20 73 69 7a 65 20 2a  /* Hinted size *
231c0 2f 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 20 20  /.  char *zDb;  
231d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231e0 20 20 20 20 2f 2a 20 44 62 20 6e 61 6d 65 20 28      /* Db name (
231f0 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20 65  "main", "temp" e
23200 74 63 2e 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tc.) */.  sqlite
23210 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
23220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
23230 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
23240 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
23250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23260 20 20 2f 2a 20 66 69 6c 65 5f 63 6f 6e 74 72 6f    /* file_contro
23270 6c 28 29 20 72 65 74 75 72 6e 20 63 6f 64 65 20  l() return code 
23280 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  */..  if( objc!=
23290 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  4 ){.    Tcl_Wro
232a0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
232b0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44  , 1, objv, "DB D
232c0 42 4e 41 4d 45 20 53 49 5a 45 22 29 3b 0a 20 20  BNAME SIZE");.  
232d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
232e0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
232f0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
23300 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
23310 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
23320 0a 20 20 20 7c 7c 20 54 63 6c 5f 47 65 74 57 69  .   || Tcl_GetWi
23330 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  deIntFromObj(int
23340 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e  erp, objv[3], &n
23350 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20 72 65  Size).  ){.   re
23360 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
23370 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f    }.  zDb = Tcl_
23380 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
23390 5d 29 3b 0a 20 20 69 66 28 20 7a 44 62 5b 30 5d  ]);.  if( zDb[0]
233a0 3d 3d 27 5c 30 27 20 29 20 7a 44 62 20 3d 20 4e  =='\0' ) zDb = N
233b0 55 4c 4c 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ULL;..  rc = sql
233c0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
233d0 6c 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54  l(db, zDb, SQLIT
233e0 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  E_FCNTL_SIZE_HIN
233f0 54 2c 20 28 76 6f 69 64 20 2a 29 26 6e 53 69 7a  T, (void *)&nSiz
23400 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  e);.  if( rc ){.
23410 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
23420 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
23430 2a 29 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  *)sqlite3TestErr
23440 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  orName(rc), TCL_
23450 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74  STATIC);.    ret
23460 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
23470 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
23480 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  OK;.}../*.** tcl
23490 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74  cmd:   file_cont
234a0 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74 65  rol_lockproxy_te
234b0 73 74 20 44 42 20 50 57 44 0a 2a 2a 0a 2a 2a 20  st DB PWD.**.** 
234c0 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  This TCL command
234d0 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65   runs the sqlite
234e0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69  3_file_control i
234f0 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20  nterface and.** 
23500 76 65 72 69 66 69 65 73 20 63 6f 72 72 65 63 74  verifies correct
23510 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   operation of th
23520 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43  e SQLITE_GET_LOC
23530 4b 50 52 4f 58 59 46 49 4c 45 20 61 6e 64 0a 2a  KPROXYFILE and.*
23540 2a 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  * SQLITE_SET_LOC
23550 4b 50 52 4f 58 59 46 49 4c 45 20 76 65 72 62 73  KPROXYFILE verbs
23560 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23570 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f 63  file_control_loc
23580 6b 70 72 6f 78 79 5f 74 65 73 74 28 0a 20 20 43  kproxy_test(.  C
23590 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
235a0 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
235b0 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
235c0 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
235d0 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
235e0 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
235f0 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
23600 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
23610 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
23620 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
23630 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
23640 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
23650 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
23660 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
23670 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
23680 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
23690 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *db;.  const ch
236a0 61 72 20 2a 7a 50 77 64 3b 0a 20 20 69 6e 74 20  ar *zPwd;.  int 
236b0 6e 50 77 64 3b 0a 20 20 0a 20 20 69 66 28 20 6f  nPwd;.  .  if( o
236c0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
236d0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
236e0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
236f0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
23700 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \"",.           
23710 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65            Tcl_Ge
23720 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
23730 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42  bjv[0], 0), " DB
23740 20 50 57 44 22 2c 20 30 29 3b 0a 20 20 20 20 72   PWD", 0);.    r
23750 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
23760 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
23770 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
23780 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
23790 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a  jv[1]), &db) ){.
237a0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
237b0 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 50 77 64 20  ROR;.  }.  zPwd 
237c0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
237d0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
237e0 26 6e 50 77 64 29 3b 0a 20 20 0a 23 69 66 20 21  &nPwd);.  .#if !
237f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
23800 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
23810 59 4c 45 29 0a 23 20 20 69 66 20 64 65 66 69 6e  YLE).#  if defin
23820 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23 20  ed(__APPLE__).# 
23830 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45     define SQLITE
23840 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
23850 53 54 59 4c 45 20 31 0a 23 20 20 65 6c 73 65 0a  STYLE 1.#  else.
23860 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49  #    define SQLI
23870 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
23880 47 5f 53 54 59 4c 45 20 30 0a 23 20 20 65 6e 64  G_STYLE 0.#  end
23890 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  if.#endif.#if SQ
238a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
238b0 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
238c0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
238d0 20 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 74 65    {.    char *te
238e0 73 74 50 61 74 68 3b 0a 20 20 20 20 69 6e 74 20  stPath;.    int 
238f0 72 63 3b 0a 20 20 20 20 63 68 61 72 20 70 72 6f  rc;.    char pro
23900 78 79 50 61 74 68 5b 34 30 30 5d 3b 0a 20 20 20  xyPath[400];.   
23910 20 0a 20 20 20 20 69 66 28 20 73 69 7a 65 6f 66   .    if( sizeof
23920 28 70 72 6f 78 79 50 61 74 68 29 3c 6e 50 77 64  (proxyPath)<nPwd
23930 2b 32 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  +20 ){.      Tcl
23940 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
23950 74 65 72 70 2c 20 22 50 57 44 20 74 6f 6f 20 62  terp, "PWD too b
23960 69 67 22 2c 20 28 76 6f 69 64 2a 29 30 29 3b 0a  ig", (void*)0);.
23970 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
23980 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
23990 20 20 73 70 72 69 6e 74 66 28 70 72 6f 78 79 50    sprintf(proxyP
239a0 61 74 68 2c 20 22 25 73 2f 74 65 73 74 2e 70 72  ath, "%s/test.pr
239b0 6f 78 79 22 2c 20 7a 50 77 64 29 3b 0a 20 20 20  oxy", zPwd);.   
239c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
239d0 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e  le_control(db, N
239e0 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f  ULL, SQLITE_SET_
239f0 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 70  LOCKPROXYFILE, p
23a00 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 69  roxyPath);.    i
23a10 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54  f( rc ){.      T
23a20 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
23a30 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
23a40 6e 74 4f 62 6a 28 72 63 29 29 3b 20 0a 20 20 20  ntObj(rc)); .   
23a50 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
23a60 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ROR;.    }.    r
23a70 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
23a80 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c  _control(db, NUL
23a90 4c 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f  L, SQLITE_GET_LO
23aa0 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26 74 65  CKPROXYFILE, &te
23ab0 73 74 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28  stPath);.    if(
23ac0 20 73 74 72 6e 63 6d 70 28 70 72 6f 78 79 50 61   strncmp(proxyPa
23ad0 74 68 2c 74 65 73 74 50 61 74 68 2c 31 31 29 20  th,testPath,11) 
23ae0 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
23af0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
23b00 2c 20 22 4c 6f 63 6b 20 70 72 6f 78 79 20 66 69  , "Lock proxy fi
23b10 6c 65 20 64 69 64 20 6e 6f 74 20 6d 61 74 63 68  le did not match
23b20 20 74 68 65 20 22 0a 20 20 20 20 20 20 20 20 20   the ".         
23b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b40 20 20 20 20 20 20 22 70 72 65 76 69 6f 75 73 6c        "previousl
23b50 79 20 61 73 73 69 67 6e 65 64 20 76 61 6c 75 65  y assigned value
23b60 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  ", 0);.      ret
23b70 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
23b80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20     }.    if( rc 
23b90 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
23ba0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
23bb0 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
23bc0 72 63 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  rc));.      retu
23bd0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
23be0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
23bf0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
23c00 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49  l(db, NULL, SQLI
23c10 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_SET_LOCKPROXY
23c20 46 49 4c 45 2c 20 70 72 6f 78 79 50 61 74 68 29  FILE, proxyPath)
23c30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
23c40 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
23c50 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
23c60 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29  cl_NewIntObj(rc)
23c70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
23c80 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
23c90 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
23ca0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d  turn TCL_OK;  .}
23cb0 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
23cc0 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77    file_control_w
23cd0 69 6e 33 32 5f 61 76 5f 72 65 74 72 79 20 44 42  in32_av_retry DB
23ce0 20 20 4e 52 45 54 52 59 20 20 44 45 4c 41 59 0a    NRETRY  DELAY.
23cf0 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63  **.** This TCL c
23d00 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20  ommand runs the 
23d10 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
23d20 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 77  trol interface w
23d30 69 74 68 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54  ith.** the SQLIT
23d40 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 41 56  E_FCNTL_WIN32_AV
23d50 5f 52 45 54 52 59 20 6f 70 63 6f 64 65 2e 0a 2a  _RETRY opcode..*
23d60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
23d70 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f  e_control_win32_
23d80 61 76 5f 72 65 74 72 79 28 0a 20 20 43 6c 69 65  av_retry(.  Clie
23d90 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
23da0 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
23db0 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
23dc0 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
23dd0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
23de0 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
23df0 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
23e00 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
23e10 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
23e20 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
23e30 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
23e40 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
23e50 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
23e60 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
23e70 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
23e80 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
23e90 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  b;.  int rc;.  i
23ea0 6e 74 20 61 5b 32 5d 3b 0a 20 20 63 68 61 72 20  nt a[2];.  char 
23eb0 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f  z[100];..  if( o
23ec0 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
23ed0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
23ee0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
23ef0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
23f00 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
23f10 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
23f20 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
23f30 20 44 42 20 4e 52 45 54 52 59 20 44 45 4c 41 59   DB NRETRY DELAY
23f40 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
23f50 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
23f60 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
23f70 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
23f80 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
23f90 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20  ]), &db) ){.    
23fa0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
23fb0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
23fc0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
23fd0 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
23fe0 61 5b 30 5d 29 20 29 20 72 65 74 75 72 6e 20 54  a[0]) ) return T
23ff0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
24000 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
24010 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
24020 5d 2c 20 26 61 5b 31 5d 29 20 29 20 72 65 74 75  ], &a[1]) ) retu
24030 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
24040 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
24050 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55  e_control(db, NU
24060 4c 4c 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  LL, SQLITE_FCNTL
24070 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52 59 2c  _WIN32_AV_RETRY,
24080 20 28 76 6f 69 64 2a 29 61 29 3b 0a 20 20 73 71   (void*)a);.  sq
24090 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
240a0 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 64  izeof(z), z, "%d
240b0 20 25 64 20 25 64 22 2c 20 72 63 2c 20 61 5b 30   %d %d", rc, a[0
240c0 5d 2c 20 61 5b 31 5d 29 3b 0a 20 20 54 63 6c 5f  ], a[1]);.  Tcl_
240d0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
240e0 65 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30  erp, z, (char*)0
240f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
24100 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  OK;  .}../*.** t
24110 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f  clcmd:   file_co
24120 6e 74 72 6f 6c 5f 70 65 72 73 69 73 74 5f 77 61  ntrol_persist_wa
24130 6c 20 44 42 20 50 45 52 53 49 53 54 2d 46 4c 41  l DB PERSIST-FLA
24140 47 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c  G.**.** This TCL
24150 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68   command runs th
24160 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  e sqlite3_file_c
24170 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65  ontrol interface
24180 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 53 51 4c   with.** the SQL
24190 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53  ITE_FCNTL_PERSIS
241a0 54 5f 57 41 4c 20 6f 70 63 6f 64 65 2e 0a 2a 2f  T_WAL opcode..*/
241b0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65  .static int file
241c0 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72 73 69 73 74  _control_persist
241d0 5f 77 61 6c 28 0a 20 20 43 6c 69 65 6e 74 44 61  _wal(.  ClientDa
241e0 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
241f0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
24200 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
24210 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
24220 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
24230 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
24240 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
24250 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
24260 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
24270 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
24280 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
24290 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
242a0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
242b0 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
242c0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
242d0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
242e0 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62   int rc;.  int b
242f0 50 65 72 73 69 73 74 3b 0a 20 20 63 68 61 72 20  Persist;.  char 
24300 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f  z[100];..  if( o
24310 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
24320 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
24330 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
24340 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
24350 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
24360 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
24370 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
24380 20 44 42 20 46 4c 41 47 22 2c 20 30 29 3b 0a 20   DB FLAG", 0);. 
24390 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
243a0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
243b0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
243c0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
243d0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
243e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
243f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
24400 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
24410 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
24420 6a 76 5b 32 5d 2c 20 26 62 50 65 72 73 69 73 74  jv[2], &bPersist
24430 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
24440 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
24450 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
24460 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49  l(db, NULL, SQLI
24470 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54  TE_FCNTL_PERSIST
24480 5f 57 41 4c 2c 20 28 76 6f 69 64 2a 29 26 62 50  _WAL, (void*)&bP
24490 65 72 73 69 73 74 29 3b 0a 20 20 73 71 6c 69 74  ersist);.  sqlit
244a0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
244b0 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 64 20 25 64  of(z), z, "%d %d
244c0 22 2c 20 72 63 2c 20 62 50 65 72 73 69 73 74 29  ", rc, bPersist)
244d0 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
244e0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20  sult(interp, z, 
244f0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 72 65 74  (char*)0);.  ret
24500 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a  urn TCL_OK;  .}.
24510 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
24520 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 7a 65   file_control_ze
24530 72 6f 5f 64 61 6d 61 67 65 20 44 42 20 5a 45 52  ro_damage DB ZER
24540 4f 2d 44 41 4d 41 47 45 2d 46 4c 41 47 0a 2a 2a  O-DAMAGE-FLAG.**
24550 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d  .** This TCL com
24560 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71  mand runs the sq
24570 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
24580 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 77 69 74  ol interface wit
24590 68 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f  h.** the SQLITE_
245a0 46 43 4e 54 4c 5f 5a 45 52 4f 5f 44 41 4d 41 47  FCNTL_ZERO_DAMAG
245b0 45 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  E opcode..*/.sta
245c0 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e  tic int file_con
245d0 74 72 6f 6c 5f 7a 65 72 6f 5f 64 61 6d 61 67 65  trol_zero_damage
245e0 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
245f0 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
24600 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
24610 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
24620 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
24630 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
24640 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
24650 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
24660 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
24670 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
24680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24690 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
246a0 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
246b0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
246c0 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
246d0 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
246e0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
246f0 20 72 63 3b 0a 20 20 69 6e 74 20 62 44 61 6d 61   rc;.  int bDama
24700 67 65 3b 0a 20 20 63 68 61 72 20 7a 5b 31 30 30  ge;.  char z[100
24710 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ];..  if( objc!=
24720 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
24730 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
24740 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
24750 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
24760 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
24770 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
24780 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 46  v[0], 0), " DB F
24790 4c 41 47 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  LAG", 0);.    re
247a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
247b0 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
247c0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
247d0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
247e0 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20  v[1]), &db) ){. 
247f0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
24800 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  ROR;.  }.  if( T
24810 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
24820 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
24830 2c 20 26 62 44 61 6d 61 67 65 29 20 29 20 72 65  , &bDamage) ) re
24840 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
24850 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
24860 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
24870 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 46 43 4e  NULL, SQLITE_FCN
24880 54 4c 5f 5a 45 52 4f 5f 44 41 4d 41 47 45 2c 28  TL_ZERO_DAMAGE,(
24890 76 6f 69 64 2a 29 26 62 44 61 6d 61 67 65 29 3b  void*)&bDamage);
248a0 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
248b0 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a  ntf(sizeof(z), z
248c0 2c 20 22 25 64 20 25 64 22 2c 20 72 63 2c 20 62  , "%d %d", rc, b
248d0 44 61 6d 61 67 65 29 3b 0a 20 20 54 63 6c 5f 41  Damage);.  Tcl_A
248e0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
248f0 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30 29  rp, z, (char*)0)
24900 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
24910 4b 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74  K;  .}.../*.** t
24920 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f  clcmd:   file_co
24930 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d 65 20 44 42  ntrol_vfsname DB
24940 20 3f 41 55 58 44 42 3f 0a 2a 2a 0a 2a 2a 20 52   ?AUXDB?.**.** R
24950 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74  eturn a string t
24960 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
24970 65 20 73 74 61 63 6b 20 6f 66 20 56 46 53 65 73  e stack of VFSes
24980 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24990 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73  file_control_vfs
249a0 6e 61 6d 65 28 0a 20 20 43 6c 69 65 6e 74 44 61  name(.  ClientDa
249b0 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
249c0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
249d0 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
249e0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
249f0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
24a00 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
24a10 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
24a20 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
24a30 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
24a40 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
24a50 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
24a60 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
24a70 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
24a80 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
24a90 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
24aa0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
24ab0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
24ac0 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20  Name = "main";. 
24ad0 20 63 68 61 72 20 2a 7a 56 66 73 4e 61 6d 65 20   char *zVfsName 
24ae0 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  = 0;..  if( objc
24af0 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29  !=2 && objc!=3 )
24b00 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
24b10 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
24b20 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
24b30 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
24b40 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
24b50 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
24b60 5d 2c 20 30 29 2c 20 22 20 44 42 20 3f 41 55 58  ], 0), " DB ?AUX
24b70 44 42 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  DB?", 0);.    re
24b80 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
24b90 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
24ba0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
24bb0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
24bc0 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20  v[1]), &db) ){. 
24bd0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
24be0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  ROR;.  }.  if( o
24bf0 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 7a 44  bjc==3 ){.    zD
24c00 62 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  bName = Tcl_GetS
24c10 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
24c20 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69    }.  sqlite3_fi
24c30 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a  le_control(db, z
24c40 44 62 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46  DbName, SQLITE_F
24c50 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 2c 28 76 6f  CNTL_VFSNAME,(vo
24c60 69 64 2a 29 26 7a 56 66 73 4e 61 6d 65 29 3b 0a  id*)&zVfsName);.
24c70 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
24c80 6c 74 28 69 6e 74 65 72 70 2c 20 7a 56 66 73 4e  lt(interp, zVfsN
24c90 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ame, (char*)0);.
24ca0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
24cb0 56 66 73 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  VfsName);.  retu
24cc0 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a  rn TCL_OK;  .}..
24cd0 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
24ce0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 6c 69 73   sqlite3_vfs_lis
24cf0 74 0a 2a 2a 0a 2a 2a 20 20 20 52 65 74 75 72 6e  t.**.**   Return
24d00 20 61 20 74 63 6c 20 6c 69 73 74 20 63 6f 6e 74   a tcl list cont
24d10 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 73  aining the names
24d20 20 6f 66 20 61 6c 6c 20 72 65 67 69 73 74 65 72   of all register
24d30 65 64 20 76 66 73 27 73 2e 0a 2a 2f 0a 73 74 61  ed vfs's..*/.sta
24d40 74 69 63 20 69 6e 74 20 76 66 73 5f 6c 69 73 74  tic int vfs_list
24d50 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
24d60 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
24d70 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
24d80 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
24d90 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
24da0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
24db0 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
24dc0 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
24dd0 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
24de0 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
24df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24e00 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
24e10 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
24e20 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
24e30 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
24e40 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
24e50 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b  lite3_vfs *pVfs;
24e60 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74  .  Tcl_Obj *pRet
24e70 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b   = Tcl_NewObj();
24e80 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29  .  if( objc!=1 )
24e90 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
24ea0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
24eb0 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20  , objv, "");.   
24ec0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
24ed0 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 56 66  R;.  }.  for(pVf
24ee0 73 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  s=sqlite3_vfs_fi
24ef0 6e 64 28 30 29 3b 20 70 56 66 73 3b 20 70 56 66  nd(0); pVfs; pVf
24f00 73 3d 70 56 66 73 2d 3e 70 4e 65 78 74 29 7b 0a  s=pVfs->pNext){.
24f10 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
24f20 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
24f30 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  erp, pRet, Tcl_N
24f40 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 56 66 73  ewStringObj(pVfs
24f50 2d 3e 7a 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20  ->zName, -1));. 
24f60 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52   }.  Tcl_SetObjR
24f70 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52  esult(interp, pR
24f80 65 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  et);.  return TC
24f90 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  L_OK;  .}../*.**
24fa0 20 74 63 6c 63 6d 64 3a 20 20 20 73 71 6c 69 74   tclcmd:   sqlit
24fb0 65 33 5f 6c 69 6d 69 74 20 44 42 20 49 44 20 56  e3_limit DB ID V
24fc0 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ALUE.**.** This 
24fd0 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73  TCL command runs
24fe0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6c 69 6d   the sqlite3_lim
24ff0 69 74 20 69 6e 74 65 72 66 61 63 65 20 61 6e 64  it interface and
25000 0a 2a 2a 20 76 65 72 69 66 69 65 73 20 63 6f 72  .** verifies cor
25010 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  rect operation o
25020 66 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a 73  f the same..*/.s
25030 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6c  tatic int test_l
25040 69 6d 69 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  imit(.  ClientDa
25050 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
25060 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
25070 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
25080 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
25090 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
250a0 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
250b0 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
250c0 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
250d0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
250e0 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
250f0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
25100 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
25110 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
25120 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
25130 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
25140 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
25150 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 61 74 69   int rc;.  stati
25160 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b  c const struct {
25170 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d  .     char *zNam
25180 65 3b 0a 20 20 20 20 20 69 6e 74 20 69 64 3b 0a  e;.     int id;.
25190 20 20 7d 20 61 49 64 5b 5d 20 3d 20 7b 0a 20 20    } aId[] = {.  
251a0 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49    { "SQLITE_LIMI
251b0 54 5f 4c 45 4e 47 54 48 22 2c 20 20 20 20 20 20  T_LENGTH",      
251c0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
251d0 49 4d 49 54 5f 4c 45 4e 47 54 48 20 20 20 20 20  IMIT_LENGTH     
251e0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
251f0 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54   { "SQLITE_LIMIT
25200 5f 53 51 4c 5f 4c 45 4e 47 54 48 22 2c 20 20 20  _SQL_LENGTH",   
25210 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
25220 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 20  MIT_SQL_LENGTH  
25230 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
25240 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  { "SQLITE_LIMIT_
25250 43 4f 4c 55 4d 4e 22 2c 20 20 20 20 20 20 20 20  COLUMN",        
25260 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
25270 49 54 5f 43 4f 4c 55 4d 4e 20 20 20 20 20 20 20  IT_COLUMN       
25280 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
25290 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45   "SQLITE_LIMIT_E
252a0 58 50 52 5f 44 45 50 54 48 22 2c 20 20 20 20 20  XPR_DEPTH",     
252b0 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
252c0 54 5f 45 58 50 52 5f 44 45 50 54 48 20 20 20 20  T_EXPR_DEPTH    
252d0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
252e0 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  "SQLITE_LIMIT_CO
252f0 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 22 2c 20  MPOUND_SELECT", 
25300 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
25310 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
25320 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
25330 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42  SQLITE_LIMIT_VDB
25340 45 5f 4f 50 22 2c 20 20 20 20 20 20 20 20 20 20  E_OP",          
25350 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
25360 56 44 42 45 5f 4f 50 20 20 20 20 20 20 20 20 20  VDBE_OP         
25370 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53       },.    { "S
25380 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43  QLITE_LIMIT_FUNC
25390 54 49 4f 4e 5f 41 52 47 22 2c 20 20 20 20 20 20  TION_ARG",      
253a0 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46    SQLITE_LIMIT_F
253b0 55 4e 43 54 49 4f 4e 5f 41 52 47 20 20 20 20 20  UNCTION_ARG     
253c0 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
253d0 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43  LITE_LIMIT_ATTAC
253e0 48 45 44 22 2c 20 20 20 20 20 20 20 20 20 20 20  HED",           
253f0 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54   SQLITE_LIMIT_AT
25400 54 41 43 48 45 44 20 20 20 20 20 20 20 20 20 20  TACHED          
25410 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c     },.    { "SQL
25420 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50  ITE_LIMIT_LIKE_P
25430 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 22 2c 20  ATTERN_LENGTH", 
25440 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b  SQLITE_LIMIT_LIK
25450 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
25460 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
25470 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
25480 45 5f 4e 55 4d 42 45 52 22 2c 20 20 20 20 20 53  E_NUMBER",     S
25490 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
254a0 41 42 4c 45 5f 4e 55 4d 42 45 52 20 20 20 20 20  ABLE_NUMBER     
254b0 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
254c0 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f  E_LIMIT_TRIGGER_
254d0 44 45 50 54 48 22 2c 20 20 20 20 20 20 20 53 51  DEPTH",       SQ
254e0 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47  LITE_LIMIT_TRIGG
254f0 45 52 5f 44 45 50 54 48 20 20 20 20 20 20 20 20  ER_DEPTH        
25500 7d 2c 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 4f  },.    .    /* O
25510 75 74 20 6f 66 20 72 61 6e 67 65 20 74 65 73 74  ut of range test
25520 20 63 61 73 65 73 20 2a 2f 0a 20 20 20 20 7b 20   cases */.    { 
25530 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 4f  "SQLITE_LIMIT_TO
25540 4f 53 4d 41 4c 4c 22 2c 20 20 20 20 20 20 20 20  OSMALL",        
25550 20 20 20 20 2d 31 2c 20 20 20 20 20 20 20 20 20      -1,         
25560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25570 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
25580 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 4f 4f  SQLITE_LIMIT_TOO
25590 42 49 47 22 2c 20 20 20 20 20 20 20 20 20 20 20  BIG",           
255a0 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
255b0 54 52 49 47 47 45 52 5f 44 45 50 54 48 2b 31 20  TRIGGER_DEPTH+1 
255c0 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69       },.  };.  i
255d0 6e 74 20 69 2c 20 69 64 3b 0a 20 20 69 6e 74 20  nt i, id;.  int 
255e0 76 61 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  val;.  const cha
255f0 72 20 2a 7a 49 64 3b 0a 0a 20 20 69 66 28 20 6f  r *zId;..  if( o
25600 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
25610 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
25620 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
25630 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
25640 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
25650 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
25660 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
25670 20 44 42 20 49 44 20 56 41 4c 55 45 22 2c 20 30   DB ID VALUE", 0
25680 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
25690 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
256a0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
256b0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
256c0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
256d0 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
256e0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 49 64 20 3d  L_ERROR;.  zId =
256f0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
25700 62 6a 76 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69  bjv[2]);.  for(i
25710 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 49 64  =0; i<sizeof(aId
25720 29 2f 73 69 7a 65 6f 66 28 61 49 64 5b 30 5d 29  )/sizeof(aId[0])
25730 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
25740 73 74 72 63 6d 70 28 7a 49 64 2c 20 61 49 64 5b  strcmp(zId, aId[
25750 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
25760 20 20 20 20 20 20 69 64 20 3d 20 61 49 64 5b 69        id = aId[i
25770 5d 2e 69 64 3b 0a 20 20 20 20 20 20 62 72 65 61  ].id;.      brea
25780 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
25790 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28 61 49 64  f( i>=sizeof(aId
257a0 29 2f 73 69 7a 65 6f 66 28 61 49 64 5b 30 5d 29  )/sizeof(aId[0])
257b0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
257c0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
257d0 20 22 75 6e 6b 6e 6f 77 6e 20 6c 69 6d 69 74 20   "unknown limit 
257e0 74 79 70 65 3a 20 22 2c 20 7a 49 64 2c 20 28 63  type: ", zId, (c
257f0 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74  har*)0);.    ret
25800 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
25810 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
25820 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
25830 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c  p, objv[3], &val
25840 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
25850 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
25860 69 74 65 33 5f 6c 69 6d 69 74 28 64 62 2c 20 69  ite3_limit(db, i
25870 64 2c 20 76 61 6c 29 3b 0a 20 20 54 63 6c 5f 53  d, val);.  Tcl_S
25880 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
25890 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
258a0 6a 28 72 63 29 29 3b 0a 20 20 72 65 74 75 72 6e  j(rc));.  return
258b0 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a   TCL_OK;  .}../*
258c0 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 61 76  .** tclcmd:  sav
258d0 65 5f 70 72 6e 67 5f 73 74 61 74 65 0a 2a 2a 0a  e_prng_state.**.
258e0 2a 2a 20 53 61 76 65 20 74 68 65 20 73 74 61 74  ** Save the stat
258f0 65 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d  e of the pseudo-
25900 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65  random number ge
25910 6e 65 72 61 74 6f 72 2e 0a 2a 2a 20 41 74 20 74  nerator..** At t
25920 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 76 65  he same time, ve
25930 72 69 66 79 20 74 68 61 74 20 73 71 6c 69 74 65  rify that sqlite
25940 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 20 77  3_test_control w
25950 6f 72 6b 73 20 65 76 65 6e 20 77 68 65 6e 0a 2a  orks even when.*
25960 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6e  * called with an
25970 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 6f 70   out-of-range op
25980 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
25990 69 6e 74 20 73 61 76 65 5f 70 72 6e 67 5f 73 74  int save_prng_st
259a0 61 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  ate(.  ClientDat
259b0 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
259c0 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
259d0 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
259e0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
259f0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
25a00 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
25a10 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
25a20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
25a30 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
25a40 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
25a50 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
25a60 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
25a70 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
25a80 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
25a90 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
25aa0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
25ab0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 39  3_test_control(9
25ac0 39 39 39 29 3b 0a 20 20 61 73 73 65 72 74 28 20  999);.  assert( 
25ad0 72 63 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20  rc==0 );.  rc = 
25ae0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
25af0 74 72 6f 6c 28 2d 31 29 3b 0a 20 20 61 73 73 65  trol(-1);.  asse
25b00 72 74 28 20 72 63 3d 3d 30 20 29 3b 0a 20 20 73  rt( rc==0 );.  s
25b10 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
25b20 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
25b30 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45 29 3b 0a  TRL_PRNG_SAVE);.
25b40 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
25b50 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  .}./*.** tclcmd:
25b60 20 20 72 65 73 74 6f 72 65 5f 70 72 6e 67 5f 73    restore_prng_s
25b70 74 61 74 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tate.*/.static i
25b80 6e 74 20 72 65 73 74 6f 72 65 5f 70 72 6e 67 5f  nt restore_prng_
25b90 73 74 61 74 65 28 0a 20 20 43 6c 69 65 6e 74 44  state(.  ClientD
25ba0 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
25bb0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
25bc0 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
25bd0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
25be0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
25bf0 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
25c00 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
25c10 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
25c20 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
25c30 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
25c40 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
25c50 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
25c60 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
25c70 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
25c80 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
25c90 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  .  sqlite3_test_
25ca0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
25cb0 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53  ESTCTRL_PRNG_RES
25cc0 54 4f 52 45 29 3b 0a 20 20 72 65 74 75 72 6e 20  TORE);.  return 
25cd0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  TCL_OK;.}./*.** 
25ce0 74 63 6c 63 6d 64 3a 20 20 72 65 73 65 74 5f 70  tclcmd:  reset_p
25cf0 72 6e 67 5f 73 74 61 74 65 0a 2a 2f 0a 73 74 61  rng_state.*/.sta
25d00 74 69 63 20 69 6e 74 20 72 65 73 65 74 5f 70 72  tic int reset_pr
25d10 6e 67 5f 73 74 61 74 65 28 0a 20 20 43 6c 69 65  ng_state(.  Clie
25d20 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
25d30 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
25d40 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
25d50 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
25d60 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
25d70 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
25d80 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
25d90 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
25da0 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
25db0 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
25dc0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
25dd0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
25de0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
25df0 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
25e00 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
25e10 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74 65  .){.  sqlite3_te
25e20 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
25e30 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f  E_TESTCTRL_PRNG_
25e40 52 45 53 45 54 29 3b 0a 20 20 72 65 74 75 72 6e  RESET);.  return
25e50 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
25e60 2a 20 74 63 6c 63 6d 64 3a 20 20 70 63 61 63 68  * tclcmd:  pcach
25e70 65 5f 73 74 61 74 73 0a 2a 2f 0a 73 74 61 74 69  e_stats.*/.stati
25e80 63 20 69 6e 74 20 74 65 73 74 5f 70 63 61 63 68  c int test_pcach
25e90 65 5f 73 74 61 74 73 28 0a 20 20 43 6c 69 65 6e  e_stats(.  Clien
25ea0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
25eb0 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
25ec0 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
25ed0 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
25ee0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
25ef0 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
25f00 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
25f10 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
25f20 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
25f30 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
25f40 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
25f50 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
25f60 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
25f70 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
25f80 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
25f90 29 7b 0a 20 20 69 6e 74 20 6e 4d 69 6e 3b 0a 20  ){.  int nMin;. 
25fa0 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 69 6e 74   int nMax;.  int
25fb0 20 6e 43 75 72 72 65 6e 74 3b 0a 20 20 69 6e 74   nCurrent;.  int
25fc0 20 6e 52 65 63 79 63 6c 61 62 6c 65 3b 0a 20 20   nRecyclable;.  
25fd0 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a  Tcl_Obj *pRet;..
25fe0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
25ff0 74 61 74 73 28 26 6e 43 75 72 72 65 6e 74 2c 20  tats(&nCurrent, 
26000 26 6e 4d 61 78 2c 20 26 6e 4d 69 6e 2c 20 26 6e  &nMax, &nMin, &n
26010 52 65 63 79 63 6c 61 62 6c 65 29 3b 0a 0a 20 20  Recyclable);..  
26020 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62  pRet = Tcl_NewOb
26030 6a 28 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  j();.  Tcl_ListO
26040 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
26050 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63  interp, pRet, Tc
26060 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
26070 63 75 72 72 65 6e 74 22 2c 20 2d 31 29 29 3b 0a  current", -1));.
26080 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
26090 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
260a0 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
260b0 49 6e 74 4f 62 6a 28 6e 43 75 72 72 65 6e 74 29  IntObj(nCurrent)
260c0 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
260d0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
260e0 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f  terp, pRet, Tcl_
260f0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 61  NewStringObj("ma
26100 78 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  x", -1));.  Tcl_
26110 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
26120 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
26130 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  t, Tcl_NewIntObj
26140 28 6e 4d 61 78 29 29 3b 0a 20 20 54 63 6c 5f 4c  (nMax));.  Tcl_L
26150 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
26160 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ent(interp, pRet
26170 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
26180 62 6a 28 22 6d 69 6e 22 2c 20 2d 31 29 29 3b 0a  bj("min", -1));.
26190 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
261a0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
261b0 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
261c0 49 6e 74 4f 62 6a 28 6e 4d 69 6e 29 29 3b 0a 20  IntObj(nMin));. 
261d0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
261e0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
261f0 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53  , pRet, Tcl_NewS
26200 74 72 69 6e 67 4f 62 6a 28 22 72 65 63 79 63 6c  tringObj("recycl
26210 61 62 6c 65 22 2c 20 2d 31 29 29 3b 0a 20 20 54  able", -1));.  T
26220 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
26230 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
26240 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  pRet, Tcl_NewInt
26250 4f 62 6a 28 6e 52 65 63 79 63 6c 61 62 6c 65 29  Obj(nRecyclable)
26260 29 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  );..  Tcl_SetObj
26270 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
26280 52 65 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Ret);..  return 
26290 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65  TCL_OK;.}..#ifde
262a0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
262b0 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73 74  UNLOCK_NOTIFY.st
262c0 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 75  atic void test_u
262d0 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f 63 62 28  nlock_notify_cb(
262e0 76 6f 69 64 20 2a 2a 61 41 72 67 2c 20 69 6e 74  void **aArg, int
262f0 20 6e 41 72 67 29 7b 0a 20 20 69 6e 74 20 69 69   nArg){.  int ii
26300 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  ;.  for(ii=0; ii
26310 3c 6e 41 72 67 3b 20 69 69 2b 2b 29 7b 0a 20 20  <nArg; ii++){.  
26320 20 20 54 63 6c 5f 45 76 61 6c 45 78 28 28 54 63    Tcl_EvalEx((Tc
26330 6c 5f 49 6e 74 65 72 70 20 2a 29 61 41 72 67 5b  l_Interp *)aArg[
26340 69 69 5d 2c 20 22 75 6e 6c 6f 63 6b 5f 6e 6f 74  ii], "unlock_not
26350 69 66 79 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56  ify", -1, TCL_EV
26360 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 7d 0a  AL_GLOBAL);.  }.
26370 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
26380 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b  TE_ENABLE_UNLOCK
26390 5f 4e 4f 54 49 46 59 20 2a 2f 0a 0a 2f 2a 0a 2a  _NOTIFY */../*.*
263a0 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74  * tclcmd:  sqlit
263b0 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  e3_unlock_notify
263c0 20 64 62 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51   db.*/.#ifdef SQ
263d0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f  LITE_ENABLE_UNLO
263e0 43 4b 5f 4e 4f 54 49 46 59 0a 73 74 61 74 69 63  CK_NOTIFY.static
263f0 20 69 6e 74 20 74 65 73 74 5f 75 6e 6c 6f 63 6b   int test_unlock
26400 5f 6e 6f 74 69 66 79 28 0a 20 20 43 6c 69 65 6e  _notify(.  Clien
26410 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
26420 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20  , /* Unused */. 
26430 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
26440 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
26450 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
26460 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
26470 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
26480 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
26490 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
264a0 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
264b0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
264c0 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
264d0 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
264e0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
264f0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
26500 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
26510 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
26520 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
26530 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 20 20 72  jv, "DB");.    r
26540 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
26550 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 44  .  }..  if( getD
26560 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
26570 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
26580 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b  bjv[1]), &db) ){
26590 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
265a0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20  ERROR;.  }.  rc 
265b0 3d 20 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b  = sqlite3_unlock
265c0 5f 6e 6f 74 69 66 79 28 64 62 2c 20 74 65 73 74  _notify(db, test
265d0 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f 63  _unlock_notify_c
265e0 62 2c 20 28 76 6f 69 64 20 2a 29 69 6e 74 65 72  b, (void *)inter
265f0 70 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73  p);.  Tcl_SetRes
26600 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
26610 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28  r *)t1ErrorName(
26620 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  rc), TCL_STATIC)
26630 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
26640 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
26650 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69  ** tclcmd:  sqli
26660 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
26670 6e 74 20 64 62 20 3f 4e 41 4d 45 3f 0a 2a 2f 0a  nt db ?NAME?.*/.
26680 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
26690 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 0a  wal_checkpoint(.
266a0 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
266b0 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73  entData, /* Unus
266c0 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
266d0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
266e0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
266f0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
26700 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
26710 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
26720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
26730 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
26740 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
26750 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
26760 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
26770 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  nts */.){.  char
26780 20 2a 7a 44 62 20 3d 20 30 3b 0a 20 20 73 71 6c   *zDb = 0;.  sql
26790 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
267a0 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
267b0 3d 33 20 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b  =3 && objc!=2 ){
267c0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
267d0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
267e0 20 6f 62 6a 76 2c 20 22 44 42 20 3f 4e 41 4d 45   objv, "DB ?NAME
267f0 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ?");.    return 
26800 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
26810 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
26820 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
26830 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
26840 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72  ), &db) ){.    r
26850 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
26860 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d  .  }.  if( objc=
26870 3d 33 20 29 7b 0a 20 20 20 20 7a 44 62 20 3d 20  =3 ){.    zDb = 
26880 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
26890 6a 76 5b 32 5d 29 3b 0a 20 20 7d 0a 20 20 72 63  jv[2]);.  }.  rc
268a0 20 3d 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63   = sqlite3_wal_c
268b0 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 7a 44  heckpoint(db, zD
268c0 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73  b);.  Tcl_SetRes
268d0 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
268e0 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28  r *)t1ErrorName(
268f0 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  rc), TCL_STATIC)
26900 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
26910 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  K;.}../*.** tclc
26920 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  md:  sqlite3_wal
26930 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 20 64  _checkpoint_v2 d
26940 62 20 4d 4f 44 45 20 3f 4e 41 4d 45 3f 0a 2a 2a  b MODE ?NAME?.**
26950 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  .** This command
26960 20 63 61 6c 6c 73 20 74 68 65 20 77 61 6c 5f 63   calls the wal_c
26970 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 29 20 66  heckpoint_v2() f
26980 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65  unction with the
26990 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 6d 6f   specified.** mo
269a0 64 65 20 61 72 67 75 6d 65 6e 74 20 28 70 61 73  de argument (pas
269b0 73 69 76 65 2c 20 66 75 6c 6c 20 6f 72 20 72 65  sive, full or re
269c0 73 74 61 72 74 29 2e 20 49 66 20 70 72 65 73 65  start). If prese
269d0 6e 74 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  nt, the database
269e0 20 6e 61 6d 65 0a 2a 2a 20 4e 41 4d 45 20 69 73   name.** NAME is
269f0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
26a00 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
26a10 6f 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  o wal_checkpoint
26a20 5f 76 32 28 29 2e 20 49 66 20 69 74 20 74 68 65  _v2(). If it the
26a30 0a 2a 2a 20 4e 41 4d 45 20 61 72 67 75 6d 65 6e  .** NAME argumen
26a40 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74  t is not present
26a50 2c 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  , a NULL pointer
26a60 20 69 73 20 70 61 73 73 65 64 20 69 6e 73 74 65   is passed inste
26a70 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 61 6c  ad..**.** If wal
26a80 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 29  _checkpoint_v2()
26a90 20 72 65 74 75 72 6e 73 20 61 6e 79 20 76 61 6c   returns any val
26aa0 75 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  ue other than SQ
26ab0 4c 49 54 45 5f 42 55 53 59 20 6f 72 0a 2a 2a 20  LITE_BUSY or.** 
26ac0 53 51 4c 49 54 45 5f 4f 4b 2c 20 74 68 65 6e 20  SQLITE_OK, then 
26ad0 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 72 65 74  this command ret
26ae0 75 72 6e 73 20 54 43 4c 5f 45 52 52 4f 52 2e 20  urns TCL_ERROR. 
26af0 54 68 65 20 54 63 6c 20 72 65 73 75 6c 74 20 69  The Tcl result i
26b00 73 20 73 65 74 0a 2a 2a 20 74 6f 20 74 68 65 20  s set.** to the 
26b10 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6f 62  error message ob
26b20 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
26b30 74 65 33 5f 65 72 72 6d 73 67 28 29 2e 0a 2a 2a  te3_errmsg()..**
26b40 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74  .** Otherwise, t
26b50 68 69 73 20 63 6f 6d 6d 61 6e 64 20 72 65 74 75  his command retu
26b60 72 6e 73 20 61 20 6c 69 73 74 20 6f 66 20 74 68  rns a list of th
26b70 72 65 65 20 69 6e 74 65 67 65 72 73 2e 20 54 68  ree integers. Th
26b80 65 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 0a  e first integer.
26b90 2a 2a 20 69 73 20 31 20 69 66 20 53 51 4c 49 54  ** is 1 if SQLIT
26ba0 45 5f 42 55 53 59 20 77 61 73 20 72 65 74 75 72  E_BUSY was retur
26bb0 6e 65 64 2c 20 6f 72 20 30 20 6f 74 68 65 72 77  ned, or 0 otherw
26bc0 69 73 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ise. The followi
26bd0 6e 67 20 74 77 6f 20 69 6e 74 65 67 65 72 73 0a  ng two integers.
26be0 2a 2a 20 61 72 65 20 74 68 65 20 76 61 6c 75 65  ** are the value
26bf0 73 20 72 65 74 75 72 6e 65 64 20 76 69 61 20 74  s returned via t
26c00 68 65 20 6f 75 74 70 75 74 20 70 61 72 61 6d 61  he output parama
26c10 74 65 72 73 20 62 79 20 77 61 6c 5f 63 68 65 63  ters by wal_chec
26c20 6b 70 6f 69 6e 74 5f 76 32 28 29 20 2d 0a 2a 2a  kpoint_v2() -.**
26c30 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
26c40 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67  rames in the log
26c50 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20   and the number 
26c60 6f 66 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65  of frames in the
26c70 20 6c 6f 67 0a 2a 2a 20 74 68 61 74 20 68 61 76   log.** that hav
26c80 65 20 62 65 65 6e 20 63 68 65 63 6b 70 6f 69 6e  e been checkpoin
26c90 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
26ca0 6e 74 20 74 65 73 74 5f 77 61 6c 5f 63 68 65 63  nt test_wal_chec
26cb0 6b 70 6f 69 6e 74 5f 76 32 28 0a 20 20 43 6c 69  kpoint_v2(.  Cli
26cc0 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
26cd0 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f  ta, /* Unused */
26ce0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
26cf0 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
26d00 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
26d10 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
26d20 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
26d30 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
26d40 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
26d50 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
26d60 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
26d70 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
26d80 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
26d90 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62  /.){.  char *zDb
26da0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20   = 0;.  sqlite3 
26db0 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  *db;.  int rc;..
26dc0 20 20 69 6e 74 20 65 4d 6f 64 65 3b 0a 20 20 69    int eMode;.  i
26dd0 6e 74 20 6e 4c 6f 67 20 3d 20 2d 35 35 35 3b 0a  nt nLog = -555;.
26de0 20 20 69 6e 74 20 6e 43 6b 70 74 20 3d 20 2d 35    int nCkpt = -5
26df0 35 35 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  55;.  Tcl_Obj *p
26e00 52 65 74 3b 0a 0a 20 20 63 6f 6e 73 74 20 63 68  Ret;..  const ch
26e10 61 72 20 2a 20 61 4d 6f 64 65 5b 5d 20 3d 20 7b  ar * aMode[] = {
26e20 20 22 70 61 73 73 69 76 65 22 2c 20 22 66 75 6c   "passive", "ful
26e30 6c 22 2c 20 22 72 65 73 74 61 72 74 22 2c 20 30  l", "restart", 0
26e40 20 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   };.  assert( SQ
26e50 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
26e60 50 41 53 53 49 56 45 3d 3d 30 20 29 3b 0a 20 20  PASSIVE==0 );.  
26e70 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43  assert( SQLITE_C
26e80 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3d 3d  HECKPOINT_FULL==
26e90 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  1 );.  assert( S
26ea0 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
26eb0 5f 52 45 53 54 41 52 54 3d 3d 32 20 29 3b 0a 0a  _RESTART==2 );..
26ec0 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26    if( objc!=3 &&
26ed0 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
26ee0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
26ef0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
26f00 2c 20 22 44 42 20 4d 4f 44 45 20 3f 4e 41 4d 45  , "DB MODE ?NAME
26f10 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ?");.    return 
26f20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
26f30 20 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b    if( objc==4 ){
26f40 0a 20 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47  .    zDb = Tcl_G
26f50 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
26f60 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  );.  }.  if( get
26f70 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
26f80 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
26f90 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 0a 20  objv[1]), &db). 
26fa0 20 20 7c 7c 20 54 63 6c 5f 47 65 74 49 6e 64 65    || Tcl_GetInde
26fb0 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  xFromObj(interp,
26fc0 20 6f 62 6a 76 5b 32 5d 2c 20 61 4d 6f 64 65 2c   objv[2], aMode,
26fd0 20 22 6d 6f 64 65 22 2c 20 30 2c 20 26 65 4d 6f   "mode", 0, &eMo
26fe0 64 65 29 20 0a 20 20 29 7b 0a 20 20 20 20 72 65  de) .  ){.    re
26ff0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
27000 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69    }..  rc = sqli
27010 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
27020 6e 74 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 65  nt_v2(db, zDb, e
27030 4d 6f 64 65 2c 20 26 6e 4c 6f 67 2c 20 26 6e 43  Mode, &nLog, &nC
27040 6b 70 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  kpt);.  if( rc!=
27050 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
27060 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
27070 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
27080 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
27090 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  *)sqlite3_errmsg
270a0 28 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49  (db), TCL_VOLATI
270b0 4c 45 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  LE);.    return 
270c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
270d0 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77    pRet = Tcl_New
270e0 4f 62 6a 28 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  Obj();.  Tcl_Lis
270f0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
27100 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
27110 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63  Tcl_NewIntObj(rc
27120 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 3f 31 3a  ==SQLITE_BUSY?1:
27130 30 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  0));.  Tcl_ListO
27140 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
27150 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63  interp, pRet, Tc
27160 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 4c 6f 67  l_NewIntObj(nLog
27170 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
27180 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
27190 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c  nterp, pRet, Tcl
271a0 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 43 6b 70 74  _NewIntObj(nCkpt
271b0 29 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ));.  Tcl_SetObj
271c0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
271d0 52 65 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Ret);..  return 
271e0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
271f0 20 74 63 6c 63 6d 64 3a 20 20 74 65 73 74 5f 73   tclcmd:  test_s
27200 71 6c 69 74 65 33 5f 6c 6f 67 20 3f 53 43 52 49  qlite3_log ?SCRI
27210 50 54 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  PT?.*/.static st
27220 72 75 63 74 20 4c 6f 67 43 61 6c 6c 62 61 63 6b  ruct LogCallback
27230 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20   {.  Tcl_Interp 
27240 2a 70 49 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f  *pInterp;.  Tcl_
27250 4f 62 6a 20 2a 70 4f 62 6a 3b 0a 7d 20 6c 6f 67  Obj *pObj;.} log
27260 63 61 6c 6c 62 61 63 6b 20 3d 20 7b 30 2c 20 30  callback = {0, 0
27270 7d 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 78  };.static void x
27280 4c 6f 67 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64  Logcallback(void
27290 20 2a 75 6e 75 73 65 64 2c 20 69 6e 74 20 65 72   *unused, int er
272a0 72 2c 20 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0a  r, char *zMsg){.
272b0 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4e 65 77 20    Tcl_Obj *pNew 
272c0 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
272d0 62 6a 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70  bj(logcallback.p
272e0 4f 62 6a 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72  Obj);.  Tcl_Incr
272f0 52 65 66 43 6f 75 6e 74 28 70 4e 65 77 29 3b 0a  RefCount(pNew);.
27300 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
27310 65 6e 64 45 6c 65 6d 65 6e 74 28 0a 20 20 20 20  endElement(.    
27320 20 20 30 2c 20 70 4e 65 77 2c 20 54 63 6c 5f 4e    0, pNew, Tcl_N
27330 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69  ewStringObj(sqli
27340 74 65 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65  te3TestErrorName
27350 28 65 72 72 29 2c 20 2d 31 29 0a 20 20 29 3b 0a  (err), -1).  );.
27360 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
27370 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 4e  endElement(0, pN
27380 65 77 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  ew, Tcl_NewStrin
27390 67 4f 62 6a 28 7a 4d 73 67 2c 20 2d 31 29 29 3b  gObj(zMsg, -1));
273a0 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  .  Tcl_EvalObjEx
273b0 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 49 6e  (logcallback.pIn
273c0 74 65 72 70 2c 20 70 4e 65 77 2c 20 54 43 4c 5f  terp, pNew, TCL_
273d0 45 56 41 4c 5f 47 4c 4f 42 41 4c 7c 54 43 4c 5f  EVAL_GLOBAL|TCL_
273e0 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20  EVAL_DIRECT);.  
273f0 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
27400 28 70 4e 65 77 29 3b 0a 7d 0a 73 74 61 74 69 63  (pNew);.}.static
27410 20 69 6e 74 20 74 65 73 74 5f 73 71 6c 69 74 65   int test_sqlite
27420 33 5f 6c 6f 67 28 0a 20 20 43 6c 69 65 6e 74 44  3_log(.  ClientD
27430 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  ata clientData,.
27440 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
27450 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
27460 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
27470 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
27480 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
27490 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
274a0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
274b0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
274c0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
274d0 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
274e0 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
274f0 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63 3e 32  .){.  if( objc>2
27500 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
27510 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
27520 20 31 2c 20 6f 62 6a 76 2c 20 22 53 43 52 49 50   1, objv, "SCRIP
27530 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  T");.    return 
27540 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
27550 20 69 66 28 20 6c 6f 67 63 61 6c 6c 62 61 63 6b   if( logcallback
27560 2e 70 4f 62 6a 20 29 7b 0a 20 20 20 20 54 63 6c  .pObj ){.    Tcl
27570 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 6c 6f  _DecrRefCount(lo
27580 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 29 3b  gcallback.pObj);
27590 0a 20 20 20 20 6c 6f 67 63 61 6c 6c 62 61 63 6b  .    logcallback
275a0 2e 70 4f 62 6a 20 3d 20 30 3b 0a 20 20 20 20 6c  .pObj = 0;.    l
275b0 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 49 6e 74 65  ogcallback.pInte
275c0 72 70 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  rp = 0;.    sqli
275d0 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54  te3_config(SQLIT
275e0 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 2c 20 30 2c  E_CONFIG_LOG, 0,
275f0 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f   0);.  }.  if( o
27600 62 6a 63 3e 31 20 29 7b 0a 20 20 20 20 6c 6f 67  bjc>1 ){.    log
27610 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 20 3d 20  callback.pObj = 
27620 6f 62 6a 76 5b 31 5d 3b 0a 20 20 20 20 54 63 6c  objv[1];.    Tcl
27630 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 6c 6f  _IncrRefCount(lo
27640 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 29 3b  gcallback.pObj);
27650 0a 20 20 20 20 6c 6f 67 63 61 6c 6c 62 61 63 6b  .    logcallback
27660 2e 70 49 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  .pInterp = inter
27670 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  p;.    sqlite3_c
27680 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e  onfig(SQLITE_CON
27690 46 49 47 5f 4c 4f 47 2c 20 78 4c 6f 67 63 61 6c  FIG_LOG, xLogcal
276a0 6c 62 61 63 6b 2c 20 30 29 3b 0a 20 20 7d 0a 20  lback, 0);.  }. 
276b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
276c0 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 74 63 6c  }../*.**     tcl
276d0 5f 6f 62 6a 70 72 6f 63 20 43 4f 4d 4d 41 4e 44  _objproc COMMAND
276e0 4e 41 4d 45 20 41 52 47 53 2e 2e 2e 0a 2a 2a 0a  NAME ARGS....**.
276f0 2a 2a 20 52 75 6e 20 61 20 54 43 4c 20 63 6f 6d  ** Run a TCL com
27700 6d 61 6e 64 20 75 73 69 6e 67 20 69 74 73 20 6f  mand using its o
27710 62 6a 50 72 6f 63 20 69 6e 74 65 72 66 61 63 65  bjProc interface
27720 2e 20 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f  .  Throw an erro
27730 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6d 6d  r if.** the comm
27740 61 6e 64 20 68 61 73 20 6e 6f 20 6f 62 6a 50 72  and has no objPr
27750 6f 63 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  oc interface..*/
27760 0a 73 74 61 74 69 63 20 69 6e 74 20 72 75 6e 41  .static int runA
27770 73 4f 62 6a 50 72 6f 63 28 0a 20 20 76 6f 69 64  sObjProc(.  void
27780 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
27790 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
277a0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
277b0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
277c0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 54 63  T objv[].){.  Tc
277d0 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66  l_CmdInfo cmdInf
277e0 6f 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32 20  o;.  if( objc<2 
277f0 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
27800 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
27810 31 2c 20 6f 62 6a 76 2c 20 22 43 4f 4d 4d 41 4e  1, objv, "COMMAN
27820 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74  D ...");.    ret
27830 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
27840 20 7d 0a 20 20 69 66 28 20 21 54 63 6c 5f 47 65   }.  if( !Tcl_Ge
27850 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74  tCommandInfo(int
27860 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
27870 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 63 6d  ng(objv[1]), &cm
27880 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54 63  dInfo) ){.    Tc
27890 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
278a0 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20  nterp, "command 
278b0 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 0a 20 20  not found: ",.  
278c0 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74           Tcl_Get
278d0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
278e0 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
278f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
27900 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6d 64 49  ;.  }.  if( cmdI
27910 6e 66 6f 2e 6f 62 6a 50 72 6f 63 3d 3d 30 20 29  nfo.objProc==0 )
27920 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
27930 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
27940 63 6f 6d 6d 61 6e 64 20 68 61 73 20 6e 6f 20 6f  command has no o
27950 62 6a 50 72 6f 63 3a 20 22 2c 0a 20 20 20 20 20  bjProc: ",.     
27960 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
27970 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 28 63  ing(objv[1]), (c
27980 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74  har*)0);.    ret
27990 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
279a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6d 64 49   }.  return cmdI
279b0 6e 66 6f 2e 6f 62 6a 50 72 6f 63 28 63 6d 64 49  nfo.objProc(cmdI
279c0 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74  nfo.objClientDat
279d0 61 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2d  a, interp, objc-
279e0 31 2c 20 6f 62 6a 76 2b 31 29 3b 0a 7d 0a 0a 23  1, objv+1);.}..#
279f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
27a00 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a  IT_EXPLAIN./*.**
27a10 20 57 41 52 4e 49 4e 47 3a 20 54 68 65 20 66 6f   WARNING: The fo
27a20 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llowing function
27a30 2c 20 70 72 69 6e 74 45 78 70 6c 61 69 6e 51 75  , printExplainQu
27a40 65 72 79 50 6c 61 6e 28 29 20 69 73 20 61 6e 20  eryPlan() is an 
27a50 65 78 61 63 74 0a 2a 2a 20 63 6f 70 79 20 6f 66  exact.** copy of
27a60 20 65 78 61 6d 70 6c 65 20 63 6f 64 65 20 66 72   example code fr
27a70 6f 6d 20 65 71 70 2e 69 6e 20 28 65 71 70 2e 68  om eqp.in (eqp.h
27a80 74 6d 6c 29 2e 20 49 66 20 74 68 69 73 20 63 6f  tml). If this co
27a90 64 65 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 0a  de is modified,.
27aa0 2a 2a 20 74 68 65 6e 20 74 68 65 20 64 6f 63 75  ** then the docu
27ab0 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 70 79 20 6e  mentation copy n
27ac0 65 65 64 73 20 74 6f 20 62 65 20 6d 6f 64 69 66  eeds to be modif
27ad0 69 65 64 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a  ied as well..*/.
27ae0 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  /*.** Argument p
27af0 53 74 6d 74 20 69 73 20 61 20 70 72 65 70 61 72  Stmt is a prepar
27b00 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ed SQL statement
27b10 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
27b20 63 6f 6d 70 69 6c 65 73 0a 2a 2a 20 61 6e 20 45  compiles.** an E
27b30 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
27b40 4e 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 72 65 70  N command to rep
27b50 6f 72 74 20 6f 6e 20 74 68 65 20 70 72 65 70 61  ort on the prepa
27b60 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a  red statement,.*
27b70 2a 20 61 6e 64 20 70 72 69 6e 74 73 20 74 68 65  * and prints the
27b80 20 72 65 70 6f 72 74 20 74 6f 20 73 74 64 6f 75   report to stdou
27b90 74 20 75 73 69 6e 67 20 70 72 69 6e 74 66 28 29  t using printf()
27ba0 2e 0a 2a 2f 0a 69 6e 74 20 70 72 69 6e 74 45 78  ..*/.int printEx
27bb0 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 73  plainQueryPlan(s
27bc0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
27bd0 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  mt){.  const cha
27be0 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20  r *zSql;        
27bf0 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20         /* Input 
27c00 53 51 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  SQL */.  char *z
27c10 45 78 70 6c 61 69 6e 3b 20 20 20 20 20 20 20 20  Explain;        
27c20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20           /* SQL 
27c30 77 69 74 68 20 45 58 50 4c 41 49 4e 20 51 55 45  with EXPLAIN QUE
27c40 52 59 20 50 4c 41 4e 20 70 72 65 70 65 6e 64 65  RY PLAN prepende
27c50 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  d */.  sqlite3_s
27c60 74 6d 74 20 2a 70 45 78 70 6c 61 69 6e 3b 20 20  tmt *pExplain;  
27c70 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 69 6c         /* Compil
27c80 65 64 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  ed EXPLAIN QUERY
27c90 20 50 4c 41 4e 20 63 6f 6d 6d 61 6e 64 20 2a 2f   PLAN command */
27ca0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
27cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27cc0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
27cd0 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 70  e from sqlite3_p
27ce0 72 65 70 61 72 65 5f 76 32 28 29 20 2a 2f 0a 0a  repare_v2() */..
27cf0 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
27d00 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20 69  _sql(pStmt);.  i
27d10 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74  f( zSql==0 ) ret
27d20 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
27d30 3b 0a 0a 20 20 7a 45 78 70 6c 61 69 6e 20 3d 20  ;..  zExplain = 
27d40 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
27d50 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50  "EXPLAIN QUERY P
27d60 4c 41 4e 20 25 73 22 2c 20 7a 53 71 6c 29 3b 0a  LAN %s", zSql);.
27d70 20 20 69 66 28 20 7a 45 78 70 6c 61 69 6e 3d 3d    if( zExplain==
27d80 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
27d90 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 72 63 20 3d  E_NOMEM;..  rc =
27da0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
27db0 5f 76 32 28 73 71 6c 69 74 65 33 5f 64 62 5f 68  _v2(sqlite3_db_h
27dc0 61 6e 64 6c 65 28 70 53 74 6d 74 29 2c 20 7a 45  andle(pStmt), zE
27dd0 78 70 6c 61 69 6e 2c 20 2d 31 2c 20 26 70 45 78  xplain, -1, &pEx
27de0 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 73 71 6c  plain, 0);.  sql
27df0 69 74 65 33 5f 66 72 65 65 28 7a 45 78 70 6c 61  ite3_free(zExpla
27e00 69 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  in);.  if( rc!=S
27e10 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
27e20 6e 20 72 63 3b 0a 0a 20 20 77 68 69 6c 65 28 20  n rc;..  while( 
27e30 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
27e40 74 65 33 5f 73 74 65 70 28 70 45 78 70 6c 61 69  te3_step(pExplai
27e50 6e 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 53  n) ){.    int iS
27e60 65 6c 65 63 74 69 64 20 3d 20 73 71 6c 69 74 65  electid = sqlite
27e70 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78  3_column_int(pEx
27e80 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20 69  plain, 0);.    i
27e90 6e 74 20 69 4f 72 64 65 72 20 3d 20 73 71 6c 69  nt iOrder = sqli
27ea0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
27eb0 45 78 70 6c 61 69 6e 2c 20 31 29 3b 0a 20 20 20  Explain, 1);.   
27ec0 20 69 6e 74 20 69 46 72 6f 6d 20 3d 20 73 71 6c   int iFrom = sql
27ed0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
27ee0 70 45 78 70 6c 61 69 6e 2c 20 32 29 3b 0a 20 20  pExplain, 2);.  
27ef0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
27f00 65 74 61 69 6c 20 3d 20 28 63 6f 6e 73 74 20 63  etail = (const c
27f10 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f  har *)sqlite3_co
27f20 6c 75 6d 6e 5f 74 65 78 74 28 70 45 78 70 6c 61  lumn_text(pExpla
27f30 69 6e 2c 20 33 29 3b 0a 0a 20 20 20 20 70 72 69  in, 3);..    pri
27f40 6e 74 66 28 22 25 64 20 25 64 20 25 64 20 25 73  ntf("%d %d %d %s
27f50 5c 6e 22 2c 20 69 53 65 6c 65 63 74 69 64 2c 20  \n", iSelectid, 
27f60 69 4f 72 64 65 72 2c 20 69 46 72 6f 6d 2c 20 7a  iOrder, iFrom, z
27f70 44 65 74 61 69 6c 29 3b 0a 20 20 7d 0a 0a 20 20  Detail);.  }..  
27f80 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 66  return sqlite3_f
27f90 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e  inalize(pExplain
27fa0 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
27fb0 20 74 65 73 74 5f 70 72 69 6e 74 5f 65 71 70 28   test_print_eqp(
27fc0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
27fd0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
27fe0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
27ff0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
28000 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
28010 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
28020 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
28030 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  mt;..  if( objc!
28040 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
28050 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
28060 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d  p, 1, objv, "STM
28070 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  T");.    return 
28080 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
28090 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
280a0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
280b0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
280c0 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
280d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
280e0 20 20 72 63 20 3d 20 70 72 69 6e 74 45 78 70 6c    rc = printExpl
280f0 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 70 53 74  ainQueryPlan(pSt
28100 6d 74 29 3b 0a 20 20 2f 2a 20 54 68 69 73 20 69  mt);.  /* This i
28110 73 20 6e 65 65 64 65 64 20 6f 6e 20 57 69 6e 64  s needed on Wind
28120 6f 77 73 20 73 6f 20 74 68 61 74 20 61 20 74 65  ows so that a te
28130 73 74 20 63 61 73 65 20 75 73 69 6e 67 20 74 68  st case using th
28140 69 73 20 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  is .  ** functio
28150 6e 20 63 61 6e 20 6f 70 65 6e 20 61 20 72 65 61  n can open a rea
28160 64 20 70 69 70 65 20 61 6e 64 20 67 65 74 20 74  d pipe and get t
28170 68 65 20 6f 75 74 70 75 74 20 6f 66 0a 20 20 2a  he output of.  *
28180 2a 20 70 72 69 6e 74 45 78 70 6c 61 69 6e 51 75  * printExplainQu
28190 65 72 79 50 6c 61 6e 28 29 20 69 6d 6d 65 64 69  eryPlan() immedi
281a0 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 66 66  ately..  */.  ff
281b0 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20  lush(stdout);.  
281c0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
281d0 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
281e0 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30  ErrorName(rc), 0
281f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
28200 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
28210 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
28220 41 49 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 73 71  AIN */../*.** sq
28230 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
28240 6f 6c 20 56 45 52 42 20 41 52 47 53 2e 2e 2e 0a  ol VERB ARGS....
28250 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
28260 73 74 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  st_test_control(
28270 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
28280 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
28290 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
282a0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
282b0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
282c0 29 7b 0a 20 20 73 74 72 75 63 74 20 56 65 72 62  ){.  struct Verb
282d0 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
282e0 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e  r *zName;.    in
282f0 74 20 69 3b 0a 20 20 7d 20 61 56 65 72 62 5b 5d  t i;.  } aVerb[]
28300 20 3d 20 7b 0a 20 20 20 20 7b 20 22 53 51 4c 49   = {.    { "SQLI
28310 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41  TE_TESTCTRL_LOCA
28320 4c 54 49 4d 45 5f 46 41 55 4c 54 22 2c 20 53 51  LTIME_FAULT", SQ
28330 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f  LITE_TESTCTRL_LO
28340 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 20 7d 2c  CALTIME_FAULT },
28350 20 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 56 65   .  };.  int iVe
28360 72 62 3b 0a 20 20 69 6e 74 20 69 46 6c 61 67 3b  rb;.  int iFlag;
28370 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
28380 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20 20  ( objc<2 ){.    
28390 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
283a0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
283b0 2c 20 22 56 45 52 42 20 41 52 47 53 2e 2e 2e 22  , "VERB ARGS..."
283c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
283d0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
283e0 72 63 20 3d 20 54 63 6c 5f 47 65 74 49 6e 64 65  rc = Tcl_GetInde
283f0 78 46 72 6f 6d 4f 62 6a 53 74 72 75 63 74 28 0a  xFromObjStruct(.
28400 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 6f 62        interp, ob
28410 6a 76 5b 31 5d 2c 20 61 56 65 72 62 2c 20 73 69  jv[1], aVerb, si
28420 7a 65 6f 66 28 61 56 65 72 62 5b 30 5d 29 2c 20  zeof(aVerb[0]), 
28430 22 56 45 52 42 22 2c 20 30 2c 20 26 69 56 65 72  "VERB", 0, &iVer
28440 62 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 21  b.  );.  if( rc!
28450 3d 54 43 4c 5f 4f 4b 20 29 20 72 65 74 75 72 6e  =TCL_OK ) return
28460 20 72 63 3b 0a 0a 20 20 69 46 6c 61 67 20 3d 20   rc;..  iFlag = 
28470 61 56 65 72 62 5b 69 56 65 72 62 5d 2e 69 3b 0a  aVerb[iVerb].i;.
28480 20 20 73 77 69 74 63 68 28 20 69 46 6c 61 67 20    switch( iFlag 
28490 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
284a0 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41  TE_TESTCTRL_LOCA
284b0 4c 54 49 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a 20  LTIME_FAULT: {. 
284c0 20 20 20 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20       int val;.  
284d0 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
284e0 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57  ){.        Tcl_W
284f0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
28500 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4f 4e  rp, 2, objv, "ON
28510 4f 46 46 22 29 3b 0a 20 20 20 20 20 20 20 20 72  OFF");.        r
28520 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
28530 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
28540 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  f( Tcl_GetBoolea
28550 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
28560 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61 6c 29 20   objv[2], &val) 
28570 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
28580 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  OR;.      sqlite
28590 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
285a0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c  QLITE_TESTCTRL_L
285b0 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 2c 20  OCALTIME_FAULT, 
285c0 76 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  val);.      brea
285d0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
285e0 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
285f0 69 6e 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72  interp);.  retur
28600 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  n TCL_OK;.}..#if
28610 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 2f   SQLITE_OS_WIN./
28620 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e  *.** Information
28630 20 70 61 73 73 65 64 20 66 72 6f 6d 20 74 68 65   passed from the
28640 20 6d 61 69 6e 20 74 68 72 65 61 64 20 69 6e 74   main thread int
28650 6f 20 74 68 65 20 77 69 6e 64 6f 77 73 20 66 69  o the windows fi
28660 6c 65 20 6c 6f 63 6b 65 72 0a 2a 2a 20 62 61 63  le locker.** bac
28670 6b 67 72 6f 75 6e 64 20 74 68 72 65 61 64 2e 0a  kground thread..
28680 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 33 32 46  */.struct win32F
28690 69 6c 65 4c 6f 63 6b 65 72 20 7b 0a 20 20 63 68  ileLocker {.  ch
286a0 61 72 20 2a 65 76 4e 61 6d 65 3b 20 20 20 20 20  ar *evName;     
286b0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 65 76 65    /* Name of eve
286c0 6e 74 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 72  nt to signal thr
286d0 65 61 64 20 73 74 61 72 74 75 70 20 2a 2f 0a 20  ead startup */. 
286e0 20 48 41 4e 44 4c 45 20 68 3b 20 20 20 20 20 20   HANDLE h;      
286f0 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f       /* Handle o
28700 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  f the file to be
28710 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74   locked */.  int
28720 20 64 65 6c 61 79 31 3b 20 20 20 20 20 20 20 20   delay1;        
28730 20 2f 2a 20 44 65 6c 61 79 20 62 65 66 6f 72 65   /* Delay before
28740 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 69 6e   locking */.  in
28750 74 20 64 65 6c 61 79 32 3b 20 20 20 20 20 20 20  t delay2;       
28760 20 20 2f 2a 20 44 65 6c 61 79 20 62 65 66 6f 72    /* Delay befor
28770 65 20 75 6e 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20  e unlocking */. 
28780 20 69 6e 74 20 6f 6b 3b 20 20 20 20 20 20 20 20   int ok;        
28790 20 20 20 20 20 2f 2a 20 46 69 6e 69 73 68 65 64       /* Finished
287a0 20 6f 6b 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72   ok */.  int err
287b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
287c0 54 72 75 65 20 69 66 20 61 6e 20 65 72 72 6f 72  True if an error
287d0 20 6f 63 63 75 72 73 20 2a 2f 0a 7d 3b 0a 23 65   occurs */.};.#e
287e0 6e 64 69 66 0a 0a 0a 23 69 66 20 53 51 4c 49 54  ndif...#if SQLIT
287f0 45 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20 54  E_OS_WIN./*.** T
28800 68 65 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 68  he background th
28810 72 65 61 64 20 74 68 61 74 20 64 6f 65 73 20 66  read that does f
28820 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a  ile locking..*/.
28830 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 33  static void win3
28840 32 5f 66 69 6c 65 5f 6c 6f 63 6b 65 72 28 76 6f  2_file_locker(vo
28850 69 64 20 2a 70 41 70 70 44 61 74 61 29 7b 0a 20  id *pAppData){. 
28860 20 73 74 72 75 63 74 20 77 69 6e 33 32 46 69 6c   struct win32Fil
28870 65 4c 6f 63 6b 65 72 20 2a 70 20 3d 20 28 73 74  eLocker *p = (st
28880 72 75 63 74 20 77 69 6e 33 32 46 69 6c 65 4c 6f  ruct win32FileLo
28890 63 6b 65 72 2a 29 70 41 70 70 44 61 74 61 3b 0a  cker*)pAppData;.
288a0 20 20 69 66 28 20 70 2d 3e 65 76 4e 61 6d 65 20    if( p->evName 
288b0 29 7b 0a 20 20 20 20 48 41 4e 44 4c 45 20 65 76  ){.    HANDLE ev
288c0 20 3d 20 4f 70 65 6e 45 76 65 6e 74 28 45 56 45   = OpenEvent(EVE
288d0 4e 54 5f 4d 4f 44 49 46 59 5f 53 54 41 54 45 2c  NT_MODIFY_STATE,
288e0 20 46 41 4c 53 45 2c 20 70 2d 3e 65 76 4e 61 6d   FALSE, p->evNam
288f0 65 29 3b 0a 20 20 20 20 69 66 20 28 20 65 76 20  e);.    if ( ev 
28900 29 7b 0a 20 20 20 20 20 20 53 65 74 45 76 65 6e  ){.      SetEven
28910 74 28 65 76 29 3b 0a 20 20 20 20 20 20 43 6c 6f  t(ev);.      Clo
28920 73 65 48 61 6e 64 6c 65 28 65 76 29 3b 0a 20 20  seHandle(ev);.  
28930 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d    }.  }.  if( p-
28940 3e 64 65 6c 61 79 31 20 29 20 53 6c 65 65 70 28  >delay1 ) Sleep(
28950 70 2d 3e 64 65 6c 61 79 31 29 3b 0a 20 20 69 66  p->delay1);.  if
28960 28 20 4c 6f 63 6b 46 69 6c 65 28 70 2d 3e 68 2c  ( LockFile(p->h,
28970 20 30 2c 20 30 2c 20 31 30 30 30 30 30 30 30 30   0, 0, 100000000
28980 2c 20 30 29 20 29 7b 0a 20 20 20 20 53 6c 65 65  , 0) ){.    Slee
28990 70 28 70 2d 3e 64 65 6c 61 79 32 29 3b 0a 20 20  p(p->delay2);.  
289a0 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 2d 3e    UnlockFile(p->
289b0 68 2c 20 30 2c 20 30 2c 20 31 30 30 30 30 30 30  h, 0, 0, 1000000
289c0 30 30 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 6f  00, 0);.    p->o
289d0 6b 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  k = 1;.  }else{.
289e0 20 20 20 20 70 2d 3e 65 72 72 20 3d 20 31 3b 0a      p->err = 1;.
289f0 20 20 7d 0a 20 20 43 6c 6f 73 65 48 61 6e 64 6c    }.  CloseHandl
28a00 65 28 70 2d 3e 68 29 3b 0a 20 20 70 2d 3e 68 20  e(p->h);.  p->h 
28a10 3d 20 30 3b 0a 20 20 70 2d 3e 64 65 6c 61 79 31  = 0;.  p->delay1
28a20 20 3d 20 30 3b 0a 20 20 70 2d 3e 64 65 6c 61 79   = 0;.  p->delay
28a30 32 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  2 = 0;.}.#endif.
28a40 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
28a50 49 4e 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 6c 6f  IN./*.**      lo
28a60 63 6b 5f 77 69 6e 33 32 5f 66 69 6c 65 20 46 49  ck_win32_file FI
28a70 4c 45 4e 41 4d 45 20 44 45 4c 41 59 31 20 44 45  LENAME DELAY1 DE
28a80 4c 41 59 32 0a 2a 2a 0a 2a 2a 20 47 65 74 20 61  LAY2.**.** Get a
28a90 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 61 6e 64  n exclusive mand
28aa0 69 74 6f 72 79 20 6c 6f 63 6b 20 6f 6e 20 66 69  itory lock on fi
28ab0 6c 65 20 66 6f 72 20 44 45 4c 41 59 32 20 6d 69  le for DELAY2 mi
28ac0 6c 6c 69 73 65 63 6f 6e 64 73 2e 0a 2a 2a 20 57  lliseconds..** W
28ad0 61 69 74 20 44 45 4c 41 59 31 20 6d 69 6c 6c 69  ait DELAY1 milli
28ae0 73 65 63 6f 6e 64 73 20 62 65 66 6f 72 65 20 61  seconds before a
28af0 63 71 75 69 72 69 6e 67 20 74 68 65 20 6c 6f 63  cquiring the loc
28b00 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
28b10 20 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b   win32_file_lock
28b20 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
28b30 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
28b40 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
28b50 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
28b60 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
28b70 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72  .){.  static str
28b80 75 63 74 20 77 69 6e 33 32 46 69 6c 65 4c 6f 63  uct win32FileLoc
28b90 6b 65 72 20 78 20 3d 20 7b 20 22 77 69 6e 33 32  ker x = { "win32
28ba0 5f 66 69 6c 65 5f 6c 6f 63 6b 22 2c 20 30 2c 20  _file_lock", 0, 
28bb0 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20  0, 0, 0, 0 };.  
28bc0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
28bd0 65 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20 7a 42  ename;.  char zB
28be0 75 66 5b 32 30 30 5d 3b 0a 20 20 69 6e 74 20 72  uf[200];.  int r
28bf0 65 74 72 79 20 3d 20 30 3b 0a 20 20 48 41 4e 44  etry = 0;.  HAND
28c00 4c 45 20 65 76 3b 0a 20 20 44 57 4f 52 44 20 77  LE ev;.  DWORD w
28c10 52 65 73 75 6c 74 3b 0a 20 20 0a 20 20 69 66 28  Result;.  .  if(
28c20 20 6f 62 6a 63 21 3d 34 20 26 26 20 6f 62 6a 63   objc!=4 && objc
28c30 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=1 ){.    Tcl_W
28c40 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
28c50 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 46 49  rp, 1, objv, "FI
28c60 4c 45 4e 41 4d 45 20 44 45 4c 41 59 31 20 44 45  LENAME DELAY1 DE
28c70 4c 41 59 32 22 29 3b 0a 20 20 20 20 72 65 74 75  LAY2");.    retu
28c80 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
28c90 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 31 20  }.  if( objc==1 
28ca0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
28cb0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
28cc0 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 20  Buf), zBuf, "%d 
28cd0 25 64 20 25 64 20 25 64 20 25 64 22 2c 0a 20 20  %d %d %d %d",.  
28ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cf0 20 20 20 78 2e 6f 6b 2c 20 78 2e 65 72 72 2c 20     x.ok, x.err, 
28d00 78 2e 64 65 6c 61 79 31 2c 20 78 2e 64 65 6c 61  x.delay1, x.dela
28d10 79 32 2c 20 78 2e 68 29 3b 0a 20 20 20 20 54 63  y2, x.h);.    Tc
28d20 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
28d30 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 28 63 68  nterp, zBuf, (ch
28d40 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75  ar*)0);.    retu
28d50 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a 20  rn TCL_OK;.  }. 
28d60 20 77 68 69 6c 65 28 20 78 2e 68 20 26 26 20 72   while( x.h && r
28d70 65 74 72 79 3c 33 30 20 29 7b 0a 20 20 20 20 72  etry<30 ){.    r
28d80 65 74 72 79 2b 2b 3b 0a 20 20 20 20 53 6c 65 65  etry++;.    Slee
28d90 70 28 31 30 30 29 3b 0a 20 20 7d 0a 20 20 69 66  p(100);.  }.  if
28da0 28 20 78 2e 68 20 29 7b 0a 20 20 20 20 54 63 6c  ( x.h ){.    Tcl
28db0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
28dc0 74 65 72 70 2c 20 22 62 75 73 79 22 2c 20 28 63  terp, "busy", (c
28dd0 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74  har*)0);.    ret
28de0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
28df0 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
28e00 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
28e10 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 78 2e 64  p, objv[2], &x.d
28e20 65 6c 61 79 31 29 20 29 20 72 65 74 75 72 6e 20  elay1) ) return 
28e30 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
28e40 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
28e50 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
28e60 33 5d 2c 20 26 78 2e 64 65 6c 61 79 32 29 20 29  3], &x.delay2) )
28e70 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
28e80 52 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  R;.  zFilename =
28e90 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
28ea0 62 6a 76 5b 31 5d 29 3b 0a 20 20 78 2e 68 20 3d  bjv[1]);.  x.h =
28eb0 20 43 72 65 61 74 65 46 69 6c 65 28 7a 46 69 6c   CreateFile(zFil
28ec0 65 6e 61 6d 65 2c 20 47 45 4e 45 52 49 43 5f 52  ename, GENERIC_R
28ed0 45 41 44 7c 47 45 4e 45 52 49 43 5f 57 52 49 54  EAD|GENERIC_WRIT
28ee0 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  E,.             
28ef0 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44   FILE_SHARE_READ
28f00 7c 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 54  |FILE_SHARE_WRIT
28f10 45 2c 20 30 2c 20 4f 50 45 4e 5f 41 4c 57 41 59  E, 0, OPEN_ALWAY
28f20 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
28f30 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
28f40 4e 4f 52 4d 41 4c 2c 20 30 29 3b 0a 20 20 69 66  NORMAL, 0);.  if
28f50 28 20 21 78 2e 68 20 29 7b 0a 20 20 20 20 54 63  ( !x.h ){.    Tc
28f60 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
28f70 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 6f  nterp, "cannot o
28f80 70 65 6e 20 66 69 6c 65 3a 20 22 2c 20 7a 46 69  pen file: ", zFi
28f90 6c 65 6e 61 6d 65 2c 20 28 63 68 61 72 2a 29 30  lename, (char*)0
28fa0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
28fb0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 65  L_ERROR;.  }.  e
28fc0 76 20 3d 20 43 72 65 61 74 65 45 76 65 6e 74 28  v = CreateEvent(
28fd0 4e 55 4c 4c 2c 20 54 52 55 45 2c 20 46 41 4c 53  NULL, TRUE, FALS
28fe0 45 2c 20 78 2e 65 76 4e 61 6d 65 29 3b 0a 20 20  E, x.evName);.  
28ff0 69 66 20 28 20 21 65 76 20 29 7b 0a 20 20 20 20  if ( !ev ){.    
29000 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
29010 28 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74  (interp, "cannot
29020 20 63 72 65 61 74 65 20 65 76 65 6e 74 3a 20 22   create event: "
29030 2c 20 78 2e 65 76 4e 61 6d 65 2c 20 28 63 68 61  , x.evName, (cha
29040 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
29050 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
29060 0a 20 20 5f 62 65 67 69 6e 74 68 72 65 61 64 28  .  _beginthread(
29070 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b 65  win32_file_locke
29080 72 2c 20 30 2c 20 28 76 6f 69 64 2a 29 26 78 29  r, 0, (void*)&x)
29090 3b 0a 20 20 53 6c 65 65 70 28 30 29 3b 0a 20 20  ;.  Sleep(0);.  
290a0 69 66 20 28 20 28 77 52 65 73 75 6c 74 20 3d 20  if ( (wResult = 
290b0 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
290c0 65 63 74 28 65 76 2c 20 31 30 30 30 30 29 29 21  ect(ev, 10000))!
290d0 3d 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 29  =WAIT_OBJECT_0 )
290e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
290f0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
29100 75 66 29 2c 20 7a 42 75 66 2c 20 22 30 78 25 78  uf), zBuf, "0x%x
29110 22 2c 20 77 52 65 73 75 6c 74 29 3b 0a 20 20 20  ", wResult);.   
29120 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
29130 74 28 69 6e 74 65 72 70 2c 20 22 77 61 69 74 20  t(interp, "wait 
29140 66 61 69 6c 65 64 3a 20 22 2c 20 7a 42 75 66 2c  failed: ", zBuf,
29150 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
29160 43 6c 6f 73 65 48 61 6e 64 6c 65 28 65 76 29 3b  CloseHandle(ev);
29170 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
29180 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 43 6c 6f  ERROR;.  }.  Clo
29190 73 65 48 61 6e 64 6c 65 28 65 76 29 3b 0a 20 20  seHandle(ev);.  
291a0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
291b0 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
291c0 20 20 20 20 20 6f 70 74 69 6d 69 7a 61 74 69 6f       optimizatio
291d0 6e 5f 63 6f 6e 74 72 6f 6c 20 44 42 20 4f 50 54  n_control DB OPT
291e0 20 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a 2a 20 45   BOOLEAN.**.** E
291f0 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65  nable or disable
29200 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a 61 74   query optimizat
29210 69 6f 6e 73 20 75 73 69 6e 67 20 74 68 65 20 73  ions using the s
29220 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
29230 72 6f 6c 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61  rol().** interfa
29240 63 65 2e 20 20 44 69 73 61 62 6c 65 20 69 66 20  ce.  Disable if 
29250 42 4f 4f 4c 45 41 4e 20 69 73 20 66 61 6c 73 65  BOOLEAN is false
29260 20 61 6e 64 20 65 6e 61 62 6c 65 20 69 66 20 42   and enable if B
29270 4f 4f 4c 45 41 4e 20 69 73 20 74 72 75 65 2e 0a  OOLEAN is true..
29280 2a 2a 20 4f 50 54 20 69 73 20 74 68 65 20 6e 61  ** OPT is the na
29290 6d 65 20 6f 66 20 74 68 65 20 6f 70 74 69 6d 69  me of the optimi
292a0 7a 61 74 69 6f 6e 20 74 6f 20 62 65 20 64 69 73  zation to be dis
292b0 61 62 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  abled..*/.static
292c0 20 69 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f   int optimizatio
292d0 6e 5f 63 6f 6e 74 72 6f 6c 28 0a 20 20 76 6f 69  n_control(.  voi
292e0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
292f0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
29300 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
29310 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
29320 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69  ST objv[].){.  i
29330 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt i;.  sqlite3 
29340 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db;.  const cha
29350 72 20 2a 7a 4f 70 74 3b 0a 20 20 69 6e 74 20 6f  r *zOpt;.  int o
29360 6e 6f 66 66 3b 0a 20 20 69 6e 74 20 6d 61 73 6b  noff;.  int mask
29370 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
29380 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f   struct {.    co
29390 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 4e 61  nst char *zOptNa
293a0 6d 65 3b 0a 20 20 20 20 69 6e 74 20 6d 61 73 6b  me;.    int mask
293b0 3b 0a 20 20 7d 20 61 4f 70 74 5b 5d 20 3d 20 7b  ;.  } aOpt[] = {
293c0 0a 20 20 20 20 7b 20 22 61 6c 6c 22 2c 20 20 20  .    { "all",   
293d0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
293e0 45 5f 4f 70 74 4d 61 73 6b 20 20 20 20 20 20 20  E_OptMask       
293f0 20 7d 2c 0a 20 20 20 20 7b 20 22 71 75 65 72 79   },.    { "query
29400 2d 66 6c 61 74 74 65 6e 65 72 22 2c 20 20 53 51  -flattener",  SQ
29410 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65  LITE_QueryFlatte
29420 6e 65 72 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f  ner },.    { "co
29430 6c 75 6d 6e 2d 63 61 63 68 65 22 2c 20 20 20 20  lumn-cache",    
29440 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61   SQLITE_ColumnCa
29450 63 68 65 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20  che    },.    { 
29460 22 69 6e 64 65 78 2d 73 6f 72 74 22 2c 20 20 20  "index-sort",   
29470 20 20 20 20 53 51 4c 49 54 45 5f 49 6e 64 65 78      SQLITE_Index
29480 53 6f 72 74 20 20 20 20 20 20 7d 2c 0a 20 20 20  Sort      },.   
29490 20 7b 20 22 69 6e 64 65 78 2d 73 65 61 72 63 68   { "index-search
294a0 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 49 6e  ",     SQLITE_In
294b0 64 65 78 53 65 61 72 63 68 20 20 20 20 7d 2c 0a  dexSearch    },.
294c0 20 20 20 20 7b 20 22 69 6e 64 65 78 2d 63 6f 76      { "index-cov
294d0 65 72 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45  er",      SQLITE
294e0 5f 49 6e 64 65 78 43 6f 76 65 72 20 20 20 20 20  _IndexCover     
294f0 7d 2c 0a 20 20 20 20 7b 20 22 67 72 6f 75 70 62  },.    { "groupb
29500 79 2d 6f 72 64 65 72 22 2c 20 20 20 20 53 51 4c  y-order",    SQL
29510 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72  ITE_GroupByOrder
29520 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 66 61 63     },.    { "fac
29530 74 6f 72 2d 63 6f 6e 73 74 61 6e 74 73 22 2c 20  tor-constants", 
29540 53 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75 74  SQLITE_FactorOut
29550 43 6f 6e 73 74 20 7d 2c 0a 20 20 20 20 7b 20 22  Const },.    { "
29560 72 65 61 6c 2d 61 73 2d 69 6e 74 22 2c 20 20 20  real-as-int",   
29570 20 20 20 53 51 4c 49 54 45 5f 49 64 78 52 65 61     SQLITE_IdxRea
29580 6c 41 73 49 6e 74 20 20 20 7d 2c 0a 20 20 7d 3b  lAsInt   },.  };
29590 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20  ..  if( objc!=4 
295a0 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
295b0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
295c0 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 4f 50 54  1, objv, "DB OPT
295d0 20 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20 20 20   BOOLEAN");.    
295e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
295f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
29600 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
29610 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
29620 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
29630 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
29640 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42  ;.  if( Tcl_GetB
29650 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
29660 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
29670 6f 6e 6f 66 66 29 20 29 20 72 65 74 75 72 6e 20  onoff) ) return 
29680 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4f 70  TCL_ERROR;.  zOp
29690 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  t = Tcl_GetStrin
296a0 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 66 6f  g(objv[2]);.  fo
296b0 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
296c0 61 4f 70 74 29 2f 73 69 7a 65 6f 66 28 61 4f 70  aOpt)/sizeof(aOp
296d0 74 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  t[0]); i++){.   
296e0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 74   if( strcmp(zOpt
296f0 2c 20 61 4f 70 74 5b 69 5d 2e 7a 4f 70 74 4e 61  , aOpt[i].zOptNa
29700 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
29710 6d 61 73 6b 20 3d 20 61 4f 70 74 5b 69 5d 2e 6d  mask = aOpt[i].m
29720 61 73 6b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ask;.      break
29730 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
29740 28 20 6f 6e 6f 66 66 20 29 20 6d 61 73 6b 20 3d  ( onoff ) mask =
29750 20 7e 6d 61 73 6b 3b 0a 20 20 69 66 28 20 69 3e   ~mask;.  if( i>
29760 3d 73 69 7a 65 6f 66 28 61 4f 70 74 29 2f 73 69  =sizeof(aOpt)/si
29770 7a 65 6f 66 28 61 4f 70 74 5b 30 5d 29 20 29 7b  zeof(aOpt[0]) ){
29780 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
29790 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75  esult(interp, "u
297a0 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6d 69 7a 61 74  nknown optimizat
297b0 69 6f 6e 20 2d 20 73 68 6f 75 6c 64 20 62 65 20  ion - should be 
297c0 6f 6e 65 20 6f 66 3a 22 2c 0a 20 20 20 20 20 20  one of:",.      
297d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
297e0 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 66 6f  char*)0);.    fo
297f0 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
29800 61 4f 70 74 29 2f 73 69 7a 65 6f 66 28 61 4f 70  aOpt)/sizeof(aOp
29810 74 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  t[0]); i++){.   
29820 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
29830 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 20 22 2c  ult(interp, " ",
29840 20 61 4f 70 74 5b 69 5d 2e 7a 4f 70 74 4e 61 6d   aOpt[i].zOptNam
29850 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  e);.    }.    re
29860 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
29870 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 74 65    }.  sqlite3_te
29880 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
29890 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
298a0 49 5a 41 54 49 4f 4e 53 2c 20 64 62 2c 20 6d 61  IZATIONS, db, ma
298b0 73 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  sk);.  return TC
298c0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  L_OK;.}../*.** R
298d0 65 67 69 73 74 65 72 20 63 6f 6d 6d 61 6e 64 73  egister commands
298e0 20 77 69 74 68 20 74 68 65 20 54 43 4c 20 69 6e   with the TCL in
298f0 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e  terpreter..*/.in
29900 74 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e  t Sqlitetest1_In
29910 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
29920 6e 74 65 72 70 29 7b 0a 20 20 65 78 74 65 72 6e  nterp){.  extern
29930 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61   int sqlite3_sea
29940 72 63 68 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74  rch_count;.  ext
29950 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
29960 66 6f 75 6e 64 5f 63 6f 75 6e 74 3b 0a 20 20 65  found_count;.  e
29970 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
29980 33 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e  3_interrupt_coun
29990 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  t;.  extern int 
299a0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 66 69 6c  sqlite3_open_fil
299b0 65 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72  e_count;.  exter
299c0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6f  n int sqlite3_so
299d0 72 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  rt_count;.  exte
299e0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  rn int sqlite3_c
299f0 75 72 72 65 6e 74 5f 74 69 6d 65 3b 0a 23 69 66  urrent_time;.#if
29a00 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20   SQLITE_OS_UNIX 
29a10 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
29a20 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
29a30 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
29a40 54 59 4c 45 0a 20 20 65 78 74 65 72 6e 20 69 6e  TYLE.  extern in
29a50 74 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64  t sqlite3_hostid
29a60 5f 6e 75 6d 3b 0a 23 65 6e 64 69 66 0a 20 20 65  _num;.#endif.  e
29a70 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
29a80 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a 65 3b 0a  3_max_blobsize;.
29a90 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
29aa0 69 74 65 33 42 74 72 65 65 53 68 61 72 65 64 43  ite3BtreeSharedC
29ab0 61 63 68 65 52 65 70 6f 72 74 28 76 6f 69 64 2a  acheReport(void*
29ac0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
29ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ae0 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
29af0 49 6e 74 65 72 70 2a 2c 69 6e 74 2c 54 63 6c 5f  Interp*,int,Tcl_
29b00 4f 62 6a 2a 43 4f 4e 53 54 2a 29 3b 0a 20 20 73  Obj*CONST*);.  s
29b10 74 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20  tatic struct {. 
29b20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
29b30 0a 20 20 20 20 20 54 63 6c 5f 43 6d 64 50 72 6f  .     Tcl_CmdPro
29b40 63 20 2a 78 50 72 6f 63 3b 0a 20 20 7d 20 61 43  c *xProc;.  } aC
29b50 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20  md[] = {.     { 
29b60 22 64 62 5f 65 6e 74 65 72 22 2c 20 20 20 20 20  "db_enter",     
29b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b80 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64   (Tcl_CmdProc*)d
29b90 62 5f 65 6e 74 65 72 20 20 20 20 20 20 20 20 20  b_enter         
29ba0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
29bb0 22 64 62 5f 6c 65 61 76 65 22 2c 20 20 20 20 20  "db_leave",     
29bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29bd0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64   (Tcl_CmdProc*)d
29be0 62 5f 6c 65 61 76 65 20 20 20 20 20 20 20 20 20  b_leave         
29bf0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
29c00 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  "sqlite3_mprintf
29c10 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  _int",          
29c20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73   (Tcl_CmdProc*)s
29c30 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
29c40 6e 74 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20  nt    },.     { 
29c50 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  "sqlite3_mprintf
29c60 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20  _int64",        
29c70 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73   (Tcl_CmdProc*)s
29c80 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
29c90 6e 74 36 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20  nt64  },.     { 
29ca0 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  "sqlite3_mprintf
29cb0 5f 6c 6f 6e 67 22 2c 20 20 20 20 20 20 20 20 20  _long",         
29cc0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73   (Tcl_CmdProc*)s
29cd0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c  qlite3_mprintf_l
29ce0 6f 6e 67 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20  ong   },.     { 
29cf0 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  "sqlite3_mprintf
29d00 5f 73 74 72 22 2c 20 20 20 20 20 20 20 20 20 20  _str",          
29d10 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73   (Tcl_CmdProc*)s
29d20 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
29d30 74 72 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20  tr    },.     { 
29d40 22 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74  "sqlite3_snprint
29d50 66 5f 73 74 72 22 2c 20 20 20 20 20 20 20 20 20  f_str",         
29d60 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73   (Tcl_CmdProc*)s
29d70 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f  qlite3_snprintf_
29d80 73 74 72 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20  str   },.     { 
29d90 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  "sqlite3_mprintf
29da0 5f 73 74 72 6f 6e 6c 79 22 2c 20 20 20 20 20 20  _stronly",      
29db0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73   (Tcl_CmdProc*)s
29dc0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
29dd0 74 72 6f 6e 6c 79 7d 2c 0a 20 20 20 20 20 7b 20  tronly},.     { 
29de0 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  "sqlite3_mprintf
29df0 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20 20 20 20  _double",       
29e00 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73   (Tcl_CmdProc*)s
29e10 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64  qlite3_mprintf_d
29e20 6f 75 62 6c 65 20 7d 2c 0a 20 20 20 20 20 7b 20  ouble },.     { 
29e30 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  "sqlite3_mprintf
29e40 5f 73 63 61 6c 65 64 22 2c 20 20 20 20 20 20 20  _scaled",       
29e50 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73   (Tcl_CmdProc*)s
29e60 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
29e70 63 61 6c 65 64 20 7d 2c 0a 20 20 20 20 20 7b 20  caled },.     { 
29e80 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  "sqlite3_mprintf
29e90 5f 68 65 78 64 6f 75 62 6c 65 22 2c 20 20 20 28  _hexdouble",   (
29ea0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
29eb0 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78  ite3_mprintf_hex
29ec0 64 6f 75 62 6c 65 7d 2c 0a 20 20 20 20 20 7b 20  double},.     { 
29ed0 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  "sqlite3_mprintf
29ee0 5f 7a 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20  _z_test",       
29ef0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
29f00 65 73 74 5f 6d 70 72 69 6e 74 66 5f 7a 20 20 20  est_mprintf_z   
29f10 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
29f20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
29f30 6e 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20 20  n_test",        
29f40 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
29f50 73 74 5f 6d 70 72 69 6e 74 66 5f 6e 20 20 20 20  st_mprintf_n    
29f60 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
29f70 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f  qlite3_snprintf_
29f80 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 28  int",          (
29f90 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
29fa0 74 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74 20 20  t_snprintf_int  
29fb0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
29fc0 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72  lite3_last_inser
29fd0 74 5f 72 6f 77 69 64 22 2c 20 20 20 20 20 28 54  t_rowid",     (T
29fe0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
29ff0 5f 6c 61 73 74 5f 72 6f 77 69 64 20 20 20 20 20  _last_rowid     
2a000 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2a010 69 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74 66  ite3_exec_printf
2a020 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 54 63  ",           (Tc
2a030 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
2a040 65 78 65 63 5f 70 72 69 6e 74 66 20 20 20 20 20  exec_printf     
2a050 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2a060 74 65 33 5f 65 78 65 63 5f 68 65 78 22 2c 20 20  te3_exec_hex",  
2a070 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
2a080 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 65  _CmdProc*)test_e
2a090 78 65 63 5f 68 65 78 20 20 20 20 20 20 20 20 20  xec_hex         
2a0a0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2a0b0 65 33 5f 65 78 65 63 22 2c 20 20 20 20 20 20 20  e3_exec",       
2a0c0 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
2a0d0 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78  CmdProc*)test_ex
2a0e0 65 63 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  ec             }
2a0f0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2a100 33 5f 65 78 65 63 5f 6e 72 22 2c 20 20 20 20 20  3_exec_nr",     
2a110 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
2a120 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65  mdProc*)test_exe
2a130 63 5f 6e 72 20 20 20 20 20 20 20 20 20 20 7d 2c  c_nr          },
2a140 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2a150 4f 4d 49 54 5f 47 45 54 5f 54 41 42 4c 45 0a 20  OMIT_GET_TABLE. 
2a160 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 67      { "sqlite3_g
2a170 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 22  et_table_printf"
2a180 2c 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50  ,      (Tcl_CmdP
2a190 72 6f 63 2a 29 74 65 73 74 5f 67 65 74 5f 74 61  roc*)test_get_ta
2a1a0 62 6c 65 5f 70 72 69 6e 74 66 20 7d 2c 0a 23 65  ble_printf },.#e
2a1b0 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c  ndif.     { "sql
2a1c0 69 74 65 33 5f 63 6c 6f 73 65 22 2c 20 20 20 20  ite3_close",    
2a1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
2a1e0 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
2a1f0 65 5f 74 65 73 74 5f 63 6c 6f 73 65 20 20 20 20  e_test_close    
2a200 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2a210 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
2a220 69 6f 6e 22 2c 20 20 20 20 20 20 20 28 54 63 6c  ion",       (Tcl
2a230 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 63  _CmdProc*)test_c
2a240 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 20  reate_function  
2a250 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2a260 65 33 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67  e3_create_aggreg
2a270 61 74 65 22 2c 20 20 20 20 20 20 28 54 63 6c 5f  ate",      (Tcl_
2a280 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 63 72  CmdProc*)test_cr
2a290 65 61 74 65 5f 61 67 67 72 65 67 61 74 65 20 7d  eate_aggregate }
2a2a0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2a2b0 5f 72 65 67 69 73 74 65 72 5f 74 65 73 74 5f 66  _register_test_f
2a2c0 75 6e 63 74 69 6f 6e 22 2c 20 28 54 63 6c 5f 43  unction", (Tcl_C
2a2d0 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 72 65 67  mdProc*)test_reg
2a2e0 69 73 74 65 72 5f 66 75 6e 63 20 20 20 20 7d 2c  ister_func    },
2a2f0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f  .     { "sqlite_
2a300 61 62 6f 72 74 22 2c 20 20 20 20 20 20 20 20 20  abort",         
2a310 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
2a320 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 61 62  dProc*)sqlite_ab
2a330 6f 72 74 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  ort          },.
2a340 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 62       { "sqlite_b
2a350 69 6e 64 22 2c 20 20 20 20 20 20 20 20 20 20 20  ind",           
2a360 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
2a370 50 72 6f 63 2a 29 74 65 73 74 5f 62 69 6e 64 20  Proc*)test_bind 
2a380 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
2a390 20 20 20 20 7b 20 22 62 72 65 61 6b 70 6f 69 6e      { "breakpoin
2a3a0 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  t",             
2a3b0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
2a3c0 72 6f 63 2a 29 74 65 73 74 5f 62 72 65 61 6b 70  roc*)test_breakp
2a3d0 6f 69 6e 74 20 20 20 20 20 20 20 7d 2c 0a 20 20  oint       },.  
2a3e0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6b 65     { "sqlite3_ke
2a3f0 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
2a400 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
2a410 6f 63 2a 29 74 65 73 74 5f 6b 65 79 20 20 20 20  oc*)test_key    
2a420 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2a430 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 72 65 6b    { "sqlite3_rek
2a440 65 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ey",            
2a450 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
2a460 63 2a 29 74 65 73 74 5f 72 65 6b 65 79 20 20 20  c*)test_rekey   
2a470 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2a480 20 7b 20 22 73 71 6c 69 74 65 5f 73 65 74 5f 6d   { "sqlite_set_m
2a490 61 67 69 63 22 2c 20 20 20 20 20 20 20 20 20 20  agic",          
2a4a0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2a4b0 2a 29 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67  *)sqlite_set_mag
2a4c0 69 63 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  ic      },.     
2a4d0 7b 20 22 73 71 6c 69 74 65 33 5f 69 6e 74 65 72  { "sqlite3_inter
2a4e0 72 75 70 74 22 2c 20 20 20 20 20 20 20 20 20 20  rupt",          
2a4f0 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
2a500 29 74 65 73 74 5f 69 6e 74 65 72 72 75 70 74 20  )test_interrupt 
2a510 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
2a520 20 22 73 71 6c 69 74 65 5f 64 65 6c 65 74 65 5f   "sqlite_delete_
2a530 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20 20  function",      
2a540 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
2a550 64 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e 20  delete_function 
2a560 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
2a570 22 73 71 6c 69 74 65 5f 64 65 6c 65 74 65 5f 63  "sqlite_delete_c
2a580 6f 6c 6c 61 74 69 6f 6e 22 2c 20 20 20 20 20 20  ollation",      
2a590 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64   (Tcl_CmdProc*)d
2a5a0 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 20  elete_collation 
2a5b0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
2a5c0 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f  sqlite3_get_auto
2a5d0 63 6f 6d 6d 69 74 22 2c 20 20 20 20 20 20 20 20  commit",        
2a5e0 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 67 65  (Tcl_CmdProc*)ge
2a5f0 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 20 20 20  t_autocommit    
2a600 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
2a610 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 75 73 65  qlite3_stack_use
2a620 64 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  d",            (
2a630 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
2a640 74 5f 73 74 61 63 6b 5f 75 73 65 64 20 20 20 20  t_stack_used    
2a650 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
2a660 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f  lite3_busy_timeo
2a670 75 74 22 2c 20 20 20 20 20 20 20 20 20 20 28 54  ut",          (T
2a680 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
2a690 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 20 20 20  _busy_timeout   
2a6a0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 70 72 69    },.     { "pri
2a6b0 6e 74 66 22 2c 20 20 20 20 20 20 20 20 20 20 20  ntf",           
2a6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
2a6d0 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
2a6e0 70 72 69 6e 74 66 20 20 20 20 20 20 20 20 20 20  printf          
2a6f0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2a700 74 65 33 49 6f 54 72 61 63 65 22 2c 20 20 20 20  te3IoTrace",    
2a710 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
2a720 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 69 6f 5f  mdProc*)test_io_
2a730 74 72 61 63 65 20 20 20 20 20 20 20 20 20 7d 2c  trace         },
2a740 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 73  .  };.  static s
2a750 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61  truct {.     cha
2a760 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54  r *zName;.     T
2a770 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 20 2a 78  cl_ObjCmdProc *x
2a780 50 72 6f 63 3b 0a 20 20 20 20 20 76 6f 69 64 20  Proc;.     void 
2a790 2a 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 7d  *clientData;.  }
2a7a0 20 61 4f 62 6a 43 6d 64 5b 5d 20 3d 20 7b 0a 20   aObjCmd[] = {. 
2a7b0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
2a7c0 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e 74 65  onnection_pointe
2a7d0 72 22 2c 20 20 20 20 67 65 74 5f 73 71 6c 69 74  r",    get_sqlit
2a7e0 65 5f 70 6f 69 6e 74 65 72 2c 20 30 20 7d 2c 0a  e_pointer, 0 },.
2a7f0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2a800 62 69 6e 64 5f 69 6e 74 22 2c 20 20 20 20 20 20  bind_int",      
2a810 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e          test_bin
2a820 64 5f 69 6e 74 2c 20 20 20 20 20 20 30 20 7d 2c  d_int,      0 },
2a830 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2a840 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 22 2c  _bind_zeroblob",
2a850 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69           test_bi
2a860 6e 64 5f 7a 65 72 6f 62 6c 6f 62 2c 20 30 20 7d  nd_zeroblob, 0 }
2a870 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2a880 33 5f 62 69 6e 64 5f 69 6e 74 36 34 22 2c 20 20  3_bind_int64",  
2a890 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62            test_b
2a8a0 69 6e 64 5f 69 6e 74 36 34 2c 20 20 20 20 30 20  ind_int64,    0 
2a8b0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2a8c0 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 22 2c  e3_bind_double",
2a8d0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
2a8e0 62 69 6e 64 5f 64 6f 75 62 6c 65 2c 20 20 20 30  bind_double,   0
2a8f0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2a900 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 22 2c 20  te3_bind_null", 
2a910 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
2a920 5f 62 69 6e 64 5f 6e 75 6c 6c 20 20 20 20 20 2c  _bind_null     ,
2a930 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
2a940 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 22 2c  ite3_bind_text",
2a950 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
2a960 74 5f 62 69 6e 64 5f 74 65 78 74 20 20 20 20 20  t_bind_text     
2a970 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
2a980 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31  lite3_bind_text1
2a990 36 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65  6",           te
2a9a0 73 74 5f 62 69 6e 64 5f 74 65 78 74 31 36 20 20  st_bind_text16  
2a9b0 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
2a9c0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62  qlite3_bind_blob
2a9d0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 74  ",             t
2a9e0 65 73 74 5f 62 69 6e 64 5f 62 6c 6f 62 20 20 20  est_bind_blob   
2a9f0 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
2aa00 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
2aa10 61 6d 65 74 65 72 5f 63 6f 75 6e 74 22 2c 20 20  ameter_count",  
2aa20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65  test_bind_parame
2aa30 74 65 72 5f 63 6f 75 6e 74 2c 20 30 7d 2c 0a 20  ter_count, 0},. 
2aa40 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
2aa50 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61  ind_parameter_na
2aa60 6d 65 22 2c 20 20 20 74 65 73 74 5f 62 69 6e 64  me",   test_bind
2aa70 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 2c  _parameter_name,
2aa80 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71    0},.     { "sq
2aa90 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
2aaa0 65 74 65 72 5f 69 6e 64 65 78 22 2c 20 20 74 65  eter_index",  te
2aab0 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  st_bind_paramete
2aac0 72 5f 69 6e 64 65 78 2c 20 30 7d 2c 0a 20 20 20  r_index, 0},.   
2aad0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6c 65    { "sqlite3_cle
2aae0 61 72 5f 62 69 6e 64 69 6e 67 73 22 2c 20 20 20  ar_bindings",   
2aaf0 20 20 20 20 20 74 65 73 74 5f 63 6c 65 61 72 5f       test_clear_
2ab00 62 69 6e 64 69 6e 67 73 2c 20 30 7d 2c 0a 20 20  bindings, 0},.  
2ab10 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6c     { "sqlite3_sl
2ab20 65 65 70 22 2c 20 20 20 20 20 20 20 20 20 20 20  eep",           
2ab30 20 20 20 20 20 20 74 65 73 74 5f 73 6c 65 65 70        test_sleep
2ab40 2c 20 20 20 20 20 20 20 20 20 20 30 7d 2c 0a 20  ,          0},. 
2ab50 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
2ab60 72 72 63 6f 64 65 22 2c 20 20 20 20 20 20 20 20  rrcode",        
2ab70 20 20 20 20 20 20 20 74 65 73 74 5f 65 72 72 63         test_errc
2ab80 6f 64 65 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a  ode       ,0 },.
2ab90 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2aba0 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65  extended_errcode
2abb0 22 2c 20 20 20 20 20 20 74 65 73 74 5f 65 78 5f  ",      test_ex_
2abc0 65 72 72 63 6f 64 65 20 20 20 20 2c 30 20 7d 2c  errcode    ,0 },
2abd0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2abe0 5f 65 72 72 6d 73 67 22 2c 20 20 20 20 20 20 20  _errmsg",       
2abf0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 65 72           test_er
2ac00 72 6d 73 67 20 20 20 20 20 20 20 20 2c 30 20 7d  rmsg        ,0 }
2ac10 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2ac20 33 5f 65 72 72 6d 73 67 31 36 22 2c 20 20 20 20  3_errmsg16",    
2ac30 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 65            test_e
2ac40 72 72 6d 73 67 31 36 20 20 20 20 20 20 2c 30 20  rrmsg16      ,0 
2ac50 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2ac60 65 33 5f 6f 70 65 6e 22 2c 20 20 20 20 20 20 20  e3_open",       
2ac70 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
2ac80 6f 70 65 6e 20 20 20 20 20 20 20 20 20 20 2c 30  open          ,0
2ac90 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2aca0 74 65 33 5f 6f 70 65 6e 31 36 22 2c 20 20 20 20  te3_open16",    
2acb0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
2acc0 5f 6f 70 65 6e 31 36 20 20 20 20 20 20 20 20 2c  _open16        ,
2acd0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
2ace0 69 74 65 33 5f 6f 70 65 6e 5f 76 32 22 2c 20 20  ite3_open_v2",  
2acf0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
2ad00 74 5f 6f 70 65 6e 5f 76 32 20 20 20 20 20 20 20  t_open_v2       
2ad10 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
2ad20 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36  lite3_complete16
2ad30 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ",            te
2ad40 73 74 5f 63 6f 6d 70 6c 65 74 65 31 36 20 20 20  st_complete16   
2ad50 20 2c 30 20 7d 2c 0a 0a 20 20 20 20 20 7b 20 22   ,0 },..     { "
2ad60 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 22  sqlite3_prepare"
2ad70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2ad80 74 65 73 74 5f 70 72 65 70 61 72 65 20 20 20 20  test_prepare    
2ad90 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
2ada0 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65  "sqlite3_prepare
2adb0 31 36 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  16",            
2adc0 20 74 65 73 74 5f 70 72 65 70 61 72 65 31 36 20   test_prepare16 
2add0 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
2ade0 20 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72   "sqlite3_prepar
2adf0 65 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20 20  e_v2",          
2ae00 20 20 74 65 73 74 5f 70 72 65 70 61 72 65 5f 76    test_prepare_v
2ae10 32 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20  2    ,0 },.     
2ae20 7b 20 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61  { "sqlite3_prepa
2ae30 72 65 5f 74 6b 74 33 31 33 34 22 2c 20 20 20 20  re_tkt3134",    
2ae40 20 20 20 74 65 73 74 5f 70 72 65 70 61 72 65 5f     test_prepare_
2ae50 74 6b 74 33 31 33 34 2c 20 30 7d 2c 0a 20 20 20  tkt3134, 0},.   
2ae60 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 70 72 65    { "sqlite3_pre
2ae70 70 61 72 65 31 36 5f 76 32 22 2c 20 20 20 20 20  pare16_v2",     
2ae80 20 20 20 20 20 74 65 73 74 5f 70 72 65 70 61 72       test_prepar
2ae90 65 31 36 5f 76 32 20 20 2c 30 20 7d 2c 0a 20 20  e16_v2  ,0 },.  
2aea0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 66 69     { "sqlite3_fi
2aeb0 6e 61 6c 69 7a 65 22 2c 20 20 20 20 20 20 20 20  nalize",        
2aec0 20 20 20 20 20 20 74 65 73 74 5f 66 69 6e 61 6c        test_final
2aed0 69 7a 65 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20  ize      ,0 },. 
2aee0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73      { "sqlite3_s
2aef0 74 6d 74 5f 73 74 61 74 75 73 22 2c 20 20 20 20  tmt_status",    
2af00 20 20 20 20 20 20 20 74 65 73 74 5f 73 74 6d 74         test_stmt
2af10 5f 73 74 61 74 75 73 20 20 20 2c 30 20 7d 2c 0a  _status   ,0 },.
2af20 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2af30 72 65 73 65 74 22 2c 20 20 20 20 20 20 20 20 20  reset",         
2af40 20 20 20 20 20 20 20 20 74 65 73 74 5f 72 65 73          test_res
2af50 65 74 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c  et         ,0 },
2af60 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2af70 5f 65 78 70 69 72 65 64 22 2c 20 20 20 20 20 20  _expired",      
2af80 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 65 78           test_ex
2af90 70 69 72 65 64 20 20 20 20 20 20 20 2c 30 20 7d  pired       ,0 }
2afa0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2afb0 33 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e 64 69  3_transfer_bindi
2afc0 6e 67 73 22 2c 20 20 20 20 20 74 65 73 74 5f 74  ngs",     test_t
2afd0 72 61 6e 73 66 65 72 5f 62 69 6e 64 20 2c 30 20  ransfer_bind ,0 
2afe0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2aff0 65 33 5f 63 68 61 6e 67 65 73 22 2c 20 20 20 20  e3_changes",    
2b000 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
2b010 63 68 61 6e 67 65 73 20 20 20 20 20 20 20 2c 30  changes       ,0
2b020 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2b030 74 65 33 5f 73 74 65 70 22 2c 20 20 20 20 20 20  te3_step",      
2b040 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
2b050 5f 73 74 65 70 20 20 20 20 20 20 20 20 20 20 2c  _step          ,
2b060 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
2b070 69 74 65 33 5f 73 71 6c 22 2c 20 20 20 20 20 20  ite3_sql",      
2b080 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
2b090 74 5f 73 71 6c 20 20 20 20 20 20 20 20 20 20 20  t_sql           
2b0a0 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
2b0b0 6c 69 74 65 33 5f 6e 65 78 74 5f 73 74 6d 74 22  lite3_next_stmt"
2b0c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ,             te
2b0d0 73 74 5f 6e 65 78 74 5f 73 74 6d 74 20 20 20 20  st_next_stmt    
2b0e0 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
2b0f0 71 6c 69 74 65 33 5f 73 74 6d 74 5f 72 65 61 64  qlite3_stmt_read
2b100 6f 6e 6c 79 22 2c 20 20 20 20 20 20 20 20 20 74  only",         t
2b110 65 73 74 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c  est_stmt_readonl
2b120 79 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22  y ,0 },.     { "
2b130 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75 73  sqlite3_stmt_bus
2b140 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
2b150 74 65 73 74 5f 73 74 6d 74 5f 62 75 73 79 20 20  test_stmt_busy  
2b160 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
2b170 22 75 73 65 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e  "uses_stmt_journ
2b180 61 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  al",            
2b190 20 75 73 65 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e   uses_stmt_journ
2b1a0 61 6c 20 2c 30 20 7d 2c 0a 0a 20 20 20 20 20 7b  al ,0 },..     {
2b1b0 20 22 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73   "sqlite3_releas
2b1c0 65 5f 6d 65 6d 6f 72 79 22 2c 20 20 20 20 20 20  e_memory",      
2b1d0 20 20 74 65 73 74 5f 72 65 6c 65 61 73 65 5f 6d    test_release_m
2b1e0 65 6d 6f 72 79 2c 20 20 20 20 20 30 7d 2c 0a 20  emory,     0},. 
2b1f0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 64      { "sqlite3_d
2b200 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  b_release_memory
2b210 22 2c 20 20 20 20 20 74 65 73 74 5f 64 62 5f 72  ",     test_db_r
2b220 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 2c 20 20  elease_memory,  
2b230 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  0},.     { "sqli
2b240 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 22  te3_db_filename"
2b250 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ,           test
2b260 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 2c 20 20 20  _db_filename,   
2b270 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20       0},.     { 
2b280 22 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65  "sqlite3_soft_he
2b290 61 70 5f 6c 69 6d 69 74 22 2c 20 20 20 20 20 20  ap_limit",      
2b2a0 20 74 65 73 74 5f 73 6f 66 74 5f 68 65 61 70 5f   test_soft_heap_
2b2b0 6c 69 6d 69 74 2c 20 20 20 20 30 7d 2c 0a 20 20  limit,    0},.  
2b2c0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 68     { "sqlite3_th
2b2d0 72 65 61 64 5f 63 6c 65 61 6e 75 70 22 2c 20 20  read_cleanup",  
2b2e0 20 20 20 20 20 20 74 65 73 74 5f 74 68 72 65 61        test_threa
2b2f0 64 5f 63 6c 65 61 6e 75 70 2c 20 20 20 20 20 30  d_cleanup,     0
2b300 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2b310 65 33 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e  e3_pager_refcoun
2b320 74 73 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f  ts",       test_
2b330 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 2c  pager_refcounts,
2b340 20 20 20 20 30 7d 2c 0a 0a 20 20 20 20 20 7b 20      0},..     { 
2b350 22 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78  "sqlite3_load_ex
2b360 74 65 6e 73 69 6f 6e 22 2c 20 20 20 20 20 20 20  tension",       
2b370 20 74 65 73 74 5f 6c 6f 61 64 5f 65 78 74 65 6e   test_load_exten
2b380 73 69 6f 6e 2c 20 20 20 20 20 30 7d 2c 0a 20 20  sion,     0},.  
2b390 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 6e     { "sqlite3_en
2b3a0 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  able_load_extens
2b3b0 69 6f 6e 22 2c 20 74 65 73 74 5f 65 6e 61 62 6c  ion", test_enabl
2b3c0 65 5f 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 30  e_load,        0
2b3d0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2b3e0 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75  e3_extended_resu
2b3f0 6c 74 5f 63 6f 64 65 73 22 2c 20 74 65 73 74 5f  lt_codes", test_
2b400 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f  extended_result_
2b410 63 6f 64 65 73 2c 20 30 7d 2c 0a 20 20 20 20 20  codes, 0},.     
2b420 7b 20 22 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74  { "sqlite3_limit
2b430 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2b440 20 20 20 74 65 73 74 5f 6c 69 6d 69 74 2c 20 20     test_limit,  
2b450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
2b460 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 61 76 65  },..     { "save
2b470 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c 20 20 20  _prng_state",   
2b480 20 20 20 20 20 20 20 20 20 20 20 20 73 61 76 65              save
2b490 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20 20 20 20  _prng_state,    
2b4a0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65 73  0 },.     { "res
2b4b0 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 22  tore_prng_state"
2b4c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73  ,            res
2b4d0 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 2c  tore_prng_state,
2b4e0 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65   0 },.     { "re
2b4f0 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c  set_prng_state",
2b500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
2b510 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20  set_prng_state, 
2b520 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6f    0 },.     { "o
2b530 70 74 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74  ptimization_cont
2b540 72 6f 6c 22 2c 20 20 20 20 20 20 20 20 20 20 6f  rol",          o
2b550 70 74 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74  ptimization_cont
2b560 72 6f 6c 2c 30 7d 2c 0a 23 69 66 20 53 51 4c 49  rol,0},.#if SQLI
2b570 54 45 5f 4f 53 5f 57 49 4e 0a 20 20 20 20 20 7b  TE_OS_WIN.     {
2b580 20 22 6c 6f 63 6b 5f 77 69 6e 33 32 5f 66 69 6c   "lock_win32_fil
2b590 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
2b5a0 20 20 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63    win32_file_loc
2b5b0 6b 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69  k,    0 },.#endi
2b5c0 66 0a 20 20 20 20 20 7b 20 22 74 63 6c 5f 6f 62  f.     { "tcl_ob
2b5d0 6a 70 72 6f 63 22 2c 20 20 20 20 20 20 20 20 20  jproc",         
2b5e0 20 20 20 20 20 20 20 20 20 20 72 75 6e 41 73 4f            runAsO
2b5f0 62 6a 50 72 6f 63 2c 20 20 20 20 20 20 20 30 20  bjProc,       0 
2b600 7d 2c 0a 0a 20 20 20 20 20 2f 2a 20 73 71 6c 69  },..     /* sqli
2b610 74 65 33 5f 63 6f 6c 75 6d 6e 5f 2a 28 29 20 41  te3_column_*() A
2b620 50 49 20 2a 2f 0a 20 20 20 20 20 7b 20 22 73 71  PI */.     { "sq
2b630 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
2b640 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 74 65  nt",          te
2b650 73 74 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20  st_column_count 
2b660 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
2b670 71 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e  qlite3_data_coun
2b680 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 74  t",            t
2b690 65 73 74 5f 64 61 74 61 5f 63 6f 75 6e 74 20 20  est_data_count  
2b6a0 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
2b6b0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
2b6c0 79 70 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ype",           
2b6d0 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  test_column_type
2b6e0 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
2b6f0 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
2b700 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20  blob",          
2b710 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f   test_column_blo
2b720 62 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  b   ,0 },.     {
2b730 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
2b740 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20 20 20 20  _double",       
2b750 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f    test_column_do
2b760 75 62 6c 65 20 2c 30 20 7d 2c 0a 20 20 20 20 20  uble ,0 },.     
2b770 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
2b780 6e 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20 20  n_int64",       
2b790 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69     test_column_i
2b7a0 6e 74 36 34 20 20 2c 30 20 7d 2c 0a 20 20 20 20  nt64  ,0 },.    
2b7b0 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
2b7c0 6d 6e 5f 74 65 78 74 22 2c 20 20 20 74 65 73 74  mn_text",   test
2b7d0 5f 73 74 6d 74 5f 75 74 66 38 2c 20 20 28 76 6f  _stmt_utf8,  (vo
2b7e0 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  id*)sqlite3_colu
2b7f0 6d 6e 5f 74 65 78 74 20 7d 2c 0a 20 20 20 20 20  mn_text },.     
2b800 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
2b810 6e 5f 6e 61 6d 65 22 2c 20 20 20 74 65 73 74 5f  n_name",   test_
2b820 73 74 6d 74 5f 75 74 66 38 2c 20 20 28 76 6f 69  stmt_utf8,  (voi
2b830 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
2b840 6e 5f 6e 61 6d 65 20 7d 2c 0a 20 20 20 20 20 7b  n_name },.     {
2b850 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
2b860 5f 69 6e 74 22 2c 20 20 20 20 74 65 73 74 5f 73  _int",    test_s
2b870 74 6d 74 5f 69 6e 74 2c 20 20 20 28 76 6f 69 64  tmt_int,   (void
2b880 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
2b890 5f 69 6e 74 20 20 7d 2c 0a 20 20 20 20 20 7b 20  _int  },.     { 
2b8a0 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
2b8b0 62 79 74 65 73 22 2c 20 20 74 65 73 74 5f 73 74  bytes",  test_st
2b8c0 6d 74 5f 69 6e 74 2c 20 20 20 28 76 6f 69 64 2a  mt_int,   (void*
2b8d0 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
2b8e0 62 79 74 65 73 7d 2c 0a 23 69 66 6e 64 65 66 20  bytes},.#ifndef 
2b8f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
2b900 54 59 50 45 0a 20 20 20 20 20 7b 20 22 73 71 6c  TYPE.     { "sql
2b910 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c  ite3_column_decl
2b920 74 79 70 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f  type",test_stmt_
2b930 75 74 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69  utf8,(void*)sqli
2b940 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74  te3_column_declt
2b950 79 70 65 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66  ype},.#endif.#if
2b960 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2b970 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
2b980 41 0a 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c  A.{ "sqlite3_col
2b990 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d  umn_database_nam
2b9a0 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74 66  e",test_stmt_utf
2b9b0 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  8,(void*)sqlite3
2b9c0 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65  _column_database
2b9d0 5f 6e 61 6d 65 7d 2c 0a 7b 20 22 73 71 6c 69 74  _name},.{ "sqlit
2b9e0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f  e3_column_table_
2b9f0 6e 61 6d 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f  name",test_stmt_
2ba00 75 74 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69  utf8,(void*)sqli
2ba10 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65  te3_column_table
2ba20 5f 6e 61 6d 65 7d 2c 0a 7b 20 22 73 71 6c 69 74  _name},.{ "sqlit
2ba30 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e  e3_column_origin
2ba40 5f 6e 61 6d 65 22 2c 74 65 73 74 5f 73 74 6d 74  _name",test_stmt
2ba50 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c  _utf8,(void*)sql
2ba60 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67  ite3_column_orig
2ba70 69 6e 5f 6e 61 6d 65 7d 2c 0a 23 65 6e 64 69 66  in_name},.#endif
2ba80 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2ba90 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20  _OMIT_UTF16.    
2baa0 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
2bab0 6d 6e 5f 62 79 74 65 73 31 36 22 2c 20 74 65 73  mn_bytes16", tes
2bac0 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 28 76 6f 69  t_stmt_int, (voi
2bad0 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
2bae0 6e 5f 62 79 74 65 73 31 36 20 7d 2c 0a 20 20 20  n_bytes16 },.   
2baf0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
2bb00 75 6d 6e 5f 74 65 78 74 31 36 22 2c 20 20 74 65  umn_text16",  te
2bb10 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 28  st_stmt_utf16, (
2bb20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f  void*)sqlite3_co
2bb30 6c 75 6d 6e 5f 74 65 78 74 31 36 7d 2c 0a 20 20  lumn_text16},.  
2bb40 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
2bb50 6c 75 6d 6e 5f 6e 61 6d 65 31 36 22 2c 20 20 74  lumn_name16",  t
2bb60 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20  est_stmt_utf16, 
2bb70 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63  (void*)sqlite3_c
2bb80 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36 7d 2c 0a 20  olumn_name16},. 
2bb90 20 20 20 20 7b 20 22 61 64 64 5f 61 6c 69 67 6e      { "add_align
2bba0 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74  ment_test_collat
2bbb0 69 6f 6e 73 22 2c 20 61 64 64 5f 61 6c 69 67 6e  ions", add_align
2bbc0 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74  ment_test_collat
2bbd0 69 6f 6e 73 2c 20 30 20 20 20 20 20 20 7d 2c 0a  ions, 0      },.
2bbe0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2bbf0 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 20  MIT_DECLTYPE.   
2bc00 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
2bc10 75 6d 6e 5f 64 65 63 6c 74 79 70 65 31 36 22 2c  umn_decltype16",
2bc20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c  test_stmt_utf16,
2bc30 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63  (void*)sqlite3_c
2bc40 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 31 36  olumn_decltype16
2bc50 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  },.#endif.#ifdef
2bc60 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
2bc70 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 7b  OLUMN_METADATA.{
2bc80 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
2bc90 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 31 36 22  database_name16"
2bca0 2c 0a 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74  ,.  test_stmt_ut
2bcb0 66 31 36 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  f16, sqlite3_col
2bcc0 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d  umn_database_nam
2bcd0 65 31 36 7d 2c 0a 7b 22 73 71 6c 69 74 65 33 5f  e16},.{"sqlite3_
2bce0 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d  column_table_nam
2bcf0 65 31 36 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f  e16", test_stmt_
2bd00 75 74 66 31 36 2c 20 28 76 6f 69 64 2a 29 73 71  utf16, (void*)sq
2bd10 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62  lite3_column_tab
2bd20 6c 65 5f 6e 61 6d 65 31 36 7d 2c 0a 7b 22 73 71  le_name16},.{"sq
2bd30 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69  lite3_column_ori
2bd40 67 69 6e 5f 6e 61 6d 65 31 36 22 2c 20 74 65 73  gin_name16", tes
2bd50 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 28 76  t_stmt_utf16, (v
2bd60 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  oid*)sqlite3_col
2bd70 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 31  umn_origin_name1
2bd80 36 7d 2c 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69  6},.#endif.#endi
2bd90 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  f.     { "sqlite
2bda0 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
2bdb0 6f 6e 5f 76 32 22 2c 20 74 65 73 74 5f 63 72 65  on_v2", test_cre
2bdc0 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32  ate_collation_v2
2bdd0 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  , 0 },.     { "s
2bde0 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65  qlite3_global_re
2bdf0 63 6f 76 65 72 22 2c 20 20 20 20 20 74 65 73 74  cover",     test
2be00 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 2c  _global_recover,
2be10 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   0   },.     { "
2be20 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e  working_64bit_in
2be30 74 22 2c 20 20 20 20 20 20 20 20 20 20 77 6f 72  t",          wor
2be40 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 2c 20  king_64bit_int, 
2be50 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20    0   },.     { 
2be60 22 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74  "vfs_unlink_test
2be70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 76 66  ",            vf
2be80 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74 2c 20 20  s_unlink_test,  
2be90 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b     0   },.     {
2bea0 20 22 76 66 73 5f 69 6e 69 74 66 61 69 6c 5f 74   "vfs_initfail_t
2beb0 65 73 74 22 2c 20 20 20 20 20 20 20 20 20 20 76  est",          v
2bec0 66 73 5f 69 6e 69 74 66 61 69 6c 5f 74 65 73 74  fs_initfail_test
2bed0 2c 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20  ,   0   },.     
2bee0 7b 20 22 76 66 73 5f 75 6e 72 65 67 69 73 74 65  { "vfs_unregiste
2bef0 72 5f 61 6c 6c 22 2c 20 20 20 20 20 20 20 20 20  r_all",         
2bf00 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 5f 61  vfs_unregister_a
2bf10 6c 6c 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20 20  ll,  0   },.    
2bf20 20 7b 20 22 76 66 73 5f 72 65 72 65 67 69 73 74   { "vfs_reregist
2bf30 65 72 5f 61 6c 6c 22 2c 20 20 20 20 20 20 20 20  er_all",        
2bf40 20 76 66 73 5f 72 65 72 65 67 69 73 74 65 72 5f   vfs_reregister_
2bf50 61 6c 6c 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20  all,  0   },.   
2bf60 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f    { "file_contro
2bf70 6c 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20 20  l_test",        
2bf80 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74    file_control_t
2bf90 65 73 74 2c 20 20 20 30 20 20 20 7d 2c 0a 20 20  est,   0   },.  
2bfa0 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72     { "file_contr
2bfb0 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f 5f 74 65 73  ol_lasterrno_tes
2bfc0 74 22 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  t", file_control
2bfd0 5f 6c 61 73 74 65 72 72 6e 6f 5f 74 65 73 74 2c  _lasterrno_test,
2bfe0 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20    0   },.     { 
2bff0 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f  "file_control_lo
2c000 63 6b 70 72 6f 78 79 5f 74 65 73 74 22 2c 20 66  ckproxy_test", f
2c010 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b  ile_control_lock
2c020 70 72 6f 78 79 5f 74 65 73 74 2c 20 20 30 20 20  proxy_test,  0  
2c030 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65   },.     { "file
2c040 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73 69  _control_chunksi
2c050 7a 65 5f 74 65 73 74 22 2c 20 66 69 6c 65 5f 63  ze_test", file_c
2c060 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65  ontrol_chunksize
2c070 5f 74 65 73 74 2c 20 20 30 20 20 20 7d 2c 0a 20  _test,  0   },. 
2c080 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74      { "file_cont
2c090 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74 65 73  rol_sizehint_tes
2c0a0 74 22 2c 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  t",  file_contro
2c0b0 6c 5f 73 69 7a 65 68 69 6e 74 5f 74 65 73 74 2c  l_sizehint_test,
2c0c0 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b     0   },.     {
2c0d0 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77   "file_control_w
2c0e0 69 6e 33 32 5f 61 76 5f 72 65 74 72 79 22 2c 20  in32_av_retry", 
2c0f0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e  file_control_win
2c100 33 32 5f 61 76 5f 72 65 74 72 79 2c 20 20 30 20  32_av_retry,  0 
2c110 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c    },.     { "fil
2c120 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72 73 69 73  e_control_persis
2c130 74 5f 77 61 6c 22 2c 20 20 20 20 66 69 6c 65 5f  t_wal",    file_
2c140 63 6f 6e 74 72 6f 6c 5f 70 65 72 73 69 73 74 5f  control_persist_
2c150 77 61 6c 2c 20 20 20 20 20 30 20 20 20 7d 2c 0a  wal,     0   },.
2c160 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e       { "file_con
2c170 74 72 6f 6c 5f 7a 65 72 6f 5f 64 61 6d 61 67 65  trol_zero_damage
2c180 22 2c 20 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72  ",    file_contr
2c190 6f 6c 5f 7a 65 72 6f 5f 64 61 6d 61 67 65 2c 20  ol_zero_damage, 
2c1a0 20 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20      0   },.     
2c1b0 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  { "file_control_
2c1c0 76 66 73 6e 61 6d 65 22 2c 20 20 20 20 20 20 20  vfsname",       
2c1d0 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66   file_control_vf
2c1e0 73 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 30  sname,         0
2c1f0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
2c200 6c 69 74 65 33 5f 76 66 73 5f 6c 69 73 74 22 2c  lite3_vfs_list",
2c210 20 20 20 20 20 20 20 20 20 20 20 76 66 73 5f 6c             vfs_l
2c220 69 73 74 2c 20 20 20 20 20 30 20 20 20 7d 2c 0a  ist,     0   },.
2c230 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2c240 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
2c250 76 32 22 2c 20 74 65 73 74 5f 63 72 65 61 74 65  v2", test_create
2c260 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 2c 20 30 20  _function_v2, 0 
2c270 7d 2c 0a 0a 20 20 20 20 20 2f 2a 20 46 75 6e 63  },..     /* Func
2c280 74 69 6f 6e 73 20 66 72 6f 6d 20 6f 73 2e 68 20  tions from os.h 
2c290 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
2c2a0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20  E_OMIT_UTF16.   
2c2b0 20 20 7b 20 22 61 64 64 5f 74 65 73 74 5f 63 6f    { "add_test_co
2c2c0 6c 6c 61 74 65 22 2c 20 20 20 20 20 20 20 20 74  llate",        t
2c2d0 65 73 74 5f 63 6f 6c 6c 61 74 65 2c 20 30 20 20  est_collate, 0  
2c2e0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2c2f0 20 20 7b 20 22 61 64 64 5f 74 65 73 74 5f 63 6f    { "add_test_co
2c300 6c 6c 61 74 65 5f 6e 65 65 64 65 64 22 2c 20 74  llate_needed", t
2c310 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64  est_collate_need
2c320 65 64 2c 20 30 20 20 20 20 20 7d 2c 0a 20 20 20  ed, 0     },.   
2c330 20 20 7b 20 22 61 64 64 5f 74 65 73 74 5f 66 75    { "add_test_fu
2c340 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 74  nction",       t
2c350 65 73 74 5f 66 75 6e 63 74 69 6f 6e 2c 20 30 20  est_function, 0 
2c360 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 23 65 6e            },.#en
2c370 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  dif.     { "sqli
2c380 74 65 33 5f 74 65 73 74 5f 65 72 72 73 74 72 22  te3_test_errstr"
2c390 2c 20 20 20 20 20 74 65 73 74 5f 65 72 72 73 74  ,     test_errst
2c3a0 72 2c 20 30 20 20 20 20 20 20 20 20 20 20 20 20  r, 0            
2c3b0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 74 63 6c 5f   },.     { "tcl_
2c3c0 76 61 72 69 61 62 6c 65 5f 74 79 70 65 22 2c 20  variable_type", 
2c3d0 20 20 20 20 20 20 74 63 6c 5f 76 61 72 69 61 62        tcl_variab
2c3e0 6c 65 5f 74 79 70 65 2c 20 30 20 20 20 20 20 20  le_type, 0      
2c3f0 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   },.#ifndef SQLI
2c400 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
2c410 41 43 48 45 0a 20 20 20 20 20 7b 20 22 73 71 6c  ACHE.     { "sql
2c420 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72  ite3_enable_shar
2c430 65 64 5f 63 61 63 68 65 22 2c 20 74 65 73 74 5f  ed_cache", test_
2c440 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 2c 20 30  enable_shared, 0
2c450 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2c460 69 74 65 33 5f 73 68 61 72 65 64 5f 63 61 63 68  ite3_shared_cach
2c470 65 5f 72 65 70 6f 72 74 22 2c 20 73 71 6c 69 74  e_report", sqlit
2c480 65 33 42 74 72 65 65 53 68 61 72 65 64 43 61 63  e3BtreeSharedCac
2c490 68 65 52 65 70 6f 72 74 2c 20 30 7d 2c 0a 23 65  heReport, 0},.#e
2c4a0 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c  ndif.     { "sql
2c4b0 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f  ite3_libversion_
2c4c0 6e 75 6d 62 65 72 22 2c 20 74 65 73 74 5f 6c 69  number", test_li
2c4d0 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 2c  bversion_number,
2c4e0 20 30 20 20 7d 2c 0a 23 69 66 64 65 66 20 53 51   0  },.#ifdef SQ
2c4f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
2c500 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20  MN_METADATA.    
2c510 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 61 62 6c   { "sqlite3_tabl
2c520 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
2c530 61 22 2c 20 74 65 73 74 5f 74 61 62 6c 65 5f 63  a", test_table_c
2c540 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 2c 20  olumn_metadata, 
2c550 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66  0  },.#endif.#if
2c560 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2c570 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 7b  _INCRBLOB.     {
2c580 20 22 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72   "sqlite3_blob_r
2c590 65 61 64 22 2c 20 20 20 74 65 73 74 5f 62 6c 6f  ead",   test_blo
2c5a0 62 5f 72 65 61 64 2c 20 30 20 20 7d 2c 0a 20 20  b_read, 0  },.  
2c5b0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 6c     { "sqlite3_bl
2c5c0 6f 62 5f 77 72 69 74 65 22 2c 20 20 74 65 73 74  ob_write",  test
2c5d0 5f 62 6c 6f 62 5f 77 72 69 74 65 2c 20 30 20 20  _blob_write, 0  
2c5e0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2c5f0 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 22 2c  e3_blob_reopen",
2c600 20 74 65 73 74 5f 62 6c 6f 62 5f 72 65 6f 70 65   test_blob_reope
2c610 6e 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20  n, 0  },.     { 
2c620 22 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79  "sqlite3_blob_by
2c630 74 65 73 22 2c 20 20 74 65 73 74 5f 62 6c 6f 62  tes",  test_blob
2c640 5f 62 79 74 65 73 2c 20 30 20 20 7d 2c 0a 20 20  _bytes, 0  },.  
2c650 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 6c     { "sqlite3_bl
2c660 6f 62 5f 63 6c 6f 73 65 22 2c 20 20 74 65 73 74  ob_close",  test
2c670 5f 62 6c 6f 62 5f 63 6c 6f 73 65 2c 20 30 20 20  _blob_close, 0  
2c680 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b  },.#endif.     {
2c690 20 22 70 63 61 63 68 65 5f 73 74 61 74 73 22 2c   "pcache_stats",
2c6a0 20 20 20 20 20 20 20 74 65 73 74 5f 70 63 61 63         test_pcac
2c6b0 68 65 5f 73 74 61 74 73 2c 20 30 20 20 7d 2c 0a  he_stats, 0  },.
2c6c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2c6d0 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49  ABLE_UNLOCK_NOTI
2c6e0 46 59 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  FY.     { "sqlit
2c6f0 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  e3_unlock_notify
2c700 22 2c 20 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e  ", test_unlock_n
2c710 6f 74 69 66 79 2c 20 30 20 20 7d 2c 0a 23 65 6e  otify, 0  },.#en
2c720 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  dif.     { "sqli
2c730 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
2c740 6e 74 22 2c 20 20 20 74 65 73 74 5f 77 61 6c 5f  nt",   test_wal_
2c750 63 68 65 63 6b 70 6f 69 6e 74 2c 20 30 20 20 7d  checkpoint, 0  }
2c760 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2c770 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
2c780 5f 76 32 22 2c 74 65 73 74 5f 77 61 6c 5f 63 68  _v2",test_wal_ch
2c790 65 63 6b 70 6f 69 6e 74 5f 76 32 2c 20 30 20 20  eckpoint_v2, 0  
2c7a0 7d 2c 0a 20 20 20 20 20 7b 20 22 74 65 73 74 5f  },.     { "test_
2c7b0 73 71 6c 69 74 65 33 5f 6c 6f 67 22 2c 20 20 20  sqlite3_log",   
2c7c0 20 20 20 20 20 20 74 65 73 74 5f 73 71 6c 69 74        test_sqlit
2c7d0 65 33 5f 6c 6f 67 2c 20 30 20 20 7d 2c 0a 23 69  e3_log, 0  },.#i
2c7e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2c7f0 54 5f 45 58 50 4c 41 49 4e 0a 20 20 20 20 20 7b  T_EXPLAIN.     {
2c800 20 22 70 72 69 6e 74 5f 65 78 70 6c 61 69 6e 5f   "print_explain_
2c810 71 75 65 72 79 5f 70 6c 61 6e 22 2c 20 74 65 73  query_plan", tes
2c820 74 5f 70 72 69 6e 74 5f 65 71 70 2c 20 30 20 20  t_print_eqp, 0  
2c830 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b  },.#endif.     {
2c840 20 22 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63   "sqlite3_test_c
2c850 6f 6e 74 72 6f 6c 22 2c 20 74 65 73 74 5f 74 65  ontrol", test_te
2c860 73 74 5f 63 6f 6e 74 72 6f 6c 20 7d 2c 0a 20 20  st_control },.  
2c870 7d 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  };.  static int 
2c880 62 69 74 6d 61 73 6b 5f 73 69 7a 65 20 3d 20 73  bitmask_size = s
2c890 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38  izeof(Bitmask)*8
2c8a0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 65 78 74  ;.  int i;.  ext
2c8b0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
2c8c0 73 79 6e 63 5f 63 6f 75 6e 74 2c 20 73 71 6c 69  sync_count, sqli
2c8d0 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
2c8e0 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  nt;.  extern int
2c8f0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
2c900 70 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72  p_count;.  exter
2c910 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69  n int sqlite3_li
2c920 6b 65 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  ke_count;.  exte
2c930 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 78  rn int sqlite3_x
2c940 66 65 72 6f 70 74 5f 63 6f 75 6e 74 3b 0a 20 20  feropt_count;.  
2c950 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
2c960 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
2c970 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20  count;.  extern 
2c980 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
2c990 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 3b  r_writedb_count;
2c9a0 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
2c9b0 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
2c9c0 65 6a 5f 63 6f 75 6e 74 3b 0a 23 69 66 20 53 51  ej_count;.#if SQ
2c9d0 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 20 20 65 78  LITE_OS_WIN.  ex
2c9e0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
2c9f0 5f 6f 73 5f 74 79 70 65 3b 0a 23 65 6e 64 69 66  _os_type;.#endif
2ca00 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2ca10 45 42 55 47 0a 20 20 65 78 74 65 72 6e 20 69 6e  EBUG.  extern in
2ca20 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  t sqlite3WhereTr
2ca30 61 63 65 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  ace;.  extern in
2ca40 74 20 73 71 6c 69 74 65 33 4f 53 54 72 61 63 65  t sqlite3OSTrace
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 56 64 62 65 41 64 64 6f 70 54  qlite3VdbeAddopT
2ca70 72 61 63 65 3b 0a 20 20 65 78 74 65 72 6e 20 69  race;.  extern i
2ca80 6e 74 20 73 71 6c 69 74 65 33 57 61 6c 54 72 61  nt sqlite3WalTra
2ca90 63 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  ce;.#endif.#ifde
2caa0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
2cab0 65 78 74 65 72 6e 20 63 68 61 72 20 73 71 6c 69  extern char sqli
2cac0 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 5d  te3_query_plan[]
2cad0 3b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  ;.  static char 
2cae0 2a 71 75 65 72 79 5f 70 6c 61 6e 20 3d 20 73 71  *query_plan = sq
2caf0 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
2cb00 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
2cb10 45 4e 41 42 4c 45 5f 46 54 53 33 0a 20 20 65 78  ENABLE_FTS3.  ex
2cb20 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
2cb30 5f 66 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72  _fts3_enable_par
2cb40 65 6e 74 68 65 73 65 73 3b 0a 23 65 6e 64 69 66  entheses;.#endif
2cb50 0a 23 65 6e 64 69 66 0a 0a 20 20 66 6f 72 28 69  .#endif..  for(i
2cb60 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 43 6d  =0; i<sizeof(aCm
2cb70 64 29 2f 73 69 7a 65 6f 66 28 61 43 6d 64 5b 30  d)/sizeof(aCmd[0
2cb80 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63  ]); i++){.    Tc
2cb90 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28  l_CreateCommand(
2cba0 69 6e 74 65 72 70 2c 20 61 43 6d 64 5b 69 5d 2e  interp, aCmd[i].
2cbb0 7a 4e 61 6d 65 2c 20 61 43 6d 64 5b 69 5d 2e 78  zName, aCmd[i].x
2cbc0 50 72 6f 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  Proc, 0, 0);.  }
2cbd0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
2cbe0 7a 65 6f 66 28 61 4f 62 6a 43 6d 64 29 2f 73 69  zeof(aObjCmd)/si
2cbf0 7a 65 6f 66 28 61 4f 62 6a 43 6d 64 5b 30 5d 29  zeof(aObjCmd[0])
2cc00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f  ; i++){.    Tcl_
2cc10 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
2cc20 28 69 6e 74 65 72 70 2c 20 61 4f 62 6a 43 6d 64  (interp, aObjCmd
2cc30 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20  [i].zName, .    
2cc40 20 20 20 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 78      aObjCmd[i].x
2cc50 50 72 6f 63 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d  Proc, aObjCmd[i]
2cc60 2e 63 6c 69 65 6e 74 44 61 74 61 2c 20 30 29 3b  .clientData, 0);
2cc70 0a 20 20 7d 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  .  }.  Tcl_LinkV
2cc80 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
2cc90 74 65 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 22  te_search_count"
2cca0 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  , .      (char*)
2ccb0 26 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f  &sqlite3_search_
2ccc0 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  count, TCL_LINK_
2ccd0 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  INT);.  Tcl_Link
2cce0 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
2ccf0 69 74 65 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74 22  ite_found_count"
2cd00 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  , .      (char*)
2cd10 26 73 71 6c 69 74 65 33 5f 66 6f 75 6e 64 5f 63  &sqlite3_found_c
2cd20 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
2cd30 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
2cd40 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
2cd50 74 65 5f 73 6f 72 74 5f 63 6f 75 6e 74 22 2c 20  te_sort_count", 
2cd60 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
2cd70 71 6c 69 74 65 33 5f 73 6f 72 74 5f 63 6f 75 6e  qlite3_sort_coun
2cd80 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  t, TCL_LINK_INT)
2cd90 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
2cda0 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33  interp, "sqlite3
2cdb0 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a 65 22 2c 20  _max_blobsize", 
2cdc0 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
2cdd0 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73  qlite3_max_blobs
2cde0 69 7a 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  ize, TCL_LINK_IN
2cdf0 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  T);.  Tcl_LinkVa
2ce00 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
2ce10 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 22 2c 20 0a  e_like_count", .
2ce20 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
2ce30 6c 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74  lite3_like_count
2ce40 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
2ce50 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
2ce60 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 69  nterp, "sqlite_i
2ce70 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 22 2c  nterrupt_count",
2ce80 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26   .      (char*)&
2ce90 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
2cea0 74 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  t_count, TCL_LIN
2ceb0 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
2cec0 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
2ced0 71 6c 69 74 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f  qlite_open_file_
2cee0 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28  count", .      (
2cef0 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f  char*)&sqlite3_o
2cf00 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 2c 20  pen_file_count, 
2cf10 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
2cf20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
2cf30 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 63 75 72  erp, "sqlite_cur
2cf40 72 65 6e 74 5f 74 69 6d 65 22 2c 20 0a 20 20 20  rent_time", .   
2cf50 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
2cf60 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 2c  e3_current_time,
2cf70 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
2cf80 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e  #if SQLITE_OS_UN
2cf90 49 58 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  IX && defined(__
2cfa0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
2cfb0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2cfc0 47 5f 53 54 59 4c 45 0a 20 20 54 63 6c 5f 4c 69  G_STYLE.  Tcl_Li
2cfd0 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
2cfe0 71 6c 69 74 65 5f 68 6f 73 74 69 64 5f 6e 75 6d  qlite_hostid_num
2cff0 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a  ", .      (char*
2d000 29 26 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64  )&sqlite3_hostid
2d010 5f 6e 75 6d 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  _num, TCL_LINK_I
2d020 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 63  NT);.#endif.  Tc
2d030 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
2d040 2c 20 22 73 71 6c 69 74 65 33 5f 78 66 65 72 6f  , "sqlite3_xfero
2d050 70 74 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20  pt_count",.     
2d060 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
2d070 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 2c 20  _xferopt_count, 
2d080 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
2d090 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
2d0a0 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 70 61  erp, "sqlite3_pa
2d0b0 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
2d0c0 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
2d0d0 26 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72  &sqlite3_pager_r
2d0e0 65 61 64 64 62 5f 63 6f 75 6e 74 2c 20 54 43 4c  eaddb_count, TCL
2d0f0 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
2d100 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
2d110 2c 20 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72  , "sqlite3_pager
2d120 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 22 2c  _writedb_count",
2d130 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
2d140 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
2d150 74 65 64 62 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  tedb_count, TCL_
2d160 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
2d170 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
2d180 20 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f   "sqlite3_pager_
2d190 77 72 69 74 65 6a 5f 63 6f 75 6e 74 22 2c 0a 20  writej_count",. 
2d1a0 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
2d1b0 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
2d1c0 6a 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  j_count, TCL_LIN
2d1d0 4b 5f 49 4e 54 29 3b 0a 23 69 66 6e 64 65 66 20  K_INT);.#ifndef 
2d1e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
2d1f0 36 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  6.  Tcl_LinkVar(
2d200 69 6e 74 65 72 70 2c 20 22 75 6e 61 6c 69 67 6e  interp, "unalign
2d210 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65  ed_string_counte
2d220 72 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  r",.      (char*
2d230 29 26 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69  )&unaligned_stri
2d240 6e 67 5f 63 6f 75 6e 74 65 72 2c 20 54 43 4c 5f  ng_counter, TCL_
2d250 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69  LINK_INT);.#endi
2d260 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
2d270 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 54 63  _OMIT_UTF16.  Tc
2d280 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
2d290 2c 20 22 73 71 6c 69 74 65 5f 6c 61 73 74 5f 6e  , "sqlite_last_n
2d2a0 65 65 64 65 64 5f 63 6f 6c 6c 61 74 69 6f 6e 22  eeded_collation"
2d2b0 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
2d2c0 70 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f  pzNeededCollatio
2d2d0 6e 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49  n, TCL_LINK_STRI
2d2e0 4e 47 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44  NG|TCL_LINK_READ
2d2f0 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 23  _ONLY);.#endif.#
2d300 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
2d310 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
2d320 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f  nterp, "sqlite_o
2d330 73 5f 74 79 70 65 22 2c 0a 20 20 20 20 20 20 28  s_type",.      (
2d340 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f  char*)&sqlite3_o
2d350 73 5f 74 79 70 65 2c 20 54 43 4c 5f 4c 49 4e 4b  s_type, TCL_LINK
2d360 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 23 69  _INT);.#endif.#i
2d370 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
2d380 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
2d390 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 71  nterp, "sqlite_q
2d3a0 75 65 72 79 5f 70 6c 61 6e 22 2c 0a 20 20 20 20  uery_plan",.    
2d3b0 20 20 28 63 68 61 72 2a 29 26 71 75 65 72 79 5f    (char*)&query_
2d3c0 70 6c 61 6e 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53  plan, TCL_LINK_S
2d3d0 54 52 49 4e 47 7c 54 43 4c 5f 4c 49 4e 4b 5f 52  TRING|TCL_LINK_R
2d3e0 45 41 44 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69  EAD_ONLY);.#endi
2d3f0 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
2d400 44 45 42 55 47 0a 20 20 54 63 6c 5f 4c 69 6e 6b  DEBUG.  Tcl_Link
2d410 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
2d420 69 74 65 5f 61 64 64 6f 70 5f 74 72 61 63 65 22  ite_addop_trace"
2d430 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
2d440 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 6f 70  sqlite3VdbeAddop
2d450 54 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  Trace, TCL_LINK_
2d460 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  INT);.  Tcl_Link
2d470 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
2d480 69 74 65 5f 77 68 65 72 65 5f 74 72 61 63 65 22  ite_where_trace"
2d490 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
2d4a0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
2d4b0 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  e, TCL_LINK_INT)
2d4c0 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
2d4d0 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
2d4e0 6f 73 5f 74 72 61 63 65 22 2c 0a 20 20 20 20 20  os_trace",.     
2d4f0 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
2d500 4f 53 54 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e  OSTrace, TCL_LIN
2d510 4b 5f 49 4e 54 29 3b 0a 23 69 66 6e 64 65 66 20  K_INT);.#ifndef 
2d520 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
2d530 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
2d540 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 77 61  terp, "sqlite_wa
2d550 6c 5f 74 72 61 63 65 22 2c 0a 20 20 20 20 20 20  l_trace",.      
2d560 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 57  (char*)&sqlite3W
2d570 61 6c 54 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e  alTrace, TCL_LIN
2d580 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 23  K_INT);.#endif.#
2d590 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
2d5a0 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
2d5b0 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
2d5c0 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f  nterp, "sqlite_o
2d5d0 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 22 2c 0a  pentemp_count",.
2d5e0 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
2d5f0 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
2d600 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
2d610 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 63  NT);.#endif.  Tc
2d620 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
2d630 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 69 63  , "sqlite_static
2d640 5f 62 69 6e 64 5f 76 61 6c 75 65 22 2c 0a 20 20  _bind_value",.  
2d650 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
2d660 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76  te_static_bind_v
2d670 61 6c 75 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53  alue, TCL_LINK_S
2d680 54 52 49 4e 47 29 3b 0a 20 20 54 63 6c 5f 4c 69  TRING);.  Tcl_Li
2d690 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
2d6a0 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e  qlite_static_bin
2d6b0 64 5f 6e 62 79 74 65 22 2c 0a 20 20 20 20 20 20  d_nbyte",.      
2d6c0 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 5f 73  (char*)&sqlite_s
2d6d0 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65  tatic_bind_nbyte
2d6e0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
2d6f0 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
2d700 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 74  nterp, "sqlite_t
2d710 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 22 2c 0a  emp_directory",.
2d720 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
2d730 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
2d740 74 6f 72 79 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53  tory, TCL_LINK_S
2d750 54 52 49 4e 47 29 3b 0a 20 20 54 63 6c 5f 4c 69  TRING);.  Tcl_Li
2d760 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 62  nkVar(interp, "b
2d770 69 74 6d 61 73 6b 5f 73 69 7a 65 22 2c 0a 20 20  itmask_size",.  
2d780 20 20 20 20 28 63 68 61 72 2a 29 26 62 69 74 6d      (char*)&bitm
2d790 61 73 6b 5f 73 69 7a 65 2c 20 54 43 4c 5f 4c 49  ask_size, TCL_LI
2d7a0 4e 4b 5f 49 4e 54 7c 54 43 4c 5f 4c 49 4e 4b 5f  NK_INT|TCL_LINK_
2d7b0 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a 20 20 54 63  READ_ONLY);.  Tc
2d7c0 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
2d7d0 2c 20 22 73 71 6c 69 74 65 5f 73 79 6e 63 5f 63  , "sqlite_sync_c
2d7e0 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68  ount",.      (ch
2d7f0 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 73 79 6e  ar*)&sqlite3_syn
2d800 63 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  c_count, TCL_LIN
2d810 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
2d820 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
2d830 71 6c 69 74 65 5f 66 75 6c 6c 73 79 6e 63 5f 63  qlite_fullsync_c
2d840 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68  ount",.      (ch
2d850 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 66 75 6c  ar*)&sqlite3_ful
2d860 6c 73 79 6e 63 5f 63 6f 75 6e 74 2c 20 54 43 4c  lsync_count, TCL
2d870 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66 20  _LINK_INT);.#if 
2d880 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
2d890 4e 41 42 4c 45 5f 46 54 53 33 29 20 26 26 20 64  NABLE_FTS3) && d
2d8a0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
2d8b0 53 54 29 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  ST).  Tcl_LinkVa
2d8c0 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
2d8d0 65 5f 66 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61  e_fts3_enable_pa
2d8e0 72 65 6e 74 68 65 73 65 73 22 2c 0a 20 20 20 20  rentheses",.    
2d8f0 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
2d900 33 5f 66 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61  3_fts3_enable_pa
2d910 72 65 6e 74 68 65 73 65 73 2c 20 54 43 4c 5f 4c  rentheses, TCL_L
2d920 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66  INK_INT);.#endif
2d930 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2d940 3b 0a 7d 0a                                      ;.}.