/ Hex Artifact Content
Login

Artifact 3d70f7c5987f186884cfebbfa7151a7d3d67d86e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 66  ******.** Code f
0180: 6f 72 20 74 65 73 74 69 6e 67 20 61 6c 6c 20 73  or testing all s
0190: 6f 72 74 73 20 6f 66 20 53 51 4c 69 74 65 20 69  orts of SQLite i
01a0: 6e 74 65 72 66 61 63 65 73 2e 20 20 54 68 69 73  nterfaces.  This
01b0: 20 63 6f 64 65 0a 2a 2a 20 69 73 20 6e 6f 74 20   code.** is not 
01c0: 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
01d0: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 20  SQLite library. 
01e0: 20 49 74 20 69 73 20 75 73 65 64 20 66 6f 72 20   It is used for 
01f0: 61 75 74 6f 6d 61 74 65 64 0a 2a 2a 20 74 65 73  automated.** tes
0200: 74 69 6e 67 20 6f 66 20 74 68 65 20 53 51 4c 69  ting of the SQLi
0210: 74 65 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23  te library..*/.#
0220: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0230: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  nt.h".#include "
0240: 76 64 62 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c  vdbeInt.h".#incl
0250: 75 64 65 20 22 74 63 6c 2e 68 22 0a 23 69 6e 63  ude "tcl.h".#inc
0260: 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a  lude <stdlib.h>.
0270: 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67  #include <string
0280: 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .h>../*.** This 
0290: 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
02a0: 20 66 69 72 73 74 20 70 61 72 74 20 6f 66 20 74   first part of t
02b0: 68 65 20 53 71 6c 69 74 65 44 62 20 73 74 72 75  he SqliteDb stru
02c0: 63 74 75 72 65 20 69 6e 20 0a 2a 2a 20 74 63 6c  cture in .** tcl
02d0: 73 71 6c 69 74 65 2e 63 2e 20 20 57 65 20 6e 65  sqlite.c.  We ne
02e0: 65 64 20 69 74 20 68 65 72 65 20 73 6f 20 74 68  ed it here so th
02f0: 61 74 20 74 68 65 20 67 65 74 5f 73 71 6c 69 74  at the get_sqlit
0300: 65 5f 70 6f 69 6e 74 65 72 20 72 6f 75 74 69 6e  e_pointer routin
0310: 65 0a 2a 2a 20 63 61 6e 20 65 78 74 72 61 63 74  e.** can extract
0320: 20 74 68 65 20 73 71 6c 69 74 65 33 2a 20 70 6f   the sqlite3* po
0330: 69 6e 74 65 72 20 66 72 6f 6d 20 61 6e 20 65 78  inter from an ex
0340: 69 73 74 69 6e 67 20 54 63 6c 20 53 51 4c 69 74  isting Tcl SQLit
0350: 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  e.** connection.
0360: 0a 2a 2f 0a 73 74 72 75 63 74 20 53 71 6c 69 74  .*/.struct Sqlit
0370: 65 44 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  eDb {.  sqlite3 
0380: 2a 64 62 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  *db;.};../*.** C
0390: 6f 6e 76 65 72 74 20 74 65 78 74 20 67 65 6e 65  onvert text gene
03a0: 72 61 74 65 64 20 62 79 20 74 68 65 20 22 25 70  rated by the "%p
03b0: 22 20 63 6f 6e 76 65 72 73 69 6f 6e 20 66 6f 72  " conversion for
03c0: 6d 61 74 20 62 61 63 6b 20 69 6e 74 6f 0a 2a 2a  mat back into.**
03d0: 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73   a pointer..*/.s
03e0: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 48 65  tatic int testHe
03f0: 78 54 6f 49 6e 74 28 69 6e 74 20 68 29 7b 0a 20  xToInt(int h){. 
0400: 20 69 66 28 20 68 3e 3d 27 30 27 20 26 26 20 68   if( h>='0' && h
0410: 3c 3d 27 39 27 20 29 7b 0a 20 20 20 20 72 65 74  <='9' ){.    ret
0420: 75 72 6e 20 68 20 2d 20 27 30 27 3b 0a 20 20 7d  urn h - '0';.  }
0430: 65 6c 73 65 20 69 66 28 20 68 3e 3d 27 61 27 20  else if( h>='a' 
0440: 26 26 20 68 3c 3d 27 66 27 20 29 7b 0a 20 20 20  && h<='f' ){.   
0450: 20 72 65 74 75 72 6e 20 68 20 2d 20 27 61 27 20   return h - 'a' 
0460: 2b 20 31 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  + 10;.  }else{. 
0470: 20 20 20 61 73 73 65 72 74 28 20 68 3e 3d 27 41     assert( h>='A
0480: 27 20 26 26 20 68 3c 3d 27 46 27 20 29 3b 0a 20  ' && h<='F' );. 
0490: 20 20 20 72 65 74 75 72 6e 20 68 20 2d 20 27 41     return h - 'A
04a0: 27 20 2b 20 31 30 3b 0a 20 20 7d 0a 7d 0a 76 6f  ' + 10;.  }.}.vo
04b0: 69 64 20 2a 73 71 6c 69 74 65 33 54 65 73 74 54  id *sqlite3TestT
04c0: 65 78 74 54 6f 50 74 72 28 63 6f 6e 73 74 20 63  extToPtr(const c
04d0: 68 61 72 20 2a 7a 29 7b 0a 20 20 76 6f 69 64 20  har *z){.  void 
04e0: 2a 70 3b 0a 20 20 75 36 34 20 76 3b 0a 20 20 75  *p;.  u64 v;.  u
04f0: 33 32 20 76 32 3b 0a 20 20 69 66 28 20 7a 5b 30  32 v2;.  if( z[0
0500: 5d 3d 3d 27 30 27 20 26 26 20 7a 5b 31 5d 3d 3d  ]=='0' && z[1]==
0510: 27 78 27 20 29 7b 0a 20 20 20 20 7a 20 2b 3d 20  'x' ){.    z += 
0520: 32 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 30 3b 0a  2;.  }.  v = 0;.
0530: 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20    while( *z ){. 
0540: 20 20 20 76 20 3d 20 28 76 3c 3c 34 29 20 2b 20     v = (v<<4) + 
0550: 74 65 73 74 48 65 78 54 6f 49 6e 74 28 2a 7a 29  testHexToInt(*z)
0560: 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 7d 0a 20  ;.    z++;.  }. 
0570: 20 69 66 28 20 73 69 7a 65 6f 66 28 70 29 3d 3d   if( sizeof(p)==
0580: 73 69 7a 65 6f 66 28 76 29 20 29 7b 0a 20 20 20  sizeof(v) ){.   
0590: 20 6d 65 6d 63 70 79 28 26 70 2c 20 26 76 2c 20   memcpy(&p, &v, 
05a0: 73 69 7a 65 6f 66 28 70 29 29 3b 0a 20 20 7d 65  sizeof(p));.  }e
05b0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
05c0: 20 73 69 7a 65 6f 66 28 70 29 3d 3d 73 69 7a 65   sizeof(p)==size
05d0: 6f 66 28 76 32 29 20 29 3b 0a 20 20 20 20 76 32  of(v2) );.    v2
05e0: 20 3d 20 28 75 33 32 29 76 3b 0a 20 20 20 20 6d   = (u32)v;.    m
05f0: 65 6d 63 70 79 28 26 70 2c 20 26 76 32 2c 20 73  emcpy(&p, &v2, s
0600: 69 7a 65 6f 66 28 70 29 29 3b 0a 20 20 7d 0a 20  izeof(p));.  }. 
0610: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f   return p;.}.../
0620: 2a 0a 2a 2a 20 41 20 54 43 4c 20 63 6f 6d 6d 61  *.** A TCL comma
0630: 6e 64 20 74 68 61 74 20 72 65 74 75 72 6e 73 20  nd that returns 
0640: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
0650: 68 65 20 73 71 6c 69 74 65 2a 20 70 6f 69 6e 74  he sqlite* point
0660: 65 72 0a 2a 2a 20 66 6f 72 20 61 6e 20 73 71 6c  er.** for an sql
0670: 69 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  ite connection i
0680: 6e 73 74 61 6e 63 65 2e 20 20 42 61 64 20 74 68  nstance.  Bad th
0690: 69 6e 67 73 20 68 61 70 70 65 6e 20 69 66 20 74  ings happen if t
06a0: 68 65 0a 2a 2a 20 69 6e 70 75 74 20 69 73 20 6e  he.** input is n
06b0: 6f 74 20 61 6e 20 73 71 6c 69 74 65 20 63 6f 6e  ot an sqlite con
06c0: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  nection..*/.stat
06d0: 69 63 20 69 6e 74 20 67 65 74 5f 73 71 6c 69 74  ic int get_sqlit
06e0: 65 5f 70 6f 69 6e 74 65 72 28 0a 20 20 76 6f 69  e_pointer(.  voi
06f0: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
0700: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
0710: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
0720: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
0730: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
0740: 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 2a  truct SqliteDb *
0750: 70 3b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f  p;.  Tcl_CmdInfo
0760: 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 63 68 61 72   cmdInfo;.  char
0770: 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 69 66   zBuf[100];.  if
0780: 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
0790: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
07a0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
07b0: 76 2c 20 22 53 51 4c 49 54 45 2d 43 4f 4e 4e 45  v, "SQLITE-CONNE
07c0: 43 54 49 4f 4e 22 29 3b 0a 20 20 20 20 72 65 74  CTION");.    ret
07d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
07e0: 20 7d 0a 20 20 69 66 28 20 21 54 63 6c 5f 47 65   }.  if( !Tcl_Ge
07f0: 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74  tCommandInfo(int
0800: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
0810: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 63 6d  ng(objv[1]), &cm
0820: 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54 63  dInfo) ){.    Tc
0830: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
0840: 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20  nterp, "command 
0850: 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 0a 20 20  not found: ",.  
0860: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74           Tcl_Get
0870: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
0880: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
0890: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
08a0: 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 28 73 74 72  ;.  }.  p = (str
08b0: 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29 63 6d  uct SqliteDb*)cm
08c0: 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44  dInfo.objClientD
08d0: 61 74 61 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a  ata;.  sprintf(z
08e0: 42 75 66 2c 20 22 25 70 22 2c 20 70 2d 3e 64 62  Buf, "%p", p->db
08f0: 29 3b 0a 20 20 69 66 28 20 73 74 72 6e 63 6d 70  );.  if( strncmp
0900: 28 7a 42 75 66 2c 22 30 78 22 2c 32 29 20 29 7b  (zBuf,"0x",2) ){
0910: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
0920: 66 2c 20 22 30 78 25 70 22 2c 20 70 2d 3e 64 62  f, "0x%p", p->db
0930: 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70  );.  }.  Tcl_App
0940: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
0950: 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65  , zBuf, 0);.  re
0960: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
0970: 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 70  /*.** Decode a p
0980: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
0990: 69 74 65 33 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  ite3 object..*/.
09a0: 69 6e 74 20 67 65 74 44 62 50 6f 69 6e 74 65 72  int getDbPointer
09b0: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
09c0: 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  erp, const char 
09d0: 2a 7a 41 2c 20 73 71 6c 69 74 65 33 20 2a 2a 70  *zA, sqlite3 **p
09e0: 70 44 62 29 7b 0a 20 20 73 74 72 75 63 74 20 53  pDb){.  struct S
09f0: 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20 54 63  qliteDb *p;.  Tc
0a00: 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66  l_CmdInfo cmdInf
0a10: 6f 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  o;.  if( Tcl_Get
0a20: 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65  CommandInfo(inte
0a30: 72 70 2c 20 7a 41 2c 20 26 63 6d 64 49 6e 66 6f  rp, zA, &cmdInfo
0a40: 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 73 74  ) ){.    p = (st
0a50: 72 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29 63  ruct SqliteDb*)c
0a60: 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74  mdInfo.objClient
0a70: 44 61 74 61 3b 0a 20 20 20 20 2a 70 70 44 62 20  Data;.    *ppDb 
0a80: 3d 20 70 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65  = p->db;.  }else
0a90: 7b 0a 20 20 20 20 2a 70 70 44 62 20 3d 20 28 73  {.    *ppDb = (s
0aa0: 71 6c 69 74 65 33 2a 29 73 71 6c 69 74 65 33 54  qlite3*)sqlite3T
0ab0: 65 73 74 54 65 78 74 54 6f 50 74 72 28 7a 41 29  estTextToPtr(zA)
0ac0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
0ad0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 63 6f 6e 73 74  CL_OK;.}...const
0ae0: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 54 65   char *sqlite3Te
0af0: 73 74 45 72 72 6f 72 4e 61 6d 65 28 69 6e 74 20  stErrorName(int 
0b00: 72 63 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  rc){.  const cha
0b10: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  r *zName = 0;.  
0b20: 73 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20  switch( rc ){.  
0b30: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4f 4b    case SQLITE_OK
0b40: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
0b50: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0b60: 54 45 5f 4f 4b 22 3b 20 20 20 20 20 20 20 20 20  TE_OK";         
0b70: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0b80: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45 52    case SQLITE_ER
0b90: 52 4f 52 3a 20 20 20 20 20 20 20 20 20 20 20 20  ROR:            
0ba0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0bb0: 54 45 5f 45 52 52 4f 52 22 3b 20 20 20 20 20 20  TE_ERROR";      
0bc0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0bd0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
0be0: 54 45 52 4e 41 4c 3a 20 20 20 20 20 20 20 20 20  TERNAL:         
0bf0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0c00: 54 45 5f 49 4e 54 45 52 4e 41 4c 22 3b 20 20 20  TE_INTERNAL";   
0c10: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0c20: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 45    case SQLITE_PE
0c30: 52 4d 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  RM:             
0c40: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0c50: 54 45 5f 50 45 52 4d 22 3b 20 20 20 20 20 20 20  TE_PERM";       
0c60: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0c70: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42    case SQLITE_AB
0c80: 4f 52 54 3a 20 20 20 20 20 20 20 20 20 20 20 20  ORT:            
0c90: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0ca0: 54 45 5f 41 42 4f 52 54 22 3b 20 20 20 20 20 20  TE_ABORT";      
0cb0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0cc0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55    case SQLITE_BU
0cd0: 53 59 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  SY:             
0ce0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0cf0: 54 45 5f 42 55 53 59 22 3b 20 20 20 20 20 20 20  TE_BUSY";       
0d00: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0d10: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f    case SQLITE_LO
0d20: 43 4b 45 44 3a 20 20 20 20 20 20 20 20 20 20 20  CKED:           
0d30: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0d40: 54 45 5f 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20  TE_LOCKED";     
0d50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0d60: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f    case SQLITE_LO
0d70: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
0d80: 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  :  zName = "SQLI
0d90: 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
0da0: 43 41 43 48 45 22 3b 62 72 65 61 6b 3b 0a 20 20  CACHE";break;.  
0db0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
0dc0: 4d 45 4d 3a 20 20 20 20 20 20 20 20 20 20 20 20  MEM:            
0dd0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0de0: 54 45 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20  TE_NOMEM";      
0df0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0e00: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45    case SQLITE_RE
0e10: 41 44 4f 4e 4c 59 3a 20 20 20 20 20 20 20 20 20  ADONLY:         
0e20: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0e30: 54 45 5f 52 45 41 44 4f 4e 4c 59 22 3b 20 20 20  TE_READONLY";   
0e40: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0e50: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
0e60: 54 45 52 52 55 50 54 3a 20 20 20 20 20 20 20 20  TERRUPT:        
0e70: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0e80: 54 45 5f 49 4e 54 45 52 52 55 50 54 22 3b 20 20  TE_INTERRUPT";  
0e90: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0ea0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
0eb0: 45 52 52 3a 20 20 20 20 20 20 20 20 20 20 20 20  ERR:            
0ec0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0ed0: 54 45 5f 49 4f 45 52 52 22 3b 20 20 20 20 20 20  TE_IOERR";      
0ee0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0ef0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
0f00: 52 52 55 50 54 3a 20 20 20 20 20 20 20 20 20 20  RRUPT:          
0f10: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0f20: 54 45 5f 43 4f 52 52 55 50 54 22 3b 20 20 20 20  TE_CORRUPT";    
0f30: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0f40: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
0f50: 54 46 4f 55 4e 44 3a 20 20 20 20 20 20 20 20 20  TFOUND:         
0f60: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0f70: 54 45 5f 4e 4f 54 46 4f 55 4e 44 22 3b 20 20 20  TE_NOTFOUND";   
0f80: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0f90: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 55    case SQLITE_FU
0fa0: 4c 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  LL:             
0fb0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0fc0: 54 45 5f 46 55 4c 4c 22 3b 20 20 20 20 20 20 20  TE_FULL";       
0fd0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0fe0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41    case SQLITE_CA
0ff0: 4e 54 4f 50 45 4e 3a 20 20 20 20 20 20 20 20 20  NTOPEN:         
1000: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1010: 54 45 5f 43 41 4e 54 4f 50 45 4e 22 3b 20 20 20  TE_CANTOPEN";   
1020: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1030: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 52    case SQLITE_PR
1040: 4f 54 4f 43 4f 4c 3a 20 20 20 20 20 20 20 20 20  OTOCOL:         
1050: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1060: 54 45 5f 50 52 4f 54 4f 43 4f 4c 22 3b 20 20 20  TE_PROTOCOL";   
1070: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1080: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45 4d    case SQLITE_EM
1090: 50 54 59 3a 20 20 20 20 20 20 20 20 20 20 20 20  PTY:            
10a0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
10b0: 54 45 5f 45 4d 50 54 59 22 3b 20 20 20 20 20 20  TE_EMPTY";      
10c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
10d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 43    case SQLITE_SC
10e0: 48 45 4d 41 3a 20 20 20 20 20 20 20 20 20 20 20  HEMA:           
10f0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1100: 54 45 5f 53 43 48 45 4d 41 22 3b 20 20 20 20 20  TE_SCHEMA";     
1110: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1120: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 4f    case SQLITE_TO
1130: 4f 42 49 47 3a 20 20 20 20 20 20 20 20 20 20 20  OBIG:           
1140: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1150: 54 45 5f 54 4f 4f 42 49 47 22 3b 20 20 20 20 20  TE_TOOBIG";     
1160: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1170: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
1180: 4e 53 54 52 41 49 4e 54 3a 20 20 20 20 20 20 20  NSTRAINT:       
1190: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
11a0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 22 3b 20  TE_CONSTRAINT"; 
11b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
11c0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49    case SQLITE_MI
11d0: 53 4d 41 54 43 48 3a 20 20 20 20 20 20 20 20 20  SMATCH:         
11e0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
11f0: 54 45 5f 4d 49 53 4d 41 54 43 48 22 3b 20 20 20  TE_MISMATCH";   
1200: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1210: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49    case SQLITE_MI
1220: 53 55 53 45 3a 20 20 20 20 20 20 20 20 20 20 20  SUSE:           
1230: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1240: 54 45 5f 4d 49 53 55 53 45 22 3b 20 20 20 20 20  TE_MISUSE";     
1250: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1260: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
1270: 4c 46 53 3a 20 20 20 20 20 20 20 20 20 20 20 20  LFS:            
1280: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1290: 54 45 5f 4e 4f 4c 46 53 22 3b 20 20 20 20 20 20  TE_NOLFS";      
12a0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
12b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 55    case SQLITE_AU
12c0: 54 48 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  TH:             
12d0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
12e0: 54 45 5f 41 55 54 48 22 3b 20 20 20 20 20 20 20  TE_AUTH";       
12f0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1300: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4f    case SQLITE_FO
1310: 52 4d 41 54 3a 20 20 20 20 20 20 20 20 20 20 20  RMAT:           
1320: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1330: 54 45 5f 46 4f 52 4d 41 54 22 3b 20 20 20 20 20  TE_FORMAT";     
1340: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1350: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 41    case SQLITE_RA
1360: 4e 47 45 3a 20 20 20 20 20 20 20 20 20 20 20 20  NGE:            
1370: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1380: 54 45 5f 52 41 4e 47 45 22 3b 20 20 20 20 20 20  TE_RANGE";      
1390: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
13a0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
13b0: 54 41 44 42 3a 20 20 20 20 20 20 20 20 20 20 20  TADB:           
13c0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
13d0: 54 45 5f 4e 4f 54 41 44 42 22 3b 20 20 20 20 20  TE_NOTADB";     
13e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
13f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 4f    case SQLITE_RO
1400: 57 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  W:              
1410: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1420: 54 45 5f 52 4f 57 22 3b 20 20 20 20 20 20 20 20  TE_ROW";        
1430: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1440: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 4f    case SQLITE_DO
1450: 4e 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  NE:             
1460: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1470: 54 45 5f 44 4f 4e 45 22 3b 20 20 20 20 20 20 20  TE_DONE";       
1480: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1490: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
14a0: 45 52 52 5f 52 45 41 44 3a 20 20 20 20 20 20 20  ERR_READ:       
14b0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
14c0: 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 22 3b 20  TE_IOERR_READ"; 
14d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
14e0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
14f0: 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3a 20  ERR_SHORT_READ: 
1500: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1510: 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
1520: 45 41 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  EAD";  break;.  
1530: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
1540: 45 52 52 5f 57 52 49 54 45 3a 20 20 20 20 20 20  ERR_WRITE:      
1550: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1560: 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 22 3b  TE_IOERR_WRITE";
1570: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1580: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
1590: 45 52 52 5f 46 53 59 4e 43 3a 20 20 20 20 20 20  ERR_FSYNC:      
15a0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
15b0: 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 22 3b  TE_IOERR_FSYNC";
15c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
15d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
15e0: 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 3a 20 20  ERR_DIR_FSYNC:  
15f0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1600: 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59  TE_IOERR_DIR_FSY
1610: 4e 43 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  NC";   break;.  
1620: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
1630: 45 52 52 5f 54 52 55 4e 43 41 54 45 3a 20 20 20  ERR_TRUNCATE:   
1640: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1650: 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
1660: 45 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  E";    break;.  
1670: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
1680: 45 52 52 5f 46 53 54 41 54 3a 20 20 20 20 20 20  ERR_FSTAT:      
1690: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
16a0: 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 22 3b  TE_IOERR_FSTAT";
16b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
16c0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
16d0: 45 52 52 5f 55 4e 4c 4f 43 4b 3a 20 20 20 20 20  ERR_UNLOCK:     
16e0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
16f0: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 22  TE_IOERR_UNLOCK"
1700: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
1710: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
1720: 45 52 52 5f 52 44 4c 4f 43 4b 3a 20 20 20 20 20  ERR_RDLOCK:     
1730: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1740: 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 22  TE_IOERR_RDLOCK"
1750: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
1760: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
1770: 45 52 52 5f 44 45 4c 45 54 45 3a 20 20 20 20 20  ERR_DELETE:     
1780: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1790: 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 22  TE_IOERR_DELETE"
17a0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
17b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
17c0: 45 52 52 5f 42 4c 4f 43 4b 45 44 3a 20 20 20 20  ERR_BLOCKED:    
17d0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
17e0: 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44  TE_IOERR_BLOCKED
17f0: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
1800: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
1810: 45 52 52 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20  ERR_NOMEM:      
1820: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1830: 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22 3b  TE_IOERR_NOMEM";
1840: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1850: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
1860: 45 52 52 5f 41 43 43 45 53 53 3a 20 20 20 20 20  ERR_ACCESS:     
1870: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1880: 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 22  TE_IOERR_ACCESS"
1890: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
18a0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
18b0: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
18c0: 44 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20 20  DLOCK:.         
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
18f0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
1900: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 22 3b 20  KRESERVEDLOCK"; 
1910: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1920: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
1930: 4b 3a 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  K:          zNam
1940: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
1950: 52 5f 4c 4f 43 4b 22 3b 20 20 20 20 20 20 20 20  R_LOCK";        
1960: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1970: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56  SQLITE_CORRUPT_V
1980: 54 41 42 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d  TAB:        zNam
1990: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 52 52  e = "SQLITE_CORR
19a0: 55 50 54 5f 56 54 41 42 22 3b 20 20 20 20 20 20  UPT_VTAB";      
19b0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
19c0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
19d0: 52 45 43 4f 56 45 52 59 3a 20 20 20 7a 4e 61 6d  RECOVERY:   zNam
19e0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44  e = "SQLITE_READ
19f0: 4f 4e 4c 59 5f 52 45 43 4f 56 45 52 59 22 3b 20  ONLY_RECOVERY"; 
1a00: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1a10: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
1a20: 43 41 4e 54 4c 4f 43 4b 3a 20 20 20 7a 4e 61 6d  CANTLOCK:   zNam
1a30: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44  e = "SQLITE_READ
1a40: 4f 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b 22 3b 20  ONLY_CANTLOCK"; 
1a50: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
1a60: 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  lt:             
1a70: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
1a80: 65 20 3d 20 22 53 51 4c 49 54 45 5f 55 6e 6b 6e  e = "SQLITE_Unkn
1a90: 6f 77 6e 22 3b 20 20 20 20 20 20 20 20 20 20 20  own";           
1aa0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
1ab0: 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 64 65  urn zName;.}.#de
1ac0: 66 69 6e 65 20 74 31 45 72 72 6f 72 4e 61 6d 65  fine t1ErrorName
1ad0: 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 6f   sqlite3TestErro
1ae0: 72 4e 61 6d 65 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  rName../*.** Con
1af0: 76 65 72 74 20 61 6e 20 73 71 6c 69 74 65 33 5f  vert an sqlite3_
1b00: 73 74 6d 74 2a 20 69 6e 74 6f 20 61 6e 20 73 71  stmt* into an sq
1b10: 6c 69 74 65 33 2a 2e 20 20 54 68 69 73 20 64 65  lite3*.  This de
1b20: 70 65 6e 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  pends on the.** 
1b30: 66 61 63 74 20 74 68 61 74 20 74 68 65 20 73 71  fact that the sq
1b40: 6c 69 74 65 33 2a 20 69 73 20 74 68 65 20 66 69  lite3* is the fi
1b50: 72 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65  rst field in the
1b60: 20 56 64 62 65 20 73 74 72 75 63 74 75 72 65 2e   Vdbe structure.
1b70: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 74 6d 74  .*/.#define Stmt
1b80: 54 6f 44 62 28 58 29 20 20 20 73 71 6c 69 74 65  ToDb(X)   sqlite
1b90: 33 5f 64 62 5f 68 61 6e 64 6c 65 28 58 29 0a 0a  3_db_handle(X)..
1ba0: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 61 20 72 65  /*.** Check a re
1bb0: 74 75 72 6e 20 76 61 6c 75 65 20 74 6f 20 6d 61  turn value to ma
1bc0: 6b 65 20 73 75 72 65 20 69 74 20 61 67 72 65 65  ke sure it agree
1bd0: 73 20 77 69 74 68 20 74 68 65 20 72 65 73 75 6c  s with the resul
1be0: 74 73 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74  ts.** from sqlit
1bf0: 65 33 5f 65 72 72 63 6f 64 65 2e 0a 2a 2f 0a 69  e3_errcode..*/.i
1c00: 6e 74 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  nt sqlite3TestEr
1c10: 72 43 6f 64 65 28 54 63 6c 5f 49 6e 74 65 72 70  rCode(Tcl_Interp
1c20: 20 2a 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65   *interp, sqlite
1c30: 33 20 2a 64 62 2c 20 69 6e 74 20 72 63 29 7b 0a  3 *db, int rc){.
1c40: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 68    if( sqlite3_th
1c50: 72 65 61 64 73 61 66 65 28 29 3d 3d 30 20 26 26  readsafe()==0 &&
1c60: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4d 49 53 55   rc!=SQLITE_MISU
1c70: 53 45 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  SE && rc!=SQLITE
1c80: 5f 4f 4b 0a 20 20 20 26 26 20 73 71 6c 69 74 65  _OK.   && sqlite
1c90: 33 5f 65 72 72 63 6f 64 65 28 64 62 29 21 3d 72  3_errcode(db)!=r
1ca0: 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42  c ){.    char zB
1cb0: 75 66 5b 32 30 30 5d 3b 0a 20 20 20 20 69 6e 74  uf[200];.    int
1cc0: 20 72 32 20 3d 20 73 71 6c 69 74 65 33 5f 65 72   r2 = sqlite3_er
1cd0: 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 20 20 73  rcode(db);.    s
1ce0: 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 65 72  printf(zBuf, "er
1cf0: 72 6f 72 20 63 6f 64 65 20 25 73 20 28 25 64 29  ror code %s (%d)
1d00: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
1d10: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 20  sqlite3_errcode 
1d20: 25 73 20 28 25 64 29 22 2c 0a 20 20 20 20 20 20  %s (%d)",.      
1d30: 20 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29   t1ErrorName(rc)
1d40: 2c 20 72 63 2c 20 74 31 45 72 72 6f 72 4e 61 6d  , rc, t1ErrorNam
1d50: 65 28 72 32 29 2c 20 72 32 29 3b 0a 20 20 20 20  e(r2), r2);.    
1d60: 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
1d70: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c  interp);.    Tcl
1d80: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1d90: 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
1da0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1db0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1dc0: 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20  ./*.** Decode a 
1dd0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
1de0: 6c 69 74 65 33 5f 73 74 6d 74 20 6f 62 6a 65 63  lite3_stmt objec
1df0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
1e00: 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
1e10: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1e20: 6e 74 65 72 70 2c 20 0a 20 20 63 6f 6e 73 74 20  nterp, .  const 
1e30: 63 68 61 72 20 2a 7a 41 72 67 2c 20 20 0a 20 20  char *zArg,  .  
1e40: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70  sqlite3_stmt **p
1e50: 70 53 74 6d 74 0a 29 7b 0a 20 20 2a 70 70 53 74  pStmt.){.  *ppSt
1e60: 6d 74 20 3d 20 28 73 71 6c 69 74 65 33 5f 73 74  mt = (sqlite3_st
1e70: 6d 74 2a 29 73 71 6c 69 74 65 33 54 65 73 74 54  mt*)sqlite3TestT
1e80: 65 78 74 54 6f 50 74 72 28 7a 41 72 67 29 3b 0a  extToPtr(zArg);.
1e90: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1ea0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1eb0: 74 65 20 61 20 74 65 78 74 20 72 65 70 72 65 73  te a text repres
1ec0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 20 70 6f  entation of a po
1ed0: 69 6e 74 65 72 20 74 68 61 74 20 63 61 6e 20 62  inter that can b
1ee0: 65 20 75 6e 64 65 72 73 74 6f 6f 64 0a 2a 2a 20  e understood.** 
1ef0: 62 79 20 74 68 65 20 67 65 74 44 62 50 6f 69 6e  by the getDbPoin
1f00: 74 65 72 20 61 6e 64 20 67 65 74 56 6d 50 6f 69  ter and getVmPoi
1f10: 6e 74 65 72 20 72 6f 75 74 69 6e 65 73 20 61 62  nter routines ab
1f20: 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ove..**.** The p
1f30: 72 6f 62 6c 65 6d 20 69 73 2c 20 6f 6e 20 73 6f  roblem is, on so
1f40: 6d 65 20 6d 61 63 68 69 6e 65 73 20 28 53 6f 6c  me machines (Sol
1f50: 61 72 69 73 29 20 69 66 20 79 6f 75 20 64 6f 20  aris) if you do 
1f60: 61 20 70 72 69 6e 74 66 20 77 69 74 68 0a 2a 2a  a printf with.**
1f70: 20 22 25 70 22 20 79 6f 75 20 63 61 6e 6e 6f 74   "%p" you cannot
1f80: 20 74 75 72 6e 20 61 72 6f 75 6e 64 20 61 6e 64   turn around and
1f90: 20 64 6f 20 61 20 73 63 61 6e 66 20 77 69 74 68   do a scanf with
1fa0: 20 74 68 65 20 73 61 6d 65 20 22 25 70 22 20 61   the same "%p" a
1fb0: 6e 64 0a 2a 2a 20 67 65 74 20 79 6f 75 72 20 70  nd.** get your p
1fc0: 6f 69 6e 74 65 72 20 62 61 63 6b 2e 20 20 59 6f  ointer back.  Yo
1fd0: 75 20 68 61 76 65 20 74 6f 20 70 72 65 70 65 6e  u have to prepen
1fe0: 64 20 61 20 22 30 78 22 20 62 65 66 6f 72 65 20  d a "0x" before 
1ff0: 69 74 20 77 69 6c 6c 0a 2a 2a 20 77 6f 72 6b 2e  it will.** work.
2000: 20 20 4f 72 20 61 74 20 6c 65 61 73 74 20 74 68    Or at least th
2010: 61 74 20 69 73 20 77 68 61 74 20 69 73 20 72 65  at is what is re
2020: 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 28 64 72  ported to me (dr
2030: 68 29 2e 20 20 42 75 74 20 74 68 69 73 0a 2a 2a  h).  But this.**
2040: 20 62 65 68 61 76 69 6f 72 20 76 61 72 69 65 73   behavior varies
2050: 20 66 72 6f 6d 20 6d 61 63 68 69 6e 65 20 74 6f   from machine to
2060: 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 65 20 73   machine.  The s
2070: 6f 6c 75 74 69 6f 6e 20 75 73 65 64 20 68 65 72  olution used her
2080: 20 69 73 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74   is.** to test t
2090: 68 65 20 73 74 72 69 6e 67 20 72 69 67 68 74 20  he string right 
20a0: 61 66 74 65 72 20 69 74 20 69 73 20 67 65 6e 65  after it is gene
20b0: 72 61 74 65 64 20 74 6f 20 73 65 65 20 69 66 20  rated to see if 
20c0: 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 75 6e 64  it can be.** und
20d0: 65 72 73 74 6f 6f 64 20 62 79 20 73 63 61 6e 66  erstood by scanf
20e0: 2c 20 61 6e 64 20 69 66 20 6e 6f 74 2c 20 74 72  , and if not, tr
20f0: 79 20 70 72 65 70 65 6e 64 69 6e 67 20 61 6e 20  y prepending an 
2100: 22 30 78 22 20 74 6f 20 73 65 65 20 69 66 0a 2a  "0x" to see if.*
2110: 2a 20 74 68 61 74 20 68 65 6c 70 73 2e 20 20 49  * that helps.  I
2120: 66 20 6e 6f 74 68 69 6e 67 20 77 6f 72 6b 73 2c  f nothing works,
2130: 20 61 20 66 61 74 61 6c 20 65 72 72 6f 72 20 69   a fatal error i
2140: 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a  s generated..*/.
2150: 69 6e 74 20 73 71 6c 69 74 65 33 54 65 73 74 4d  int sqlite3TestM
2160: 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 54 63  akePointerStr(Tc
2170: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2180: 2c 20 63 68 61 72 20 2a 7a 50 74 72 2c 20 76 6f  , char *zPtr, vo
2190: 69 64 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  id *p){.  sqlite
21a0: 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c 20  3_snprintf(100, 
21b0: 7a 50 74 72 2c 20 22 25 70 22 2c 20 70 29 3b 0a  zPtr, "%p", p);.
21c0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
21d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 61  .}../*.** The ca
21e0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 66  llback routine f
21f0: 6f 72 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f  or sqlite3_exec_
2200: 70 72 69 6e 74 66 28 29 2e 0a 2a 2f 0a 73 74 61  printf()..*/.sta
2210: 74 69 63 20 69 6e 74 20 65 78 65 63 5f 70 72 69  tic int exec_pri
2220: 6e 74 66 5f 63 62 28 76 6f 69 64 20 2a 70 41 72  ntf_cb(void *pAr
2230: 67 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 68 61  g, int argc, cha
2240: 72 20 2a 2a 61 72 67 76 2c 20 63 68 61 72 20 2a  r **argv, char *
2250: 2a 6e 61 6d 65 29 7b 0a 20 20 54 63 6c 5f 44 53  *name){.  Tcl_DS
2260: 74 72 69 6e 67 20 2a 73 74 72 20 3d 20 28 54 63  tring *str = (Tc
2270: 6c 5f 44 53 74 72 69 6e 67 2a 29 70 41 72 67 3b  l_DString*)pArg;
2280: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28  .  int i;..  if(
2290: 20 54 63 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67   Tcl_DStringLeng
22a0: 74 68 28 73 74 72 29 3d 3d 30 20 29 7b 0a 20 20  th(str)==0 ){.  
22b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
22c0: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54  c; i++){.      T
22d0: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
22e0: 45 6c 65 6d 65 6e 74 28 73 74 72 2c 20 6e 61 6d  Element(str, nam
22f0: 65 5b 69 5d 20 3f 20 6e 61 6d 65 5b 69 5d 20 3a  e[i] ? name[i] :
2300: 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a   "NULL");.    }.
2310: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
2320: 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
2330: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
2340: 6e 64 45 6c 65 6d 65 6e 74 28 73 74 72 2c 20 61  ndElement(str, a
2350: 72 67 76 5b 69 5d 20 3f 20 61 72 67 76 5b 69 5d  rgv[i] ? argv[i]
2360: 20 3a 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 7d 0a   : "NULL");.  }.
2370: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2380: 2a 0a 2a 2a 20 54 68 65 20 49 2f 4f 20 74 72 61  *.** The I/O tra
2390: 63 69 6e 67 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a  cing callback..*
23a0: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
23b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
23c0: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
23d0: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
23e0: 43 45 29 0a 73 74 61 74 69 63 20 46 49 4c 45 20  CE).static FILE 
23f0: 2a 69 6f 74 72 61 63 65 5f 66 69 6c 65 20 3d 20  *iotrace_file = 
2400: 30 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  0;.static void i
2410: 6f 5f 74 72 61 63 65 5f 63 61 6c 6c 62 61 63 6b  o_trace_callback
2420: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f  (const char *zFo
2430: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
2440: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73  _list ap;.  va_s
2450: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
2460: 29 3b 0a 20 20 76 66 70 72 69 6e 74 66 28 69 6f  );.  vfprintf(io
2470: 74 72 61 63 65 5f 66 69 6c 65 2c 20 7a 46 6f 72  trace_file, zFor
2480: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
2490: 6e 64 28 61 70 29 3b 0a 20 20 66 66 6c 75 73 68  nd(ap);.  fflush
24a0: 28 69 6f 74 72 61 63 65 5f 66 69 6c 65 29 3b 0a  (iotrace_file);.
24b0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
24c0: 55 73 61 67 65 3a 20 20 69 6f 5f 74 72 61 63 65  Usage:  io_trace
24d0: 20 46 49 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20   FILENAME.**.** 
24e0: 54 75 72 6e 20 49 2f 4f 20 74 72 61 63 69 6e 67  Turn I/O tracing
24f0: 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 49 66 20   on or off.  If 
2500: 46 49 4c 45 4e 41 4d 45 20 69 73 20 6e 6f 74 20  FILENAME is not 
2510: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c  an empty string,
2520: 0a 2a 2a 20 49 2f 4f 20 74 72 61 63 69 6e 67 20  .** I/O tracing 
2530: 62 65 67 69 6e 73 20 67 6f 69 6e 67 20 69 6e 74  begins going int
2540: 6f 20 46 49 4c 45 4e 41 4d 45 2e 20 49 66 20 46  o FILENAME. If F
2550: 49 4c 45 4e 41 4d 45 20 69 73 20 61 6e 20 65 6d  ILENAME is an em
2560: 70 74 79 0a 2a 2a 20 73 74 72 69 6e 67 2c 20 49  pty.** string, I
2570: 2f 4f 20 74 72 61 63 69 6e 67 20 69 73 20 74 75  /O tracing is tu
2580: 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61  rned off..*/.sta
2590: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 69 6f 5f  tic int test_io_
25a0: 74 72 61 63 65 28 0a 20 20 76 6f 69 64 20 2a 4e  trace(.  void *N
25b0: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
25c0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
25d0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
25e0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
25f0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
2600: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
2610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2620: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
2630: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
2640: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
2650: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
2660: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
2670: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
2680: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20  ITE_OMIT_TRACE) 
2690: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
26a0: 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45  E_ENABLE_IOTRACE
26b0: 29 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ).  if( argc!=2 
26c0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
26d0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
26e0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
26f0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
2700: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20  gv[0],.         
2710: 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20   " FILENAME\"", 
2720: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
2730: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2740: 69 66 28 20 69 6f 74 72 61 63 65 5f 66 69 6c 65  if( iotrace_file
2750: 20 29 7b 0a 20 20 20 20 69 66 28 20 69 6f 74 72   ){.    if( iotr
2760: 61 63 65 5f 66 69 6c 65 21 3d 73 74 64 6f 75 74  ace_file!=stdout
2770: 20 26 26 20 69 6f 74 72 61 63 65 5f 66 69 6c 65   && iotrace_file
2780: 21 3d 73 74 64 65 72 72 20 29 7b 0a 20 20 20 20  !=stderr ){.    
2790: 20 20 66 63 6c 6f 73 65 28 69 6f 74 72 61 63 65    fclose(iotrace
27a0: 5f 66 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  _file);.    }.  
27b0: 20 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 20 3d    iotrace_file =
27c0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49   0;.    sqlite3I
27d0: 6f 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 7d 0a  oTrace = 0;.  }.
27e0: 20 20 69 66 28 20 61 72 67 76 5b 31 5d 5b 30 5d    if( argv[1][0]
27f0: 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63   ){.    if( strc
2800: 6d 70 28 61 72 67 76 5b 31 5d 2c 22 73 74 64 6f  mp(argv[1],"stdo
2810: 75 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ut")==0 ){.     
2820: 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 20 3d 20   iotrace_file = 
2830: 73 74 64 6f 75 74 3b 0a 20 20 20 20 7d 65 6c 73  stdout;.    }els
2840: 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67  e if( strcmp(arg
2850: 76 5b 31 5d 2c 22 73 74 64 65 72 72 22 29 3d 3d  v[1],"stderr")==
2860: 30 20 29 7b 0a 20 20 20 20 20 20 69 6f 74 72 61  0 ){.      iotra
2870: 63 65 5f 66 69 6c 65 20 3d 20 73 74 64 65 72 72  ce_file = stderr
2880: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2890: 20 20 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 20     iotrace_file 
28a0: 3d 20 66 6f 70 65 6e 28 61 72 67 76 5b 31 5d 2c  = fopen(argv[1],
28b0: 20 22 77 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20   "w");.    }.   
28c0: 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 20   sqlite3IoTrace 
28d0: 3d 20 69 6f 5f 74 72 61 63 65 5f 63 61 6c 6c 62  = io_trace_callb
28e0: 61 63 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ack;.  }.#endif.
28f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2900: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  .}.../*.** Usage
2910: 3a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f  :  sqlite3_exec_
2920: 70 72 69 6e 74 66 20 20 44 42 20 20 46 4f 52 4d  printf  DB  FORM
2930: 41 54 20 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a  AT  STRING.**.**
2940: 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69   Invoke the sqli
2950: 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74 66 28  te3_exec_printf(
2960: 29 20 69 6e 74 65 72 66 61 63 65 20 75 73 69 6e  ) interface usin
2970: 67 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  g the open datab
2980: 61 73 65 0a 2a 2a 20 44 42 2e 20 20 54 68 65 20  ase.** DB.  The 
2990: 53 51 4c 20 69 73 20 74 68 65 20 73 74 72 69 6e  SQL is the strin
29a0: 67 20 46 4f 52 4d 41 54 2e 20 20 54 68 65 20 66  g FORMAT.  The f
29b0: 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 73 68 6f  ormat string sho
29c0: 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6f  uld contain.** o
29d0: 6e 65 20 25 73 20 6f 72 20 25 71 2e 20 20 53 54  ne %s or %q.  ST
29e0: 52 49 4e 47 20 69 73 20 74 68 65 20 76 61 6c 75  RING is the valu
29f0: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  e inserted into 
2a00: 25 73 20 6f 72 20 25 71 2e 0a 2a 2f 0a 73 74 61  %s or %q..*/.sta
2a10: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 78 65  tic int test_exe
2a20: 63 5f 70 72 69 6e 74 66 28 0a 20 20 76 6f 69 64  c_printf(.  void
2a30: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
2a40: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2a50: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
2a60: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
2a70: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
2a80: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
2a90: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
2aa0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
2ab0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
2ac0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
2ad0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
2ae0: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
2af0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
2b00: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  ;.  Tcl_DString 
2b10: 73 74 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  str;.  int rc;. 
2b20: 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b   char *zErr = 0;
2b30: 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  .  char *zSql;. 
2b40: 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a   char zBuf[30];.
2b50: 20 20 69 66 28 20 61 72 67 63 21 3d 34 20 29 7b    if( argc!=4 ){
2b60: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
2b70: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
2b80: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
2b90: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
2ba0: 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44  [0], .       " D
2bb0: 42 20 46 4f 52 4d 41 54 20 53 54 52 49 4e 47 22  B FORMAT STRING"
2bc0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
2bd0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2be0: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
2bf0: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
2c00: 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
2c10: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
2c20: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
2c30: 73 74 72 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73  str);.  zSql = s
2c40: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
2c50: 72 67 76 5b 32 5d 2c 20 61 72 67 76 5b 33 5d 29  rgv[2], argv[3])
2c60: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
2c70: 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20  _exec(db, zSql, 
2c80: 65 78 65 63 5f 70 72 69 6e 74 66 5f 63 62 2c 20  exec_printf_cb, 
2c90: 26 73 74 72 2c 20 26 7a 45 72 72 29 3b 0a 20 20  &str, &zErr);.  
2ca0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
2cb0: 6c 29 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42  l);.  sprintf(zB
2cc0: 75 66 2c 20 22 25 64 22 2c 20 72 63 29 3b 0a 20  uf, "%d", rc);. 
2cd0: 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65   Tcl_AppendEleme
2ce0: 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29  nt(interp, zBuf)
2cf0: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c  ;.  Tcl_AppendEl
2d00: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 63  ement(interp, rc
2d10: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 63  ==SQLITE_OK ? Tc
2d20: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
2d30: 73 74 72 29 20 3a 20 7a 45 72 72 29 3b 0a 20 20  str) : zErr);.  
2d40: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
2d50: 26 73 74 72 29 3b 0a 20 20 69 66 28 20 7a 45 72  &str);.  if( zEr
2d60: 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  r ) sqlite3_free
2d70: 28 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 73 71  (zErr);.  if( sq
2d80: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
2d90: 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
2da0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2db0: 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ROR;.  return TC
2dc0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
2dd0: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65  sage:  sqlite3_e
2de0: 78 65 63 5f 68 65 78 20 20 44 42 20 20 48 45 58  xec_hex  DB  HEX
2df0: 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  .**.** Invoke th
2e00: 65 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  e sqlite3_exec()
2e10: 20 6f 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61   on a string tha
2e20: 74 20 69 73 20 6f 62 74 61 69 6e 65 64 20 62 79  t is obtained by
2e30: 20 74 72 61 6e 73 6c 61 74 69 6e 67 0a 2a 2a 20   translating.** 
2e40: 48 45 58 20 69 6e 74 6f 20 41 53 43 49 49 2e 20  HEX into ASCII. 
2e50: 20 4d 6f 73 74 20 63 68 61 72 61 63 74 65 72 73   Most characters
2e60: 20 61 72 65 20 74 72 61 6e 73 6c 61 74 65 64 20   are translated 
2e70: 61 73 20 69 73 2e 20 20 25 48 48 20 62 65 63 6f  as is.  %HH beco
2e80: 6d 65 73 0a 2a 2a 20 61 20 68 65 78 20 63 68 61  mes.** a hex cha
2e90: 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  racter..*/.stati
2ea0: 63 20 69 6e 74 20 74 65 73 74 5f 65 78 65 63 5f  c int test_exec_
2eb0: 68 65 78 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  hex(.  void *Not
2ec0: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
2ed0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
2ee0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
2ef0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
2f00: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
2f10: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2f30: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
2f40: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
2f50: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
2f60: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
2f70: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
2f80: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 54  sqlite3 *db;.  T
2f90: 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a  cl_DString str;.
2fa0: 20 20 69 6e 74 20 72 63 2c 20 69 2c 20 6a 3b 0a    int rc, i, j;.
2fb0: 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30    char *zErr = 0
2fc0: 3b 0a 20 20 63 68 61 72 20 2a 7a 48 65 78 3b 0a  ;.  char *zHex;.
2fd0: 20 20 63 68 61 72 20 7a 53 71 6c 5b 35 30 30 5d    char zSql[500]
2fe0: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30  ;.  char zBuf[30
2ff0: 5d 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33  ];.  if( argc!=3
3000: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
3010: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
3020: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
3030: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
3040: 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
3050: 22 20 44 42 20 48 45 58 22 2c 20 30 29 3b 0a 20  " DB HEX", 0);. 
3060: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
3070: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
3080: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
3090: 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
30a0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
30b0: 52 52 4f 52 3b 0a 20 20 7a 48 65 78 20 3d 20 61  RROR;.  zHex = a
30c0: 72 67 76 5b 32 5d 3b 0a 20 20 66 6f 72 28 69 3d  rgv[2];.  for(i=
30d0: 6a 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 53  j=0; i<sizeof(zS
30e0: 71 6c 29 20 26 26 20 7a 48 65 78 5b 6a 5d 3b 20  ql) && zHex[j]; 
30f0: 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  i++, j++){.    i
3100: 66 28 20 7a 48 65 78 5b 6a 5d 3d 3d 27 25 27 20  f( zHex[j]=='%' 
3110: 26 26 20 7a 48 65 78 5b 6a 2b 32 5d 20 26 26 20  && zHex[j+2] && 
3120: 7a 48 65 78 5b 6a 2b 32 5d 20 29 7b 0a 20 20 20  zHex[j+2] ){.   
3130: 20 20 20 7a 53 71 6c 5b 69 5d 20 3d 20 28 74 65     zSql[i] = (te
3140: 73 74 48 65 78 54 6f 49 6e 74 28 7a 48 65 78 5b  stHexToInt(zHex[
3150: 6a 2b 31 5d 29 3c 3c 34 29 20 2b 20 74 65 73 74  j+1])<<4) + test
3160: 48 65 78 54 6f 49 6e 74 28 7a 48 65 78 5b 6a 2b  HexToInt(zHex[j+
3170: 32 5d 29 3b 0a 20 20 20 20 20 20 6a 20 2b 3d 20  2]);.      j += 
3180: 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  2;.    }else{.  
3190: 20 20 20 20 7a 53 71 6c 5b 69 5d 20 3d 20 7a 48      zSql[i] = zH
31a0: 65 78 5b 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  ex[j];.    }.  }
31b0: 0a 20 20 7a 53 71 6c 5b 69 5d 20 3d 20 30 3b 0a  .  zSql[i] = 0;.
31c0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
31d0: 74 28 26 73 74 72 29 3b 0a 20 20 72 63 20 3d 20  t(&str);.  rc = 
31e0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
31f0: 20 7a 53 71 6c 2c 20 65 78 65 63 5f 70 72 69 6e   zSql, exec_prin
3200: 74 66 5f 63 62 2c 20 26 73 74 72 2c 20 26 7a 45  tf_cb, &str, &zE
3210: 72 72 29 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a  rr);.  sprintf(z
3220: 42 75 66 2c 20 22 25 64 22 2c 20 72 63 29 3b 0a  Buf, "%d", rc);.
3230: 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d    Tcl_AppendElem
3240: 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ent(interp, zBuf
3250: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45  );.  Tcl_AppendE
3260: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72  lement(interp, r
3270: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54  c==SQLITE_OK ? T
3280: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
3290: 26 73 74 72 29 20 3a 20 7a 45 72 72 29 3b 0a 20  &str) : zErr);. 
32a0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
32b0: 28 26 73 74 72 29 3b 0a 20 20 69 66 28 20 7a 45  (&str);.  if( zE
32c0: 72 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  rr ) sqlite3_fre
32d0: 65 28 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 73  e(zErr);.  if( s
32e0: 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
32f0: 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63  e(interp, db, rc
3300: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
3310: 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54  RROR;.  return T
3320: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
3330: 55 73 61 67 65 3a 20 20 64 62 5f 65 6e 74 65 72  Usage:  db_enter
3340: 20 44 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 64   DB.**         d
3350: 62 5f 6c 65 61 76 65 20 44 42 0a 2a 2a 0a 2a 2a  b_leave DB.**.**
3360: 20 45 6e 74 65 72 20 6f 72 20 6c 65 61 76 65 20   Enter or leave 
3370: 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 61 20 64  the mutex on a d
3380: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
3390: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
33a0: 74 20 64 62 5f 65 6e 74 65 72 28 0a 20 20 76 6f  t db_enter(.  vo
33b0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
33c0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
33d0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
33e0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
33f0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
3400: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
3410: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
3420: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3430: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
3440: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
3450: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
3460: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
3470: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
3480: 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  db;.  if( argc!=
3490: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
34a0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
34b0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
34c0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
34d0: 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
34e0: 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
34f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
3500: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
3510: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
3520: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
3530: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
3540: 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  R;.  sqlite3_mut
3550: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
3560: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ex);.  return TC
3570: 4c 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69  L_OK;.}.static i
3580: 6e 74 20 64 62 5f 6c 65 61 76 65 28 0a 20 20 76  nt db_leave(.  v
3590: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
35a0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
35b0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
35c0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
35d0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
35e0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
35f0: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
3600: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3610: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
3620: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
3630: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
3640: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
3650: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
3660: 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21  *db;.  if( argc!
3670: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
3680: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
3690: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
36a0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
36b0: 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
36c0: 20 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20    " DB", 0);.   
36d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
36e0: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
36f0: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
3700: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
3710: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
3720: 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  OR;.  sqlite3_mu
3730: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
3740: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  tex);.  return T
3750: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
3760: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
3770: 65 78 65 63 20 20 44 42 20 20 53 51 4c 0a 2a 2a  exec  DB  SQL.**
3780: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73  .** Invoke the s
3790: 71 6c 69 74 65 33 5f 65 78 65 63 20 69 6e 74 65  qlite3_exec inte
37a0: 72 66 61 63 65 20 75 73 69 6e 67 20 74 68 65 20  rface using the 
37b0: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 44 42  open database DB
37c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
37d0: 65 73 74 5f 65 78 65 63 28 0a 20 20 76 6f 69 64  est_exec(.  void
37e0: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
37f0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
3800: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
3810: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
3820: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
3830: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
3840: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
3850: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
3860: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
3870: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
3880: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
3890: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
38a0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
38b0: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  ;.  Tcl_DString 
38c0: 73 74 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  str;.  int rc;. 
38d0: 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b   char *zErr = 0;
38e0: 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  .  char *zSql;. 
38f0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61   int i, j;.  cha
3900: 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 69 66  r zBuf[30];.  if
3910: 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20  ( argc!=3 ){.   
3920: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
3930: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
3940: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
3950: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
3960: 20 0a 20 20 20 20 20 20 20 22 20 44 42 20 53 51   .       " DB SQ
3970: 4c 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  L", 0);.    retu
3980: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
3990: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
39a0: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
39b0: 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
39c0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
39d0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
39e0: 28 26 73 74 72 29 3b 0a 20 20 7a 53 71 6c 20 3d  (&str);.  zSql =
39f0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
3a00: 28 22 25 73 22 2c 20 61 72 67 76 5b 32 5d 29 3b  ("%s", argv[2]);
3a10: 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 53  .  for(i=j=0; zS
3a20: 71 6c 5b 69 5d 3b 29 7b 0a 20 20 20 20 69 66 28  ql[i];){.    if(
3a30: 20 7a 53 71 6c 5b 69 5d 3d 3d 27 25 27 20 29 7b   zSql[i]=='%' ){
3a40: 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d  .      zSql[j++]
3a50: 20 3d 20 28 74 65 73 74 48 65 78 54 6f 49 6e 74   = (testHexToInt
3a60: 28 7a 53 71 6c 5b 69 2b 31 5d 29 3c 3c 34 29 20  (zSql[i+1])<<4) 
3a70: 2b 20 74 65 73 74 48 65 78 54 6f 49 6e 74 28 7a  + testHexToInt(z
3a80: 53 71 6c 5b 69 2b 32 5d 29 3b 0a 20 20 20 20 20  Sql[i+2]);.     
3a90: 20 69 20 2b 3d 20 33 3b 0a 20 20 20 20 7d 65 6c   i += 3;.    }el
3aa0: 73 65 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a  se{.      zSql[j
3ab0: 2b 2b 5d 20 3d 20 7a 53 71 6c 5b 69 2b 2b 5d 3b  ++] = zSql[i++];
3ac0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 53 71  .    }.  }.  zSq
3ad0: 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 63 20 3d  l[j] = 0;.  rc =
3ae0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62   sqlite3_exec(db
3af0: 2c 20 7a 53 71 6c 2c 20 65 78 65 63 5f 70 72 69  , zSql, exec_pri
3b00: 6e 74 66 5f 63 62 2c 20 26 73 74 72 2c 20 26 7a  ntf_cb, &str, &z
3b10: 45 72 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Err);.  sqlite3_
3b20: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 73 70  free(zSql);.  sp
3b30: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22  rintf(zBuf, "%d"
3b40: 2c 20 72 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70  , rc);.  Tcl_App
3b50: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
3b60: 70 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f  p, zBuf);.  Tcl_
3b70: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
3b80: 74 65 72 70 2c 20 72 63 3d 3d 53 51 4c 49 54 45  terp, rc==SQLITE
3b90: 5f 4f 4b 20 3f 20 54 63 6c 5f 44 53 74 72 69 6e  _OK ? Tcl_DStrin
3ba0: 67 56 61 6c 75 65 28 26 73 74 72 29 20 3a 20 7a  gValue(&str) : z
3bb0: 45 72 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  Err);.  Tcl_DStr
3bc0: 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20  ingFree(&str);. 
3bd0: 20 69 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69   if( zErr ) sqli
3be0: 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a  te3_free(zErr);.
3bf0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
3c00: 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
3c10: 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72   db, rc) ) retur
3c20: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
3c30: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
3c40: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
3c50: 71 6c 69 74 65 33 5f 65 78 65 63 5f 6e 72 20 20  qlite3_exec_nr  
3c60: 44 42 20 20 53 51 4c 0a 2a 2a 0a 2a 2a 20 49 6e  DB  SQL.**.** In
3c70: 76 6f 6b 65 20 74 68 65 20 73 71 6c 69 74 65 33  voke the sqlite3
3c80: 5f 65 78 65 63 20 69 6e 74 65 72 66 61 63 65 20  _exec interface 
3c90: 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20 64  using the open d
3ca0: 61 74 61 62 61 73 65 20 44 42 2e 20 20 44 69 73  atabase DB.  Dis
3cb0: 63 61 72 64 0a 2a 2a 20 61 6c 6c 20 72 65 73 75  card.** all resu
3cc0: 6c 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  lts.*/.static in
3cd0: 74 20 74 65 73 74 5f 65 78 65 63 5f 6e 72 28 0a  t test_exec_nr(.
3ce0: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
3cf0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
3d00: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
3d10: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
3d20: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
3d30: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
3d40: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
3d50: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3d60: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
3d70: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
3d80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
3d90: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
3da0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
3db0: 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
3dc0: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  ;.  char *zErr =
3dd0: 20 30 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d   0;.  if( argc!=
3de0: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
3df0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
3e00: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
3e10: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
3e20: 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
3e30: 20 22 20 44 42 20 53 51 4c 22 2c 20 30 29 3b 0a   " DB SQL", 0);.
3e40: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
3e50: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
3e60: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
3e70: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
3e80: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
3e90: 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
3ea0: 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 61  lite3_exec(db, a
3eb0: 72 67 76 5b 32 5d 2c 20 30 2c 20 30 2c 20 26 7a  rgv[2], 0, 0, &z
3ec0: 45 72 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  Err);.  if( sqli
3ed0: 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
3ee0: 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
3ef0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
3f00: 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  R;.  return TCL_
3f10: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
3f20: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge:  sqlite3_mpr
3f30: 69 6e 74 66 5f 7a 5f 74 65 73 74 20 20 53 45 50  intf_z_test  SEP
3f40: 41 52 41 54 4f 52 20 20 41 52 47 30 20 20 41 52  ARATOR  ARG0  AR
3f50: 47 31 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 65 73  G1 ....**.** Tes
3f60: 74 20 74 68 65 20 25 7a 20 66 6f 72 6d 61 74 20  t the %z format 
3f70: 6f 66 20 73 71 6c 69 74 65 5f 6d 70 72 69 6e 74  of sqlite_mprint
3f80: 66 28 29 2e 20 20 55 73 65 20 6d 75 6c 74 69 70  f().  Use multip
3f90: 6c 65 20 6d 70 72 69 6e 74 66 28 29 20 63 61 6c  le mprintf() cal
3fa0: 6c 73 20 74 6f 20 0a 2a 2a 20 63 6f 6e 63 61 74  ls to .** concat
3fb0: 65 6e 61 74 65 20 61 72 67 30 20 74 68 72 6f 75  enate arg0 throu
3fc0: 67 68 20 61 72 67 6e 20 75 73 69 6e 67 20 73 65  gh argn using se
3fd0: 70 61 72 61 74 6f 72 20 61 73 20 74 68 65 20 73  parator as the s
3fe0: 65 70 61 72 61 74 6f 72 2e 0a 2a 2a 20 52 65 74  eparator..** Ret
3ff0: 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a  urn the result..
4000: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
4010: 73 74 5f 6d 70 72 69 6e 74 66 5f 7a 28 0a 20 20  st_mprintf_z(.  
4020: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
4030: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
4040: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
4050: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
4060: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
4070: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
4080: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
4090: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
40a0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
40b0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
40c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
40d0: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
40e0: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
40f0: 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 69 6e  Result = 0;.  in
4100: 74 20 69 3b 0a 0a 20 20 66 6f 72 28 69 3d 32 3b  t i;..  for(i=2;
4110: 20 69 3c 61 72 67 63 20 26 26 20 28 69 3d 3d 32   i<argc && (i==2
4120: 20 7c 7c 20 7a 52 65 73 75 6c 74 29 3b 20 69 2b   || zResult); i+
4130: 2b 29 7b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20  +){.    zResult 
4140: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
4150: 66 28 22 25 7a 25 73 25 73 22 2c 20 7a 52 65 73  f("%z%s%s", zRes
4160: 75 6c 74 2c 20 61 72 67 76 5b 31 5d 2c 20 61 72  ult, argv[1], ar
4170: 67 76 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 54 63  gv[i]);.  }.  Tc
4180: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
4190: 6e 74 65 72 70 2c 20 7a 52 65 73 75 6c 74 2c 20  nterp, zResult, 
41a0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
41b0: 65 65 28 7a 52 65 73 75 6c 74 29 3b 0a 20 20 72  ee(zResult);.  r
41c0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
41d0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
41e0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6e  qlite3_mprintf_n
41f0: 5f 74 65 73 74 20 20 53 54 52 49 4e 47 0a 2a 2a  _test  STRING.**
4200: 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 25 6e 20  .** Test the %n 
4210: 66 6f 72 6d 61 74 20 6f 66 20 73 71 6c 69 74 65  format of sqlite
4220: 5f 6d 70 72 69 6e 74 66 28 29 2e 20 20 52 65 74  _mprintf().  Ret
4230: 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  urn the length o
4240: 66 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 73  f the.** input s
4250: 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  tring..*/.static
4260: 20 69 6e 74 20 74 65 73 74 5f 6d 70 72 69 6e 74   int test_mprint
4270: 66 5f 6e 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  f_n(.  void *Not
4280: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
4290: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
42a0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
42b0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
42c0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
42d0: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
42e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
42f0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
4300: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
4310: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
4320: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
4330: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
4340: 63 68 61 72 20 2a 7a 53 74 72 3b 0a 20 20 69 6e  char *zStr;.  in
4350: 74 20 6e 20 3d 20 30 3b 0a 20 20 7a 53 74 72 20  t n = 0;.  zStr 
4360: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
4370: 66 28 22 25 73 25 6e 22 2c 20 61 72 67 76 5b 31  f("%s%n", argv[1
4380: 5d 2c 20 26 6e 29 3b 0a 20 20 73 71 6c 69 74 65  ], &n);.  sqlite
4390: 33 5f 66 72 65 65 28 7a 53 74 72 29 3b 0a 20 20  3_free(zStr);.  
43a0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
43b0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
43c0: 49 6e 74 4f 62 6a 28 6e 29 29 3b 0a 20 20 72 65  IntObj(n));.  re
43d0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
43e0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
43f0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 69  lite3_snprintf_i
4400: 6e 74 20 20 53 49 5a 45 20 46 4f 52 4d 41 54 20  nt  SIZE FORMAT 
4410: 20 49 4e 54 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20   INT.**.** Test 
4420: 74 68 65 20 6f 66 20 73 71 6c 69 74 65 33 5f 73  the of sqlite3_s
4430: 6e 70 72 69 6e 74 66 28 29 20 72 6f 75 74 69 6e  nprintf() routin
4440: 65 2e 20 20 53 49 5a 45 20 69 73 20 74 68 65 20  e.  SIZE is the 
4450: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6f  size of the.** o
4460: 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20  utput buffer in 
4470: 62 79 74 65 73 2e 20 20 54 68 65 20 6d 61 78 69  bytes.  The maxi
4480: 6d 75 6d 20 73 69 7a 65 20 69 73 20 31 30 30 2e  mum size is 100.
4490: 20 20 46 4f 52 4d 41 54 20 69 73 20 74 68 65 0a    FORMAT is the.
44a0: 2a 2a 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67  ** format string
44b0: 2e 20 20 49 4e 54 20 69 73 20 61 20 73 69 6e 67  .  INT is a sing
44c0: 6c 65 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d  le integer argum
44d0: 65 6e 74 2e 20 20 54 68 65 20 46 4f 52 4d 41 54  ent.  The FORMAT
44e0: 0a 2a 2a 20 73 74 72 69 6e 67 20 6d 75 73 74 20  .** string must 
44f0: 72 65 71 75 69 72 65 20 6e 6f 20 6d 6f 72 65 20  require no more 
4500: 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 20 69 6e  than this one in
4510: 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 2e 20  teger argument. 
4520: 20 49 66 0a 2a 2a 20 59 6f 75 20 70 61 73 73 20   If.** You pass 
4530: 69 6e 20 61 20 66 6f 72 6d 61 74 20 73 74 72 69  in a format stri
4540: 6e 67 20 74 68 61 74 20 72 65 71 75 69 72 65 73  ng that requires
4550: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 61   more than one a
4560: 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 62 61 64 20  rgument,.** bad 
4570: 74 68 69 6e 67 73 20 77 69 6c 6c 20 68 61 70 70  things will happ
4580: 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  en..*/.static in
4590: 74 20 74 65 73 74 5f 73 6e 70 72 69 6e 74 66 5f  t test_snprintf_
45a0: 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  int(.  void *Not
45b0: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
45c0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
45d0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
45e0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
45f0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
4600: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
4610: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4620: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
4630: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
4640: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
4650: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
4660: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
4670: 63 68 61 72 20 7a 53 74 72 5b 31 30 30 5d 3b 0a  char zStr[100];.
4680: 20 20 69 6e 74 20 6e 20 3d 20 61 74 6f 69 28 61    int n = atoi(a
4690: 72 67 76 5b 31 5d 29 3b 0a 20 20 63 6f 6e 73 74  rgv[1]);.  const
46a0: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 20 3d   char *zFormat =
46b0: 20 61 72 67 76 5b 32 5d 3b 0a 20 20 69 6e 74 20   argv[2];.  int 
46c0: 61 31 20 3d 20 61 74 6f 69 28 61 72 67 76 5b 33  a1 = atoi(argv[3
46d0: 5d 29 3b 0a 20 20 69 66 28 20 6e 3e 73 69 7a 65  ]);.  if( n>size
46e0: 6f 66 28 7a 53 74 72 29 20 29 20 6e 20 3d 20 73  of(zStr) ) n = s
46f0: 69 7a 65 6f 66 28 7a 53 74 72 29 3b 0a 20 20 73  izeof(zStr);.  s
4700: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
4710: 73 69 7a 65 6f 66 28 7a 53 74 72 29 2c 20 7a 53  sizeof(zStr), zS
4720: 74 72 2c 20 22 61 62 63 64 65 66 67 68 69 6a 6b  tr, "abcdefghijk
4730: 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22  lmnopqrstuvwxyz"
4740: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  );.  sqlite3_snp
4750: 72 69 6e 74 66 28 6e 2c 20 7a 53 74 72 2c 20 7a  rintf(n, zStr, z
4760: 46 6f 72 6d 61 74 2c 20 61 31 29 3b 0a 20 20 54  Format, a1);.  T
4770: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
4780: 69 6e 74 65 72 70 2c 20 7a 53 74 72 2c 20 30 29  interp, zStr, 0)
4790: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
47a0: 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;.}..#ifndef SQ
47b0: 4c 49 54 45 5f 4f 4d 49 54 5f 47 45 54 5f 54 41  LITE_OMIT_GET_TA
47c0: 42 4c 45 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  BLE../*.** Usage
47d0: 3a 20 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74  :  sqlite3_get_t
47e0: 61 62 6c 65 5f 70 72 69 6e 74 66 20 20 44 42 20  able_printf  DB 
47f0: 20 46 4f 52 4d 41 54 20 20 53 54 52 49 4e 47 20   FORMAT  STRING 
4800: 20 3f 2d 2d 6e 6f 2d 63 6f 75 6e 74 73 3f 0a 2a   ?--no-counts?.*
4810: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
4820: 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c  sqlite3_get_tabl
4830: 65 5f 70 72 69 6e 74 66 28 29 20 69 6e 74 65 72  e_printf() inter
4840: 66 61 63 65 20 75 73 69 6e 67 20 74 68 65 20 6f  face using the o
4850: 70 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  pen database.** 
4860: 44 42 2e 20 20 54 68 65 20 53 51 4c 20 69 73 20  DB.  The SQL is 
4870: 74 68 65 20 73 74 72 69 6e 67 20 46 4f 52 4d 41  the string FORMA
4880: 54 2e 20 20 54 68 65 20 66 6f 72 6d 61 74 20 73  T.  The format s
4890: 74 72 69 6e 67 20 73 68 6f 75 6c 64 20 63 6f 6e  tring should con
48a0: 74 61 69 6e 0a 2a 2a 20 6f 6e 65 20 25 73 20 6f  tain.** one %s o
48b0: 72 20 25 71 2e 20 20 53 54 52 49 4e 47 20 69 73  r %q.  STRING is
48c0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 73 65 72   the value inser
48d0: 74 65 64 20 69 6e 74 6f 20 25 73 20 6f 72 20 25  ted into %s or %
48e0: 71 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  q..*/.static int
48f0: 20 74 65 73 74 5f 67 65 74 5f 74 61 62 6c 65 5f   test_get_table_
4900: 70 72 69 6e 74 66 28 0a 20 20 76 6f 69 64 20 2a  printf(.  void *
4910: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
4920: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
4930: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
4940: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
4950: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
4960: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
4970: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
4980: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
4990: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
49a0: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
49b0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
49c0: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
49d0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
49e0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74    Tcl_DString st
49f0: 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  r;.  int rc;.  c
4a00: 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20  har *zErr = 0;. 
4a10: 20 69 6e 74 20 6e 52 6f 77 2c 20 6e 43 6f 6c 3b   int nRow, nCol;
4a20: 0a 20 20 63 68 61 72 20 2a 2a 61 52 65 73 75 6c  .  char **aResul
4a30: 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  t;.  int i;.  ch
4a40: 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 63  ar zBuf[30];.  c
4a50: 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74  har *zSql;.  int
4a60: 20 72 65 73 43 6f 75 6e 74 20 3d 20 2d 31 3b 0a   resCount = -1;.
4a70: 20 20 69 66 28 20 61 72 67 63 3d 3d 35 20 29 7b    if( argc==5 ){
4a80: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
4a90: 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76  Int(interp, argv
4aa0: 5b 34 5d 2c 20 26 72 65 73 43 6f 75 6e 74 29 20  [4], &resCount) 
4ab0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
4ac0: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 72  OR;.  }.  if( ar
4ad0: 67 63 21 3d 34 20 26 26 20 61 72 67 63 21 3d 35  gc!=4 && argc!=5
4ae0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
4af0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
4b00: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
4b10: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
4b20: 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
4b30: 22 20 44 42 20 46 4f 52 4d 41 54 20 53 54 52 49  " DB FORMAT STRI
4b40: 4e 47 20 3f 43 4f 55 4e 54 3f 22 2c 20 30 29 3b  NG ?COUNT?", 0);
4b50: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
4b60: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
4b70: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
4b80: 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
4b90: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
4ba0: 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 44 53  _ERROR;.  Tcl_DS
4bb0: 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b  tringInit(&str);
4bc0: 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
4bd0: 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 32  3_mprintf(argv[2
4be0: 5d 2c 61 72 67 76 5b 33 5d 29 3b 0a 20 20 69 66  ],argv[3]);.  if
4bf0: 28 20 61 72 67 63 3d 3d 35 20 29 7b 0a 20 20 20  ( argc==5 ){.   
4c00: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 67 65   rc = sqlite3_ge
4c10: 74 5f 74 61 62 6c 65 28 64 62 2c 20 7a 53 71 6c  t_table(db, zSql
4c20: 2c 20 26 61 52 65 73 75 6c 74 2c 20 30 2c 20 30  , &aResult, 0, 0
4c30: 2c 20 26 7a 45 72 72 29 3b 0a 20 20 7d 65 6c 73  , &zErr);.  }els
4c40: 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
4c50: 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 28 64 62  te3_get_table(db
4c60: 2c 20 7a 53 71 6c 2c 20 26 61 52 65 73 75 6c 74  , zSql, &aResult
4c70: 2c 20 26 6e 52 6f 77 2c 20 26 6e 43 6f 6c 2c 20  , &nRow, &nCol, 
4c80: 26 7a 45 72 72 29 3b 0a 20 20 20 20 72 65 73 43  &zErr);.    resC
4c90: 6f 75 6e 74 20 3d 20 28 6e 52 6f 77 2b 31 29 2a  ount = (nRow+1)*
4ca0: 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  nCol;.  }.  sqli
4cb0: 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
4cc0: 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20    sprintf(zBuf, 
4cd0: 22 25 64 22 2c 20 72 63 29 3b 0a 20 20 54 63 6c  "%d", rc);.  Tcl
4ce0: 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  _AppendElement(i
4cf0: 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20  nterp, zBuf);.  
4d00: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4d10: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 61 72 67  K ){.    if( arg
4d20: 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 73 70  c==4 ){.      sp
4d30: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22  rintf(zBuf, "%d"
4d40: 2c 20 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 54  , nRow);.      T
4d50: 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  cl_AppendElement
4d60: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a  (interp, zBuf);.
4d70: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42        sprintf(zB
4d80: 75 66 2c 20 22 25 64 22 2c 20 6e 43 6f 6c 29 3b  uf, "%d", nCol);
4d90: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
4da0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
4db0: 20 7a 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20   zBuf);.    }.  
4dc0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 65 73    for(i=0; i<res
4dd0: 43 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  Count; i++){.   
4de0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65     Tcl_AppendEle
4df0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 61 52 65  ment(interp, aRe
4e00: 73 75 6c 74 5b 69 5d 20 3f 20 61 52 65 73 75 6c  sult[i] ? aResul
4e10: 74 5b 69 5d 20 3a 20 22 4e 55 4c 4c 22 29 3b 0a  t[i] : "NULL");.
4e20: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
4e30: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65     Tcl_AppendEle
4e40: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 45 72  ment(interp, zEr
4e50: 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  r);.  }.  sqlite
4e60: 33 5f 66 72 65 65 5f 74 61 62 6c 65 28 61 52 65  3_free_table(aRe
4e70: 73 75 6c 74 29 3b 0a 20 20 69 66 28 20 7a 45 72  sult);.  if( zEr
4e80: 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  r ) sqlite3_free
4e90: 28 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 73 71  (zErr);.  if( sq
4ea0: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
4eb0: 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
4ec0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
4ed0: 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ROR;.  return TC
4ee0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  L_OK;.}..#endif 
4ef0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 47  /* SQLITE_OMIT_G
4f00: 45 54 5f 54 41 42 4c 45 20 2a 2f 0a 0a 0a 2f 2a  ET_TABLE */.../*
4f10: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
4f20: 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f  te3_last_insert_
4f30: 72 6f 77 69 64 20 44 42 0a 2a 2a 0a 2a 2a 20 52  rowid DB.**.** R
4f40: 65 74 75 72 6e 73 20 74 68 65 20 69 6e 74 65 67  eturns the integ
4f50: 65 72 20 52 4f 57 49 44 20 6f 66 20 74 68 65 20  er ROWID of the 
4f60: 6d 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73 65  most recent inse
4f70: 72 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rt..*/.static in
4f80: 74 20 74 65 73 74 5f 6c 61 73 74 5f 72 6f 77 69  t test_last_rowi
4f90: 64 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  d(.  void *NotUs
4fa0: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
4fb0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
4fc0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
4fd0: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
4fe0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
4ff0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
5000: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
5010: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
5020: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
5030: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
5040: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
5050: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71  ument */.){.  sq
5060: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61  lite3 *db;.  cha
5070: 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 0a 20 20 69  r zBuf[30];..  i
5080: 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
5090: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
50a0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
50b0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
50c0: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
50d0: 2c 20 22 20 44 42 5c 22 22 2c 20 30 29 3b 0a 20  , " DB\"", 0);. 
50e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
50f0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
5100: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
5110: 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
5120: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
5130: 52 52 4f 52 3b 0a 20 20 73 70 72 69 6e 74 66 28  RROR;.  sprintf(
5140: 7a 42 75 66 2c 20 22 25 6c 6c 64 22 2c 20 73 71  zBuf, "%lld", sq
5150: 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72  lite3_last_inser
5160: 74 5f 72 6f 77 69 64 28 64 62 29 29 3b 0a 20 20  t_rowid(db));.  
5170: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
5180: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
5190: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
51a0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
51b0: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
51c0: 6b 65 79 20 44 42 20 4b 45 59 0a 2a 2a 0a 2a 2a  key DB KEY.**.**
51d0: 20 53 65 74 20 74 68 65 20 63 6f 64 65 63 20 6b   Set the codec k
51e0: 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ey..*/.static in
51f0: 74 20 74 65 73 74 5f 6b 65 79 28 0a 20 20 76 6f  t test_key(.  vo
5200: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
5210: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
5220: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
5230: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
5240: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
5250: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
5260: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
5270: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
5280: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
5290: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
52a0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
52b0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
52c0: 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  /.){.#ifdef SQLI
52d0: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 73  TE_HAS_CODEC.  s
52e0: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
52f0: 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 3b 0a  nst char *zKey;.
5300: 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69 66    int nKey;.  if
5310: 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20  ( argc!=3 ){.   
5320: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
5330: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
5340: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
5350: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
5360: 0a 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41  .       " FILENA
5370: 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  ME\"", 0);.    r
5380: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
5390: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
53a0: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
53b0: 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
53c0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
53d0: 3b 0a 20 20 7a 4b 65 79 20 3d 20 61 72 67 76 5b  ;.  zKey = argv[
53e0: 32 5d 3b 0a 20 20 6e 4b 65 79 20 3d 20 73 74 72  2];.  nKey = str
53f0: 6c 65 6e 28 7a 4b 65 79 29 3b 0a 20 20 73 71 6c  len(zKey);.  sql
5400: 69 74 65 33 5f 6b 65 79 28 64 62 2c 20 7a 4b 65  ite3_key(db, zKe
5410: 79 2c 20 6e 4b 65 79 29 3b 0a 23 65 6e 64 69 66  y, nKey);.#endif
5420: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
5430: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
5440: 3a 20 20 73 71 6c 69 74 65 33 5f 72 65 6b 65 79  :  sqlite3_rekey
5450: 20 44 42 20 4b 45 59 0a 2a 2a 0a 2a 2a 20 43 68   DB KEY.**.** Ch
5460: 61 6e 67 65 20 74 68 65 20 63 6f 64 65 63 20 6b  ange the codec k
5470: 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ey..*/.static in
5480: 74 20 74 65 73 74 5f 72 65 6b 65 79 28 0a 20 20  t test_rekey(.  
5490: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
54a0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
54b0: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
54c0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
54d0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
54e0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
54f0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
5500: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5510: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
5520: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
5530: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
5540: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
5550: 20 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53 51   */.){.#ifdef SQ
5560: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
5570: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
5580: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79  const char *zKey
5590: 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20  ;.  int nKey;.  
55a0: 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
55b0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
55c0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
55d0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
55e0: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
55f0: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c 45  ],.       " FILE
5600: 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20  NAME\"", 0);.   
5610: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
5620: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
5630: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
5640: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
5650: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
5660: 4f 52 3b 0a 20 20 7a 4b 65 79 20 3d 20 61 72 67  OR;.  zKey = arg
5670: 76 5b 32 5d 3b 0a 20 20 6e 4b 65 79 20 3d 20 73  v[2];.  nKey = s
5680: 74 72 6c 65 6e 28 7a 4b 65 79 29 3b 0a 20 20 73  trlen(zKey);.  s
5690: 71 6c 69 74 65 33 5f 72 65 6b 65 79 28 64 62 2c  qlite3_rekey(db,
56a0: 20 7a 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 23 65   zKey, nKey);.#e
56b0: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43  ndif.  return TC
56c0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
56d0: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 63  sage:  sqlite3_c
56e0: 6c 6f 73 65 20 44 42 0a 2a 2a 0a 2a 2a 20 43 6c  lose DB.**.** Cl
56f0: 6f 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73  oses the databas
5700: 65 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69  e opened by sqli
5710: 74 65 33 5f 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61  te3_open..*/.sta
5720: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f 74  tic int sqlite_t
5730: 65 73 74 5f 63 6c 6f 73 65 28 0a 20 20 76 6f 69  est_close(.  voi
5740: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
5750: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
5760: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
5770: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
5780: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
5790: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
57a0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
57b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
57c0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
57d0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
57e0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
57f0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
5800: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
5810: 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  b;.  int rc;.  i
5820: 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
5830: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
5840: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
5850: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
5860: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
5870: 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e  ,.       " FILEN
5880: 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  AME\"", 0);.    
5890: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
58a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
58b0: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
58c0: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
58d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
58e0: 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
58f0: 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 54  3_close(db);.  T
5900: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
5910: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
5920: 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
5930: 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74  L_STATIC);.  ret
5940: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
5950: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
5960: 69 6f 6e 20 6f 66 20 74 68 65 20 78 5f 63 6f 61  ion of the x_coa
5970: 6c 65 73 63 65 28 29 20 66 75 6e 63 74 69 6f 6e  lesce() function
5980: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
5990: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6e  first argument n
59a0: 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74  on-NULL argument
59b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
59c0: 20 74 31 5f 69 66 6e 75 6c 6c 46 75 6e 63 28 0a   t1_ifnullFunc(.
59d0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
59e0: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
59f0: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
5a00: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
5a10: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
5a20: 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b  (i=0; i<argc; i+
5a30: 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  +){.    if( SQLI
5a40: 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33  TE_NULL!=sqlite3
5a50: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
5a60: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  [i]) ){.      in
5a70: 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  t n = sqlite3_va
5a80: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 69  lue_bytes(argv[i
5a90: 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ]);.      sqlite
5aa0: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
5ab0: 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29 73 71  ntext, (char*)sq
5ac0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
5ad0: 28 61 72 67 76 5b 69 5d 29 2c 0a 20 20 20 20 20  (argv[i]),.     
5ae0: 20 20 20 20 20 6e 2c 20 53 51 4c 49 54 45 5f 54       n, SQLITE_T
5af0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
5b00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
5b10: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65  }.}../*.** These
5b20: 20 61 72 65 20 74 65 73 74 20 66 75 6e 63 74 69   are test functi
5b30: 6f 6e 73 2e 20 20 20 20 68 65 78 38 28 29 20 69  ons.    hex8() i
5b40: 6e 74 65 72 70 72 65 74 73 20 69 74 73 20 61 72  nterprets its ar
5b50: 67 75 6d 65 6e 74 20 61 73 0a 2a 2a 20 55 54 46  gument as.** UTF
5b60: 38 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20  8 and returns a 
5b70: 68 65 78 20 65 6e 63 6f 64 69 6e 67 2e 20 20 68  hex encoding.  h
5b80: 65 78 31 36 6c 65 28 29 20 69 6e 74 65 72 70 72  ex16le() interpr
5b90: 65 74 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74  ets its argument
5ba0: 0a 2a 2a 20 61 73 20 55 54 46 31 36 6c 65 20 61  .** as UTF16le a
5bb0: 6e 64 20 72 65 74 75 72 6e 73 20 61 20 68 65 78  nd returns a hex
5bc0: 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73 74   encoding..*/.st
5bd0: 61 74 69 63 20 76 6f 69 64 20 68 65 78 38 46 75  atic void hex8Fu
5be0: 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  nc(sqlite3_conte
5bf0: 78 74 20 2a 70 2c 20 69 6e 74 20 61 72 67 63 2c  xt *p, int argc,
5c00: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
5c10: 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74 20  *argv){.  const 
5c20: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
5c30: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
5c40: 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20 7a  r zBuf[200];.  z
5c50: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
5c60: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
5c70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
5c80: 65 6f 66 28 7a 42 75 66 29 2f 32 20 2d 20 32 20  eof(zBuf)/2 - 2 
5c90: 26 26 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  && z[i]; i++){. 
5ca0: 20 20 20 73 70 72 69 6e 74 66 28 26 7a 42 75 66     sprintf(&zBuf
5cb0: 5b 69 2a 32 5d 2c 20 22 25 30 32 78 22 2c 20 7a  [i*2], "%02x", z
5cc0: 5b 69 5d 26 30 78 66 66 29 3b 0a 20 20 7d 0a 20  [i]&0xff);.  }. 
5cd0: 20 7a 42 75 66 5b 69 2a 32 5d 20 3d 20 30 3b 0a   zBuf[i*2] = 0;.
5ce0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
5cf0: 5f 74 65 78 74 28 70 2c 20 28 63 68 61 72 2a 29  _text(p, (char*)
5d00: 7a 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45  zBuf, -1, SQLITE
5d10: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 23  _TRANSIENT);.}.#
5d20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5d30: 49 54 5f 55 54 46 31 36 0a 73 74 61 74 69 63 20  IT_UTF16.static 
5d40: 76 6f 69 64 20 68 65 78 31 36 46 75 6e 63 28 73  void hex16Func(s
5d50: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
5d60: 70 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  p, int argc, sql
5d70: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
5d80: 76 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  v){.  const unsi
5d90: 67 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 20 2a  gned short int *
5da0: 7a 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  z;.  int i;.  ch
5db0: 61 72 20 7a 42 75 66 5b 34 30 30 5d 3b 0a 20 20  ar zBuf[400];.  
5dc0: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
5dd0: 65 5f 74 65 78 74 31 36 28 61 72 67 76 5b 30 5d  e_text16(argv[0]
5de0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
5df0: 73 69 7a 65 6f 66 28 7a 42 75 66 29 2f 34 20 2d  sizeof(zBuf)/4 -
5e00: 20 34 20 26 26 20 7a 5b 69 5d 3b 20 69 2b 2b 29   4 && z[i]; i++)
5e10: 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 26 7a  {.    sprintf(&z
5e20: 42 75 66 5b 69 2a 34 5d 2c 20 22 25 30 34 78 22  Buf[i*4], "%04x"
5e30: 2c 20 7a 5b 69 5d 26 30 78 66 66 29 3b 0a 20 20  , z[i]&0xff);.  
5e40: 7d 0a 20 20 7a 42 75 66 5b 69 2a 34 5d 20 3d 20  }.  zBuf[i*4] = 
5e50: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  0;.  sqlite3_res
5e60: 75 6c 74 5f 74 65 78 74 28 70 2c 20 28 63 68 61  ult_text(p, (cha
5e70: 72 2a 29 7a 42 75 66 2c 20 2d 31 2c 20 53 51 4c  r*)zBuf, -1, SQL
5e80: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
5e90: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
5ea0: 41 20 73 74 72 75 63 74 75 72 65 20 69 6e 74 6f  A structure into
5eb0: 20 77 68 69 63 68 20 74 6f 20 61 63 63 75 6d 75   which to accumu
5ec0: 6c 61 74 65 20 74 65 78 74 2e 0a 2a 2f 0a 73 74  late text..*/.st
5ed0: 72 75 63 74 20 64 73 74 72 20 7b 0a 20 20 69 6e  ruct dstr {.  in
5ee0: 74 20 6e 41 6c 6c 6f 63 3b 20 20 2f 2a 20 53 70  t nAlloc;  /* Sp
5ef0: 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f  ace allocated */
5f00: 0a 20 20 69 6e 74 20 6e 55 73 65 64 3b 20 20 20  .  int nUsed;   
5f10: 2f 2a 20 53 70 61 63 65 20 75 73 65 64 20 2a 2f  /* Space used */
5f20: 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20  .  char *z;     
5f30: 2f 2a 20 54 68 65 20 73 70 61 63 65 20 2a 2f 0a  /* The space */.
5f40: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  };../*.** Append
5f50: 20 74 65 78 74 20 74 6f 20 61 20 64 73 74 72 0a   text to a dstr.
5f60: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
5f70: 73 74 72 41 70 70 65 6e 64 28 73 74 72 75 63 74  strAppend(struct
5f80: 20 64 73 74 72 20 2a 70 2c 20 63 6f 6e 73 74 20   dstr *p, const 
5f90: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 64 69 76  char *z, int div
5fa0: 69 64 65 72 29 7b 0a 20 20 69 6e 74 20 6e 20 3d  ider){.  int n =
5fb0: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 29 3b   (int)strlen(z);
5fc0: 0a 20 20 69 66 28 20 70 2d 3e 6e 55 73 65 64 20  .  if( p->nUsed 
5fd0: 2b 20 6e 20 2b 20 32 20 3e 20 70 2d 3e 6e 41 6c  + n + 2 > p->nAl
5fe0: 6c 6f 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20  loc ){.    char 
5ff0: 2a 7a 4e 65 77 3b 0a 20 20 20 20 70 2d 3e 6e 41  *zNew;.    p->nA
6000: 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 6c 6c 6f 63  lloc = p->nAlloc
6010: 2a 32 20 2b 20 6e 20 2b 20 32 30 30 3b 0a 20 20  *2 + n + 200;.  
6020: 20 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    zNew = sqlite3
6030: 5f 72 65 61 6c 6c 6f 63 28 70 2d 3e 7a 2c 20 70  _realloc(p->z, p
6040: 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69  ->nAlloc);.    i
6050: 66 28 20 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( zNew==0 ){.  
6060: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
6070: 28 70 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 6d 65  (p->z);.      me
6080: 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
6090: 66 28 2a 70 29 29 3b 0a 20 20 20 20 20 20 72 65  f(*p));.      re
60a0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
60b0: 70 2d 3e 7a 20 3d 20 7a 4e 65 77 3b 0a 20 20 7d  p->z = zNew;.  }
60c0: 0a 20 20 69 66 28 20 64 69 76 69 64 65 72 20 26  .  if( divider &
60d0: 26 20 70 2d 3e 6e 55 73 65 64 3e 30 20 29 7b 0a  & p->nUsed>0 ){.
60e0: 20 20 20 20 70 2d 3e 7a 5b 70 2d 3e 6e 55 73 65      p->z[p->nUse
60f0: 64 2b 2b 5d 20 3d 20 64 69 76 69 64 65 72 3b 0a  d++] = divider;.
6100: 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 26 70 2d    }.  memcpy(&p-
6110: 3e 7a 5b 70 2d 3e 6e 55 73 65 64 5d 2c 20 7a 2c  >z[p->nUsed], z,
6120: 20 6e 2b 31 29 3b 0a 20 20 70 2d 3e 6e 55 73 65   n+1);.  p->nUse
6130: 64 20 2b 3d 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  d += n;.}../*.**
6140: 20 49 6e 76 6f 6b 65 64 20 66 6f 72 20 65 61 63   Invoked for eac
6150: 68 20 63 61 6c 6c 62 61 63 6b 20 66 72 6f 6d 20  h callback from 
6160: 73 71 6c 69 74 65 33 45 78 65 63 46 75 6e 63 0a  sqlite3ExecFunc.
6170: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
6180: 65 63 46 75 6e 63 43 61 6c 6c 62 61 63 6b 28 76  ecFuncCallback(v
6190: 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20  oid *pData, int 
61a0: 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67  argc, char **arg
61b0: 76 2c 20 63 68 61 72 20 2a 2a 4e 6f 74 55 73 65  v, char **NotUse
61c0: 64 29 7b 0a 20 20 73 74 72 75 63 74 20 64 73 74  d){.  struct dst
61d0: 72 20 2a 70 20 3d 20 28 73 74 72 75 63 74 20 64  r *p = (struct d
61e0: 73 74 72 2a 29 70 44 61 74 61 3b 0a 20 20 69 6e  str*)pData;.  in
61f0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
6200: 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<argc; i++){.  
6210: 20 20 69 66 28 20 61 72 67 76 5b 69 5d 3d 3d 30    if( argv[i]==0
6220: 20 29 7b 0a 20 20 20 20 20 20 64 73 74 72 41 70   ){.      dstrAp
6230: 70 65 6e 64 28 70 2c 20 22 4e 55 4c 4c 22 2c 20  pend(p, "NULL", 
6240: 27 20 27 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ' ');.    }else{
6250: 0a 20 20 20 20 20 20 64 73 74 72 41 70 70 65 6e  .      dstrAppen
6260: 64 28 70 2c 20 61 72 67 76 5b 69 5d 2c 20 27 20  d(p, argv[i], ' 
6270: 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ');.    }.  }.  
6280: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
6290: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
62a0: 6e 20 6f 66 20 74 68 65 20 78 5f 73 71 6c 69 74  n of the x_sqlit
62b0: 65 5f 65 78 65 63 28 29 20 66 75 6e 63 74 69 6f  e_exec() functio
62c0: 6e 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f  n.  This functio
62d0: 6e 20 74 61 6b 65 73 0a 2a 2a 20 61 20 73 69 6e  n takes.** a sin
62e0: 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 61 6e 64  gle argument and
62f0: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 65 78 65   attempts to exe
6300: 63 75 74 65 20 74 68 61 74 20 61 72 67 75 6d 65  cute that argume
6310: 6e 74 20 61 73 20 53 51 4c 20 63 6f 64 65 2e 0a  nt as SQL code..
6320: 2a 2a 20 54 68 69 73 20 69 73 20 69 6c 6c 65 67  ** This is illeg
6330: 61 6c 20 61 6e 64 20 73 68 6f 75 6c 64 20 73 65  al and should se
6340: 74 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 49 53  t the SQLITE_MIS
6350: 55 53 45 20 66 6c 61 67 20 6f 6e 20 74 68 65 20  USE flag on the 
6360: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
6370: 32 30 30 34 2d 4a 61 6e 2d 30 37 3a 20 20 57 65  2004-Jan-07:  We
6380: 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 74 68   have changed th
6390: 69 73 20 74 6f 20 6d 61 6b 65 20 69 74 20 6c 65  is to make it le
63a0: 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69  gal to call sqli
63b0: 74 65 33 5f 65 78 65 63 28 29 0a 2a 2a 20 66 72  te3_exec().** fr
63c0: 6f 6d 20 77 69 74 68 69 6e 20 61 20 66 75 6e 63  om within a func
63d0: 74 69 6f 6e 20 63 61 6c 6c 2e 20 20 0a 2a 2a 20  tion call.  .** 
63e0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
63f0: 20 73 69 6d 75 6c 61 74 65 73 20 74 68 65 20 65   simulates the e
6400: 66 66 65 63 74 20 6f 66 20 68 61 76 69 6e 67 20  ffect of having 
6410: 74 77 6f 20 74 68 72 65 61 64 73 20 61 74 74 65  two threads atte
6420: 6d 70 74 20 74 6f 0a 2a 2a 20 75 73 65 20 74 68  mpt to.** use th
6430: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
6440: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
6450: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6460: 20 73 71 6c 69 74 65 33 45 78 65 63 46 75 6e 63   sqlite3ExecFunc
6470: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
6480: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20  ext *context, . 
6490: 20 69 6e 74 20 61 72 67 63 2c 20 20 0a 20 20 73   int argc,  .  s
64a0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
64b0: 72 67 76 0a 29 7b 0a 20 20 73 74 72 75 63 74 20  rgv.){.  struct 
64c0: 64 73 74 72 20 78 3b 0a 20 20 6d 65 6d 73 65 74  dstr x;.  memset
64d0: 28 26 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 78  (&x, 0, sizeof(x
64e0: 29 29 3b 0a 20 20 28 76 6f 69 64 29 73 71 6c 69  ));.  (void)sqli
64f0: 74 65 33 5f 65 78 65 63 28 28 73 71 6c 69 74 65  te3_exec((sqlite
6500: 33 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f  3*)sqlite3_user_
6510: 64 61 74 61 28 63 6f 6e 74 65 78 74 29 2c 0a 20  data(context),. 
6520: 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69       (char*)sqli
6530: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
6540: 72 67 76 5b 30 5d 29 2c 0a 20 20 20 20 20 20 65  rgv[0]),.      e
6550: 78 65 63 46 75 6e 63 43 61 6c 6c 62 61 63 6b 2c  xecFuncCallback,
6560: 20 26 78 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74   &x, 0);.  sqlit
6570: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
6580: 6f 6e 74 65 78 74 2c 20 78 2e 7a 2c 20 78 2e 6e  ontext, x.z, x.n
6590: 55 73 65 64 2c 20 53 51 4c 49 54 45 5f 54 52 41  Used, SQLITE_TRA
65a0: 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74  NSIENT);.  sqlit
65b0: 65 33 5f 66 72 65 65 28 78 2e 7a 29 3b 0a 7d 0a  e3_free(x.z);.}.
65c0: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
65d0: 61 74 69 6f 6e 20 6f 66 20 74 6b 74 32 32 31 33  ation of tkt2213
65e0: 66 75 6e 63 28 29 2c 20 61 20 73 63 61 6c 61 72  func(), a scalar
65f0: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 74   function that t
6600: 61 6b 65 73 20 65 78 61 63 74 6c 79 0a 2a 2a 20  akes exactly.** 
6610: 6f 6e 65 20 61 72 67 75 6d 65 6e 74 2e 20 49 74  one argument. It
6620: 20 68 61 73 20 74 77 6f 20 69 6e 74 65 72 65 73   has two interes
6630: 74 69 6e 67 20 66 65 61 74 75 72 65 73 3a 0a 2a  ting features:.*
6640: 2a 0a 2a 2a 20 2a 20 49 74 20 63 61 6c 6c 73 20  *.** * It calls 
6650: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
6660: 78 74 28 29 20 33 20 74 69 6d 65 73 20 6f 6e 20  xt() 3 times on 
6670: 74 68 65 20 61 72 67 75 6d 65 6e 74 20 73 71 6c  the argument sql
6680: 69 74 65 33 5f 76 61 6c 75 65 2a 2e 0a 2a 2a 20  ite3_value*..** 
6690: 20 20 49 66 20 74 68 65 20 74 68 72 65 65 20 70    If the three p
66a0: 6f 69 6e 74 65 72 73 20 72 65 74 75 72 6e 65 64  ointers returned
66b0: 20 61 72 65 20 6e 6f 74 20 74 68 65 20 73 61 6d   are not the sam
66c0: 65 20 61 6e 20 53 51 4c 20 65 72 72 6f 72 20 69  e an SQL error i
66d0: 73 20 72 61 69 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  s raised..**.** 
66e0: 2a 20 4f 74 68 65 72 77 69 73 65 20 69 74 20 72  * Otherwise it r
66f0: 65 74 75 72 6e 73 20 61 20 63 6f 70 79 20 6f 66  eturns a copy of
6700: 20 74 68 65 20 74 65 78 74 20 72 65 70 72 65 73   the text repres
6710: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 69 74 73 20  entation of its 
6720: 0a 2a 2a 20 20 20 61 72 67 75 6d 65 6e 74 20 69  .**   argument i
6730: 6e 20 73 75 63 68 20 61 20 77 61 79 20 61 73 20  n such a way as 
6740: 74 68 65 20 56 44 42 45 20 72 65 70 72 65 73 65  the VDBE represe
6750: 6e 74 61 74 69 6f 6e 20 69 73 20 61 20 4d 65 6d  ntation is a Mem
6760: 2a 20 63 65 6c 6c 20 0a 2a 2a 20 20 20 77 69 74  * cell .**   wit
6770: 68 20 74 68 65 20 4d 45 4d 5f 54 65 72 6d 20 66  h the MEM_Term f
6780: 6c 61 67 20 63 6c 65 61 72 2e 20 0a 2a 2a 0a 2a  lag clear. .**.*
6790: 2a 20 54 69 63 6b 65 74 20 23 32 32 31 33 20 63  * Ticket #2213 c
67a0: 61 6e 20 74 68 65 72 65 66 6f 72 65 20 62 65 20  an therefore be 
67b0: 74 65 73 74 65 64 20 62 79 20 65 76 61 6c 75 61  tested by evalua
67c0: 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ting the followi
67d0: 6e 67 0a 2a 2a 20 53 51 4c 20 65 78 70 72 65 73  ng.** SQL expres
67e0: 73 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 74 6b  sion:.**.**   tk
67f0: 74 32 32 31 33 66 75 6e 63 28 74 6b 74 32 32 31  t2213func(tkt221
6800: 33 66 75 6e 63 28 27 61 20 73 74 72 69 6e 67 27  3func('a string'
6810: 29 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ));.*/.static vo
6820: 69 64 20 74 6b 74 32 32 31 33 46 75 6e 63 74 69  id tkt2213Functi
6830: 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  on(.  sqlite3_co
6840: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
6850: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 0a 20  .  int argc,  . 
6860: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
6870: 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 6e  *argv.){.  int n
6880: 54 65 78 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64  Text;.  unsigned
6890: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65   char const *zTe
68a0: 78 74 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  xt1;.  unsigned 
68b0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78  char const *zTex
68c0: 74 32 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  t2;.  unsigned c
68d0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74  har const *zText
68e0: 33 3b 0a 0a 20 20 6e 54 65 78 74 20 3d 20 73 71  3;..  nText = sq
68f0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
6900: 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a 54  s(argv[0]);.  zT
6910: 65 78 74 31 20 3d 20 73 71 6c 69 74 65 33 5f 76  ext1 = sqlite3_v
6920: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
6930: 5d 29 3b 0a 20 20 7a 54 65 78 74 32 20 3d 20 73  ]);.  zText2 = s
6940: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
6950: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a 54  t(argv[0]);.  zT
6960: 65 78 74 33 20 3d 20 73 71 6c 69 74 65 33 5f 76  ext3 = sqlite3_v
6970: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
6980: 5d 29 3b 0a 0a 20 20 69 66 28 20 7a 54 65 78 74  ]);..  if( zText
6990: 31 21 3d 7a 54 65 78 74 32 20 7c 7c 20 7a 54 65  1!=zText2 || zTe
69a0: 78 74 32 21 3d 7a 54 65 78 74 33 20 29 7b 0a 20  xt2!=zText3 ){. 
69b0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
69c0: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
69d0: 20 22 74 6b 74 32 32 31 33 20 69 73 20 6e 6f 74   "tkt2213 is not
69e0: 20 66 69 78 65 64 22 2c 20 2d 31 29 3b 0a 20 20   fixed", -1);.  
69f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
6a00: 2a 7a 43 6f 70 79 20 3d 20 28 63 68 61 72 20 2a  *zCopy = (char *
6a10: 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
6a20: 6e 54 65 78 74 29 3b 0a 20 20 20 20 6d 65 6d 63  nText);.    memc
6a30: 70 79 28 7a 43 6f 70 79 2c 20 7a 54 65 78 74 31  py(zCopy, zText1
6a40: 2c 20 6e 54 65 78 74 29 3b 0a 20 20 20 20 73 71  , nText);.    sq
6a50: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
6a60: 74 28 63 6f 6e 74 65 78 74 2c 20 7a 43 6f 70 79  t(context, zCopy
6a70: 2c 20 6e 54 65 78 74 2c 20 73 71 6c 69 74 65 33  , nText, sqlite3
6a80: 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  _free);.  }.}../
6a90: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
6aa0: 6e 67 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  ng SQL function 
6ab0: 74 61 6b 65 73 20 34 20 61 72 67 75 6d 65 6e 74  takes 4 argument
6ac0: 73 2e 20 20 54 68 65 20 32 6e 64 20 61 6e 64 0a  s.  The 2nd and.
6ad0: 2a 2a 20 34 74 68 20 61 72 67 75 6d 65 6e 74 20  ** 4th argument 
6ae0: 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 74  must be one of t
6af0: 68 65 73 65 20 73 74 72 69 6e 67 73 3a 20 20 27  hese strings:  '
6b00: 74 65 78 74 27 2c 20 27 74 65 78 74 31 36 27 2c  text', 'text16',
6b10: 0a 2a 2a 20 6f 72 20 27 62 6c 6f 62 27 20 63 6f  .** or 'blob' co
6b20: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 41  rresponding to A
6b30: 50 49 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 0a  PI functions.**.
6b40: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  **      sqlite3_
6b50: 76 61 6c 75 65 5f 74 65 78 74 28 29 0a 2a 2a 20  value_text().** 
6b60: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
6b70: 75 65 5f 74 65 78 74 31 36 28 29 0a 2a 2a 20 20  ue_text16().**  
6b80: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
6b90: 65 5f 62 6c 6f 62 28 29 0a 2a 2a 0a 2a 2a 20 54  e_blob().**.** T
6ba0: 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
6bb0: 74 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20 65  t is a string, e
6bc0: 69 74 68 65 72 20 27 62 79 74 65 73 27 20 6f 72  ither 'bytes' or
6bd0: 20 27 62 79 74 65 73 31 36 27 20 6f 72 20 27 6e   'bytes16' or 'n
6be0: 6f 6f 70 27 2c 0a 2a 2a 20 63 6f 72 72 65 73 70  oop',.** corresp
6bf0: 6f 6e 64 69 6e 67 20 74 6f 20 41 50 49 73 3a 0a  onding to APIs:.
6c00: 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  **.**      sqlit
6c10: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 29  e3_value_bytes()
6c20: 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
6c30: 5f 76 61 6c 75 65 5f 62 79 74 65 73 31 36 28 29  _value_bytes16()
6c40: 0a 2a 2a 20 20 20 20 20 20 6e 6f 6f 70 0a 2a 2a  .**      noop.**
6c50: 0a 2a 2a 20 54 68 65 20 41 50 49 73 20 64 65 73  .** The APIs des
6c60: 69 67 6e 61 74 65 64 20 62 79 20 74 68 65 20 32  ignated by the 2
6c70: 6e 64 20 74 68 72 6f 75 67 68 20 34 74 68 20 61  nd through 4th a
6c80: 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61 70 70  rguments are app
6c90: 6c 69 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66  lied.** to the f
6ca0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 6e  irst argument in
6cb0: 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68 65 20   order.  If the 
6cc0: 70 6f 69 6e 74 65 72 73 20 72 65 74 75 72 6e 65  pointers returne
6cd0: 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 65 63 6f  d by the.** seco
6ce0: 6e 64 20 61 6e 64 20 66 6f 75 72 74 68 20 61 72  nd and fourth ar
6cf0: 65 20 64 69 66 66 65 72 65 6e 74 2c 20 74 68 69  e different, thi
6d00: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
6d10: 73 20 31 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  s 1.  Otherwise,
6d20: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
6d30: 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 0a 2a   returns 0..**.*
6d40: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
6d50: 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20  is used to test 
6d60: 74 6f 20 73 65 65 20 77 68 65 6e 20 72 65 74 75  to see when retu
6d70: 72 6e 65 64 20 70 6f 69 6e 74 65 72 73 20 66 72  rned pointers fr
6d80: 6f 6d 0a 2a 2a 20 74 68 65 20 5f 74 65 78 74 28  om.** the _text(
6d90: 29 2c 20 5f 74 65 78 74 31 36 28 29 20 61 6e 64  ), _text16() and
6da0: 20 5f 62 6c 6f 62 28 29 20 41 50 49 73 20 62 65   _blob() APIs be
6db0: 63 6f 6d 65 20 69 6e 76 61 6c 69 64 61 74 65 64  come invalidated
6dc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6dd0: 20 70 74 72 43 68 6e 67 46 75 6e 63 74 69 6f 6e   ptrChngFunction
6de0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
6df0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20  ext *context, . 
6e00: 20 69 6e 74 20 61 72 67 63 2c 20 20 0a 20 20 73   int argc,  .  s
6e10: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
6e20: 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 76  rgv.){.  const v
6e30: 6f 69 64 20 2a 70 31 2c 20 2a 70 32 3b 0a 20 20  oid *p1, *p2;.  
6e40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6d 64  const char *zCmd
6e50: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34 20  ;.  if( argc!=4 
6e60: 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 43 6d 64  ) return;.  zCmd
6e70: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
6e80: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
6e90: 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69  xt(argv[1]);.  i
6ea0: 66 28 20 7a 43 6d 64 3d 3d 30 20 29 20 72 65 74  f( zCmd==0 ) ret
6eb0: 75 72 6e 3b 0a 20 20 69 66 28 20 73 74 72 63 6d  urn;.  if( strcm
6ec0: 70 28 7a 43 6d 64 2c 22 74 65 78 74 22 29 3d 3d  p(zCmd,"text")==
6ed0: 30 20 29 7b 0a 20 20 20 20 70 31 20 3d 20 28 63  0 ){.    p1 = (c
6ee0: 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c 69 74  onst void*)sqlit
6ef0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
6f00: 67 76 5b 30 5d 29 3b 0a 23 69 66 6e 64 65 66 20  gv[0]);.#ifndef 
6f10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
6f20: 36 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  6.  }else if( st
6f30: 72 63 6d 70 28 7a 43 6d 64 2c 20 22 74 65 78 74  rcmp(zCmd, "text
6f40: 31 36 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  16")==0 ){.    p
6f50: 31 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a  1 = (const void*
6f60: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
6f70: 65 78 74 31 36 28 61 72 67 76 5b 30 5d 29 3b 0a  ext16(argv[0]);.
6f80: 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 20 69  #endif.  }else i
6f90: 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20  f( strcmp(zCmd, 
6fa0: 22 62 6c 6f 62 22 29 3d 3d 30 20 29 7b 0a 20 20  "blob")==0 ){.  
6fb0: 20 20 70 31 20 3d 20 28 63 6f 6e 73 74 20 76 6f    p1 = (const vo
6fc0: 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  id*)sqlite3_valu
6fd0: 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b  e_blob(argv[0]);
6fe0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
6ff0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64  turn;.  }.  zCmd
7000: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
7010: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
7020: 78 74 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 69  xt(argv[2]);.  i
7030: 66 28 20 7a 43 6d 64 3d 3d 30 20 29 20 72 65 74  f( zCmd==0 ) ret
7040: 75 72 6e 3b 0a 20 20 69 66 28 20 73 74 72 63 6d  urn;.  if( strcm
7050: 70 28 7a 43 6d 64 2c 22 62 79 74 65 73 22 29 3d  p(zCmd,"bytes")=
7060: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
7070: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
7080: 67 76 5b 30 5d 29 3b 0a 23 69 66 6e 64 65 66 20  gv[0]);.#ifndef 
7090: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
70a0: 36 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  6.  }else if( st
70b0: 72 63 6d 70 28 7a 43 6d 64 2c 20 22 62 79 74 65  rcmp(zCmd, "byte
70c0: 73 31 36 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  s16")==0 ){.    
70d0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
70e0: 74 65 73 31 36 28 61 72 67 76 5b 30 5d 29 3b 0a  tes16(argv[0]);.
70f0: 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 20 69  #endif.  }else i
7100: 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20  f( strcmp(zCmd, 
7110: 22 6e 6f 6f 70 22 29 3d 3d 30 20 29 7b 0a 20 20  "noop")==0 ){.  
7120: 20 20 2f 2a 20 64 6f 20 6e 6f 74 68 69 6e 67 20    /* do nothing 
7130: 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
7140: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 43  return;.  }.  zC
7150: 6d 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  md = (const char
7160: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
7170: 74 65 78 74 28 61 72 67 76 5b 33 5d 29 3b 0a 20  text(argv[3]);. 
7180: 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29 20 72   if( zCmd==0 ) r
7190: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 74 72  eturn;.  if( str
71a0: 63 6d 70 28 7a 43 6d 64 2c 22 74 65 78 74 22 29  cmp(zCmd,"text")
71b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 32 20 3d 20  ==0 ){.    p2 = 
71c0: 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c  (const void*)sql
71d0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
71e0: 61 72 67 76 5b 30 5d 29 3b 0a 23 69 66 6e 64 65  argv[0]);.#ifnde
71f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
7200: 46 31 36 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  F16.  }else if( 
7210: 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 74 65  strcmp(zCmd, "te
7220: 78 74 31 36 22 29 3d 3d 30 20 29 7b 0a 20 20 20  xt16")==0 ){.   
7230: 20 70 32 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69   p2 = (const voi
7240: 64 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  d*)sqlite3_value
7250: 5f 74 65 78 74 31 36 28 61 72 67 76 5b 30 5d 29  _text16(argv[0])
7260: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
7270: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64   if( strcmp(zCmd
7280: 2c 20 22 62 6c 6f 62 22 29 3d 3d 30 20 29 7b 0a  , "blob")==0 ){.
7290: 20 20 20 20 70 32 20 3d 20 28 63 6f 6e 73 74 20      p2 = (const 
72a0: 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61  void*)sqlite3_va
72b0: 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d  lue_blob(argv[0]
72c0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
72d0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71  return;.  }.  sq
72e0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
72f0: 28 63 6f 6e 74 65 78 74 2c 20 70 31 21 3d 70 32  (context, p1!=p2
7300: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  );.}.../*.** Usa
7310: 67 65 3a 20 20 73 71 6c 69 74 65 5f 74 65 73 74  ge:  sqlite_test
7320: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
7330: 20 44 42 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74   DB.**.** Call t
7340: 68 65 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  he sqlite3_creat
7350: 65 5f 66 75 6e 63 74 69 6f 6e 20 41 50 49 20 6f  e_function API o
7360: 6e 20 74 68 65 20 67 69 76 65 6e 20 64 61 74 61  n the given data
7370: 62 61 73 65 20 69 6e 20 6f 72 64 65 72 0a 2a 2a  base in order.**
7380: 20 74 6f 20 63 72 65 61 74 65 20 61 20 66 75 6e   to create a fun
7390: 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 78 5f 63  ction named "x_c
73a0: 6f 61 6c 65 73 63 65 22 2e 20 20 54 68 69 73 20  oalesce".  This 
73b0: 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68  function does th
73c0: 65 20 73 61 6d 65 20 74 68 69 6e 67 0a 2a 2a 20  e same thing.** 
73d0: 61 73 20 74 68 65 20 22 63 6f 61 6c 65 73 63 65  as the "coalesce
73e0: 22 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69  " function.  Thi
73f0: 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20  s function also 
7400: 72 65 67 69 73 74 65 72 73 20 61 6e 20 53 51 4c  registers an SQL
7410: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6e 61 6d   function.** nam
7420: 65 64 20 22 78 5f 73 71 6c 69 74 65 5f 65 78 65  ed "x_sqlite_exe
7430: 63 22 20 74 68 61 74 20 69 6e 76 6f 6b 65 73 20  c" that invokes 
7440: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 20  sqlite3_exec(). 
7450: 20 49 6e 76 6f 6b 69 6e 67 20 73 71 6c 69 74 65   Invoking sqlite
7460: 33 5f 65 78 65 63 28 29 0a 2a 2a 20 69 6e 20 74  3_exec().** in t
7470: 68 69 73 20 77 61 79 20 69 73 20 69 6c 6c 65 67  his way is illeg
7480: 61 6c 20 72 65 63 75 72 73 69 6f 6e 20 61 6e 64  al recursion and
7490: 20 73 68 6f 75 6c 64 20 72 61 69 73 65 20 61 6e   should raise an
74a0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 65   SQLITE_MISUSE e
74b0: 72 72 6f 72 2e 0a 2a 2a 20 54 68 65 20 65 66 66  rror..** The eff
74c0: 65 63 74 20 69 73 20 73 69 6d 69 6c 61 72 20 74  ect is similar t
74d0: 6f 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20  o trying to use 
74e0: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
74f0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 72 6f  e connection fro
7500: 6d 0a 2a 2a 20 74 77 6f 20 74 68 72 65 61 64 73  m.** two threads
7510: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
7520: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69  e..**.** The ori
7530: 67 69 6e 61 6c 20 6d 6f 74 69 76 61 74 69 6f 6e  ginal motivation
7540: 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e   for this routin
7550: 65 20 77 61 73 20 74 6f 20 62 65 20 61 62 6c 65  e was to be able
7560: 20 74 6f 20 63 61 6c 6c 20 74 68 65 0a 2a 2a 20   to call the.** 
7570: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
7580: 75 6e 63 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  unction function
7590: 20 77 68 69 6c 65 20 61 20 71 75 65 72 79 20 69   while a query i
75a0: 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 69 6e  s in progress in
75b0: 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 74 65 73   order.** to tes
75c0: 74 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 49 53  t the SQLITE_MIS
75d0: 55 53 45 20 64 65 74 65 63 74 69 6f 6e 20 6c 6f  USE detection lo
75e0: 67 69 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  gic..*/.static i
75f0: 6e 74 20 74 65 73 74 5f 63 72 65 61 74 65 5f 66  nt test_create_f
7600: 75 6e 63 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20  unction(.  void 
7610: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
7620: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
7630: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
7640: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
7650: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
7660: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
7670: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
7680: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
7690: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
76a0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
76b0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
76c0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
76d0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
76e0: 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66  lite3 *db;..  if
76f0: 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20  ( argc!=2 ){.   
7700: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
7710: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
7720: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
7730: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
7740: 0a 20 20 20 20 20 20 20 22 20 44 42 5c 22 22 2c  .       " DB\"",
7750: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
7760: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
7770: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
7780: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
7790: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
77a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
77b0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
77c0: 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
77d0: 78 5f 63 6f 61 6c 65 73 63 65 22 2c 20 2d 31 2c  x_coalesce", -1,
77e0: 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20   SQLITE_ANY, 0, 
77f0: 0a 20 20 20 20 20 20 20 20 74 31 5f 69 66 6e 75  .        t1_ifnu
7800: 6c 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  llFunc, 0, 0);. 
7810: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7820: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
7830: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
7840: 6e 63 74 69 6f 6e 28 64 62 2c 20 22 68 65 78 38  nction(db, "hex8
7850: 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 41 4e 59  ", 1, SQLITE_ANY
7860: 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
7870: 68 65 78 38 46 75 6e 63 2c 20 30 2c 20 30 29 3b  hex8Func, 0, 0);
7880: 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
7890: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
78a0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
78b0: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
78c0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
78d0: 6e 63 74 69 6f 6e 28 64 62 2c 20 22 68 65 78 31  nction(db, "hex1
78e0: 36 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 41 4e  6", 1, SQLITE_AN
78f0: 59 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  Y, 0, .         
7900: 20 68 65 78 31 36 46 75 6e 63 2c 20 30 2c 20 30   hex16Func, 0, 0
7910: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
7920: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
7930: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
7940: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
7950: 63 74 69 6f 6e 28 64 62 2c 20 22 74 6b 74 32 32  ction(db, "tkt22
7960: 31 33 66 75 6e 63 22 2c 20 31 2c 20 53 51 4c 49  13func", 1, SQLI
7970: 54 45 5f 41 4e 59 2c 20 30 2c 20 0a 20 20 20 20  TE_ANY, 0, .    
7980: 20 20 20 20 20 20 74 6b 74 32 32 31 33 46 75 6e        tkt2213Fun
7990: 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  ction, 0, 0);.  
79a0: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
79b0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
79c0: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
79d0: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 70  _function(db, "p
79e0: 6f 69 6e 74 65 72 5f 63 68 61 6e 67 65 22 2c 20  ointer_change", 
79f0: 34 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30  4, SQLITE_ANY, 0
7a00: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 74 72  , .          ptr
7a10: 43 68 6e 67 46 75 6e 63 74 69 6f 6e 2c 20 30 2c  ChngFunction, 0,
7a20: 20 30 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65   0);.  }..#ifnde
7a30: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
7a40: 46 31 36 0a 20 20 2f 2a 20 55 73 65 20 74 68 65  F16.  /* Use the
7a50: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
7a60: 66 75 6e 63 74 69 6f 6e 31 36 28 29 20 41 50 49  function16() API
7a70: 20 68 65 72 65 2e 20 4d 61 69 6e 6c 79 20 66 6f   here. Mainly fo
7a80: 72 20 66 75 6e 2c 20 62 75 74 20 61 6c 73 6f 20  r fun, but also 
7a90: 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74  .  ** because it
7aa0: 20 69 73 20 6e 6f 74 20 74 65 73 74 65 64 20 61   is not tested a
7ab0: 6e 79 77 68 65 72 65 20 65 6c 73 65 2e 20 2a 2f  nywhere else. */
7ac0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
7ad0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73  E_OK ){.    cons
7ae0: 74 20 76 6f 69 64 20 2a 7a 55 74 66 31 36 3b 0a  t void *zUtf16;.
7af0: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
7b00: 65 20 2a 70 56 61 6c 3b 0a 20 20 20 20 73 71 6c  e *pVal;.    sql
7b10: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
7b20: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
7b30: 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56   pVal = sqlite3V
7b40: 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20  alueNew(db);.   
7b50: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
7b60: 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 22 78  Str(pVal, -1, "x
7b70: 5f 73 71 6c 69 74 65 5f 65 78 65 63 22 2c 20 53  _sqlite_exec", S
7b80: 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
7b90: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
7ba0: 7a 55 74 66 31 36 20 3d 20 73 71 6c 69 74 65 33  zUtf16 = sqlite3
7bb0: 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20  ValueText(pVal, 
7bc0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
7bd0: 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  VE);.    if( db-
7be0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
7bf0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
7c00: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
7c10: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
7c20: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
7c30: 75 6e 63 74 69 6f 6e 31 36 28 64 62 2c 20 7a 55  unction16(db, zU
7c40: 74 66 31 36 2c 20 0a 20 20 20 20 20 20 20 20 20  tf16, .         
7c50: 20 20 20 20 20 20 20 31 2c 20 53 51 4c 49 54 45         1, SQLITE
7c60: 5f 55 54 46 31 36 2c 20 64 62 2c 20 73 71 6c 69  _UTF16, db, sqli
7c70: 74 65 33 45 78 65 63 46 75 6e 63 2c 20 30 2c 20  te3ExecFunc, 0, 
7c80: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  0);.    }.    sq
7c90: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
7ca0: 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Val);.    sqlite
7cb0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
7cc0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 23 65  ->mutex);.  }.#e
7cd0: 6e 64 69 66 0a 0a 20 20 69 66 28 20 73 71 6c 69  ndif..  if( sqli
7ce0: 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
7cf0: 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
7d00: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
7d10: 52 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  R;.  Tcl_SetResu
7d20: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
7d30: 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
7d40: 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  c), 0);.  return
7d50: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
7d60: 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 69 6d  * Routines to im
7d70: 70 6c 65 6d 65 6e 74 20 74 68 65 20 78 5f 63 6f  plement the x_co
7d80: 75 6e 74 28 29 20 61 67 67 72 65 67 61 74 65 20  unt() aggregate 
7d90: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
7da0: 78 5f 63 6f 75 6e 74 28 29 20 63 6f 75 6e 74 73  x_count() counts
7db0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e   the number of n
7dc0: 6f 6e 2d 6e 75 6c 6c 20 61 72 67 75 6d 65 6e 74  on-null argument
7dd0: 73 2e 20 20 42 75 74 20 74 68 65 72 65 20 61 72  s.  But there ar
7de0: 65 0a 2a 2a 20 73 6f 6d 65 20 74 77 69 73 74 73  e.** some twists
7df0: 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72   for testing pur
7e00: 70 6f 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  poses..**.** If 
7e10: 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
7e20: 78 5f 63 6f 75 6e 74 28 29 20 69 73 20 34 30 20  x_count() is 40 
7e30: 74 68 65 6e 20 61 20 55 54 46 2d 38 20 65 72 72  then a UTF-8 err
7e40: 6f 72 20 69 73 20 72 65 70 6f 72 74 65 64 0a 2a  or is reported.*
7e50: 2a 20 6f 6e 20 74 68 65 20 73 74 65 70 20 66 75  * on the step fu
7e60: 6e 63 74 69 6f 6e 2e 20 20 49 66 20 78 5f 63 6f  nction.  If x_co
7e70: 75 6e 74 28 34 31 29 20 69 73 20 73 65 65 6e 2c  unt(41) is seen,
7e80: 20 74 68 65 6e 20 61 20 55 54 46 2d 31 36 20 65   then a UTF-16 e
7e90: 72 72 6f 72 0a 2a 2a 20 69 73 20 72 65 70 6f 72  rror.** is repor
7ea0: 74 65 64 20 6f 6e 20 74 68 65 20 73 74 65 70 20  ted on the step 
7eb0: 66 75 6e 63 74 69 6f 6e 2e 20 20 49 66 20 74 68  function.  If th
7ec0: 65 20 74 6f 74 61 6c 20 63 6f 75 6e 74 20 69 73  e total count is
7ed0: 20 34 32 2c 20 74 68 65 6e 0a 2a 2a 20 61 20 55   42, then.** a U
7ee0: 54 46 2d 38 20 65 72 72 6f 72 20 69 73 20 72 65  TF-8 error is re
7ef0: 70 6f 72 74 65 64 20 6f 6e 20 74 68 65 20 66 69  ported on the fi
7f00: 6e 61 6c 69 7a 65 20 66 75 6e 63 74 69 6f 6e 2e  nalize function.
7f10: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
7f20: 63 74 20 74 31 43 6f 75 6e 74 43 74 78 20 74 31  ct t1CountCtx t1
7f30: 43 6f 75 6e 74 43 74 78 3b 0a 73 74 72 75 63 74  CountCtx;.struct
7f40: 20 74 31 43 6f 75 6e 74 43 74 78 20 7b 0a 20 20   t1CountCtx {.  
7f50: 69 6e 74 20 6e 3b 0a 7d 3b 0a 73 74 61 74 69 63  int n;.};.static
7f60: 20 76 6f 69 64 20 74 31 43 6f 75 6e 74 53 74 65   void t1CountSte
7f70: 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  p(.  sqlite3_con
7f80: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
7f90: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
7fa0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
7fb0: 76 0a 29 7b 0a 20 20 74 31 43 6f 75 6e 74 43 74  v.){.  t1CountCt
7fc0: 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69  x *p;.  p = sqli
7fd0: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
7fe0: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  ntext(context, s
7ff0: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
8000: 28 20 28 61 72 67 63 3d 3d 30 20 7c 7c 20 53 51  ( (argc==0 || SQ
8010: 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74  LITE_NULL!=sqlit
8020: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
8030: 67 76 5b 30 5d 29 20 29 20 26 26 20 70 20 29 7b  gv[0]) ) && p ){
8040: 0a 20 20 20 20 70 2d 3e 6e 2b 2b 3b 0a 20 20 7d  .    p->n++;.  }
8050: 0a 20 20 69 66 28 20 61 72 67 63 3e 30 20 29 7b  .  if( argc>0 ){
8060: 0a 20 20 20 20 69 6e 74 20 76 20 3d 20 73 71 6c  .    int v = sql
8070: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
8080: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28  rgv[0]);.    if(
8090: 20 76 3d 3d 34 30 20 29 7b 0a 20 20 20 20 20 20   v==40 ){.      
80a0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
80b0: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 76  rror(context, "v
80c0: 61 6c 75 65 20 6f 66 20 34 30 20 68 61 6e 64 65  alue of 40 hande
80d0: 64 20 74 6f 20 78 5f 63 6f 75 6e 74 22 2c 20 2d  d to x_count", -
80e0: 31 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  1);.#ifndef SQLI
80f0: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
8100: 20 20 7d 65 6c 73 65 20 69 66 28 20 76 3d 3d 34    }else if( v==4
8110: 31 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  1 ){.      const
8120: 20 63 68 61 72 20 7a 55 74 66 31 36 45 72 72 4d   char zUtf16ErrM
8130: 73 67 5b 5d 20 3d 20 7b 20 30 2c 20 30 78 36 31  sg[] = { 0, 0x61
8140: 2c 20 30 2c 20 30 78 36 32 2c 20 30 2c 20 30 78  , 0, 0x62, 0, 0x
8150: 36 33 2c 20 30 2c 20 30 2c 20 30 7d 3b 0a 20 20  63, 0, 0, 0};.  
8160: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
8170: 6c 74 5f 65 72 72 6f 72 31 36 28 63 6f 6e 74 65  lt_error16(conte
8180: 78 74 2c 20 26 7a 55 74 66 31 36 45 72 72 4d 73  xt, &zUtf16ErrMs
8190: 67 5b 31 2d 53 51 4c 49 54 45 5f 42 49 47 45 4e  g[1-SQLITE_BIGEN
81a0: 44 49 41 4e 5d 2c 20 2d 31 29 3b 0a 23 65 6e 64  DIAN], -1);.#end
81b0: 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 20 20  if.    }.  }.}  
81c0: 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 31   .static void t1
81d0: 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 28 73 71  CountFinalize(sq
81e0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
81f0: 6f 6e 74 65 78 74 29 7b 0a 20 20 74 31 43 6f 75  ontext){.  t1Cou
8200: 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20  ntCtx *p;.  p = 
8210: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
8220: 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
8230: 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  t, sizeof(*p));.
8240: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
8250: 66 28 20 70 2d 3e 6e 3d 3d 34 32 20 29 7b 0a 20  f( p->n==42 ){. 
8260: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
8270: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
8280: 74 2c 20 22 78 5f 63 6f 75 6e 74 20 74 6f 74 61  t, "x_count tota
8290: 6c 73 20 74 6f 20 34 32 22 2c 20 2d 31 29 3b 0a  ls to 42", -1);.
82a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
82b0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
82c0: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 70 20 3f  int(context, p ?
82d0: 20 70 2d 3e 6e 20 3a 20 30 29 3b 0a 20 20 20 20   p->n : 0);.    
82e0: 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  }.  }.}..#ifndef
82f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
8300: 52 45 43 41 54 45 44 0a 73 74 61 74 69 63 20 76  RECATED.static v
8310: 6f 69 64 20 6c 65 67 61 63 79 43 6f 75 6e 74 53  oid legacyCountS
8320: 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  tep(.  sqlite3_c
8330: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
8340: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
8350: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
8360: 72 67 76 0a 29 7b 0a 20 20 2f 2a 20 6e 6f 2d 6f  rgv.){.  /* no-o
8370: 70 20 2a 2f 0a 7d 0a 0a 73 74 61 74 69 63 20 76  p */.}..static v
8380: 6f 69 64 20 6c 65 67 61 63 79 43 6f 75 6e 74 46  oid legacyCountF
8390: 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f  inalize(sqlite3_
83a0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
83b0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  ){.  sqlite3_res
83c0: 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c  ult_int(context,
83d0: 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61   sqlite3_aggrega
83e0: 74 65 5f 63 6f 75 6e 74 28 63 6f 6e 74 65 78 74  te_count(context
83f0: 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ));.}.#endif../*
8400: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
8410: 74 65 33 5f 63 72 65 61 74 65 5f 61 67 67 72 65  te3_create_aggre
8420: 67 61 74 65 20 44 42 0a 2a 2a 0a 2a 2a 20 43 61  gate DB.**.** Ca
8430: 6c 6c 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63  ll the sqlite3_c
8440: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 41  reate_function A
8450: 50 49 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  PI on the given 
8460: 64 61 74 61 62 61 73 65 20 69 6e 20 6f 72 64 65  database in orde
8470: 72 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 61  r.** to create a
8480: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20   function named 
8490: 22 78 5f 63 6f 75 6e 74 22 2e 20 20 54 68 69 73  "x_count".  This
84a0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d   function is sim
84b0: 69 6c 61 72 0a 2a 2a 20 74 6f 20 74 68 65 20 62  ilar.** to the b
84c0: 75 69 6c 74 2d 69 6e 20 63 6f 75 6e 74 28 29 20  uilt-in count() 
84d0: 66 75 6e 63 74 69 6f 6e 2c 20 77 69 74 68 20 61  function, with a
84e0: 20 66 65 77 20 73 70 65 63 69 61 6c 20 71 75 69   few special qui
84f0: 72 6b 73 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69  rks.** for testi
8500: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 72  ng the sqlite3_r
8510: 65 73 75 6c 74 5f 65 72 72 6f 72 28 29 20 41 50  esult_error() AP
8520: 49 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72  Is..**.** The or
8530: 69 67 69 6e 61 6c 20 6d 6f 74 69 76 61 74 69 6f  iginal motivatio
8540: 6e 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69  n for this routi
8550: 6e 65 20 77 61 73 20 74 6f 20 62 65 20 61 62 6c  ne was to be abl
8560: 65 20 74 6f 20 63 61 6c 6c 20 74 68 65 0a 2a 2a  e to call the.**
8570: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
8580: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
8590: 6f 6e 20 77 68 69 6c 65 20 61 20 71 75 65 72 79  on while a query
85a0: 20 69 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20   is in progress 
85b0: 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 74  in order.** to t
85c0: 65 73 74 20 74 68 65 20 53 51 4c 49 54 45 5f 4d  est the SQLITE_M
85d0: 49 53 55 53 45 20 64 65 74 65 63 74 69 6f 6e 20  ISUSE detection 
85e0: 6c 6f 67 69 63 2e 20 20 53 65 65 20 6d 69 73 75  logic.  See misu
85f0: 73 65 2e 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  se.test..**.** T
8600: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
8610: 6c 61 74 65 72 20 65 78 74 65 6e 64 65 64 20 74  later extended t
8620: 6f 20 74 65 73 74 20 74 68 65 20 75 73 65 20 6f  o test the use o
8630: 66 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  f sqlite3_result
8640: 5f 65 72 72 6f 72 28 29 0a 2a 2a 20 77 69 74 68  _error().** with
8650: 69 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  in aggregate fun
8660: 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61  ctions..**.** La
8670: 74 65 72 3a 20 49 74 20 69 73 20 6e 6f 77 20 61  ter: It is now a
8680: 6c 73 6f 20 65 78 74 65 6e 64 65 64 20 74 6f 20  lso extended to 
8690: 72 65 67 69 73 74 65 72 20 74 68 65 20 61 67 67  register the agg
86a0: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a  regate function.
86b0: 2a 2a 20 22 6c 65 67 61 63 79 5f 63 6f 75 6e 74  ** "legacy_count
86c0: 28 29 22 20 77 69 74 68 20 74 68 65 20 73 75 70  ()" with the sup
86d0: 70 6c 69 65 64 20 64 61 74 61 62 61 73 65 20 68  plied database h
86e0: 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73 20 75  andle. This is u
86f0: 73 65 64 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74  sed.** to test t
8700: 68 65 20 64 65 70 72 65 63 61 74 65 64 20 73 71  he deprecated sq
8710: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
8720: 63 6f 75 6e 74 28 29 20 41 50 49 2e 0a 2a 2f 0a  count() API..*/.
8730: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
8740: 63 72 65 61 74 65 5f 61 67 67 72 65 67 61 74 65  create_aggregate
8750: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
8760: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
8770: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
8780: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
8790: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
87a0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
87b0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
87c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
87d0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
87e0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
87f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8800: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
8810: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
8820: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
8830: 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  rc;.  if( argc!=
8840: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
8850: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8860: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
8870: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
8880: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
8890: 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30  " FILENAME\"", 0
88a0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
88b0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
88c0: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
88d0: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
88e0: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
88f0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
8900: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
8910: 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 78 5f  function(db, "x_
8920: 63 6f 75 6e 74 22 2c 20 30 2c 20 53 51 4c 49 54  count", 0, SQLIT
8930: 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 0a 20 20  E_UTF8, 0, 0,.  
8940: 20 20 20 20 74 31 43 6f 75 6e 74 53 74 65 70 2c      t1CountStep,
8950: 74 31 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 29  t1CountFinalize)
8960: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
8970: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
8980: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
8990: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 78  _function(db, "x
89a0: 5f 63 6f 75 6e 74 22 2c 20 31 2c 20 53 51 4c 49  _count", 1, SQLI
89b0: 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 0a 20  TE_UTF8, 0, 0,. 
89c0: 20 20 20 20 20 20 20 74 31 43 6f 75 6e 74 53 74         t1CountSt
89d0: 65 70 2c 74 31 43 6f 75 6e 74 46 69 6e 61 6c 69  ep,t1CountFinali
89e0: 7a 65 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  ze);.  }.#ifndef
89f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
8a00: 52 45 43 41 54 45 44 0a 20 20 69 66 28 20 72 63  RECATED.  if( rc
8a10: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
8a20: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
8a30: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
8a40: 64 62 2c 20 22 6c 65 67 61 63 79 5f 63 6f 75 6e  db, "legacy_coun
8a50: 74 22 2c 20 30 2c 20 53 51 4c 49 54 45 5f 41 4e  t", 0, SQLITE_AN
8a60: 59 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  Y, 0, 0,.       
8a70: 20 6c 65 67 61 63 79 43 6f 75 6e 74 53 74 65 70   legacyCountStep
8a80: 2c 20 6c 65 67 61 63 79 43 6f 75 6e 74 46 69 6e  , legacyCountFin
8a90: 61 6c 69 7a 65 0a 20 20 20 20 29 3b 0a 20 20 7d  alize.    );.  }
8aa0: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71  .#endif.  if( sq
8ab0: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
8ac0: 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
8ad0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
8ae0: 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65  ROR;.  Tcl_SetRe
8af0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
8b00: 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
8b10: 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75  (rc), 0);.  retu
8b20: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
8b30: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 70 72 69  *.** Usage:  pri
8b40: 6e 74 66 20 54 45 58 54 0a 2a 2a 0a 2a 2a 20 53  ntf TEXT.**.** S
8b50: 65 6e 64 20 6f 75 74 70 75 74 20 74 6f 20 70 72  end output to pr
8b60: 69 6e 74 66 2e 20 20 55 73 65 20 74 68 69 73 20  intf.  Use this 
8b70: 72 61 74 68 65 72 20 74 68 61 6e 20 70 75 74 73  rather than puts
8b80: 20 74 6f 20 6d 65 72 67 65 20 74 68 65 20 6f 75   to merge the ou
8b90: 74 70 75 74 0a 2a 2a 20 69 6e 20 74 68 65 20 63  tput.** in the c
8ba0: 6f 72 72 65 63 74 20 73 65 71 75 65 6e 63 65 20  orrect sequence 
8bb0: 77 69 74 68 20 64 65 62 75 67 67 69 6e 67 20 70  with debugging p
8bc0: 72 69 6e 74 66 73 20 69 6e 73 65 72 74 65 64 20  rintfs inserted 
8bd0: 69 6e 74 6f 20 43 20 63 6f 64 65 2e 0a 2a 2a 20  into C code..** 
8be0: 50 75 74 73 20 75 73 65 73 20 61 20 73 65 70 61  Puts uses a sepa
8bf0: 72 61 74 65 20 62 75 66 66 65 72 20 61 6e 64 20  rate buffer and 
8c00: 64 65 62 75 67 67 69 6e 67 20 73 74 61 74 65 6d  debugging statem
8c10: 65 6e 74 73 20 77 69 6c 6c 20 62 65 20 6f 75 74  ents will be out
8c20: 20 6f 66 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20   of.** sequence 
8c30: 69 66 20 69 74 20 69 73 20 75 73 65 64 2e 0a 2a  if it is used..*
8c40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
8c50: 74 5f 70 72 69 6e 74 66 28 0a 20 20 76 6f 69 64  t_printf(.  void
8c60: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
8c70: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
8c80: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
8c90: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
8ca0: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
8cb0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
8cc0: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
8cd0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
8ce0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
8cf0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
8d00: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
8d10: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
8d20: 29 7b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  ){.  if( argc!=2
8d30: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
8d40: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
8d50: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
8d60: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
8d70: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
8d80: 20 54 45 58 54 5c 22 22 2c 20 30 29 3b 0a 20 20   TEXT\"", 0);.  
8d90: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
8da0: 4f 52 3b 0a 20 20 7d 0a 20 20 70 72 69 6e 74 66  OR;.  }.  printf
8db0: 28 22 25 73 5c 6e 22 2c 20 61 72 67 76 5b 31 5d  ("%s\n", argv[1]
8dc0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
8dd0: 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 55  OK;.}..../*.** U
8de0: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
8df0: 70 72 69 6e 74 66 5f 69 6e 74 20 46 4f 52 4d 41  printf_int FORMA
8e00: 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  T INTEGER INTEGE
8e10: 52 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20  R INTEGER.**.** 
8e20: 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74  Call mprintf wit
8e30: 68 20 74 68 72 65 65 20 69 6e 74 65 67 65 72 20  h three integer 
8e40: 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61  arguments.*/.sta
8e50: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  tic int sqlite3_
8e60: 6d 70 72 69 6e 74 66 5f 69 6e 74 28 0a 20 20 76  mprintf_int(.  v
8e70: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
8e80: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
8e90: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
8ea0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
8eb0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
8ec0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
8ed0: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
8ee0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8ef0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
8f00: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
8f10: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
8f20: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
8f30: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d  */.){.  int a[3]
8f40: 2c 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  , i;.  char *z;.
8f50: 20 20 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b    if( argc!=5 ){
8f60: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
8f70: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
8f80: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
8f90: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
8fa0: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f  [0],.       " FO
8fb0: 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 49 4e 54  RMAT INT INT INT
8fc0: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
8fd0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8fe0: 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c   }.  for(i=2; i<
8ff0: 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  5; i++){.    if(
9000: 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65   Tcl_GetInt(inte
9010: 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b  rp, argv[i], &a[
9020: 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54  i-2]) ) return T
9030: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
9040: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
9050: 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30  ntf(argv[1], a[0
9060: 5d 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a  ], a[1], a[2]);.
9070: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
9080: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29  lt(interp, z, 0)
9090: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
90a0: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  (z);.  return TC
90b0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
90c0: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
90d0: 70 72 69 6e 74 66 5f 69 6e 74 36 34 20 46 4f 52  printf_int64 FOR
90e0: 4d 41 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45  MAT INTEGER INTE
90f0: 47 45 52 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a  GER INTEGER.**.*
9100: 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77  * Call mprintf w
9110: 69 74 68 20 74 68 72 65 65 20 36 34 2d 62 69 74  ith three 64-bit
9120: 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e   integer argumen
9130: 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ts.*/.static int
9140: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
9150: 5f 69 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a  _int64(.  void *
9160: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
9170: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
9180: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
9190: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
91a0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
91b0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
91c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
91d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
91e0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
91f0: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
9200: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
9210: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
9220: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69  .  int i;.  sqli
9230: 74 65 5f 69 6e 74 36 34 20 61 5b 33 5d 3b 0a 20  te_int64 a[3];. 
9240: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
9250: 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54  argc!=5 ){.    T
9260: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
9270: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
9280: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
9290: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
92a0: 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 49        " FORMAT I
92b0: 4e 54 20 49 4e 54 20 49 4e 54 5c 22 22 2c 20 30  NT INT INT\"", 0
92c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
92d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66  L_ERROR;.  }.  f
92e0: 6f 72 28 69 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b  or(i=2; i<5; i++
92f0: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
9300: 65 33 41 74 6f 69 36 34 28 61 72 67 76 5b 69 5d  e3Atoi64(argv[i]
9310: 2c 20 26 61 5b 69 2d 32 5d 2c 20 31 30 30 30 30  , &a[i-2], 10000
9320: 30 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  00, SQLITE_UTF8)
9330: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
9340: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
9350: 70 2c 20 22 61 72 67 75 6d 65 6e 74 20 69 73 20  p, "argument is 
9360: 6e 6f 74 20 61 20 76 61 6c 69 64 20 36 34 2d 62  not a valid 64-b
9370: 69 74 20 69 6e 74 65 67 65 72 22 2c 20 30 29 3b  it integer", 0);
9380: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
9390: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
93a0: 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33   }.  z = sqlite3
93b0: 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d  _mprintf(argv[1]
93c0: 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 5b  , a[0], a[1], a[
93d0: 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  2]);.  Tcl_Appen
93e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
93f0: 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  z, 0);.  sqlite3
9400: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75  _free(z);.  retu
9410: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
9420: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
9430: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67  te3_mprintf_long
9440: 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52 20   FORMAT INTEGER 
9450: 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 0a  INTEGER INTEGER.
9460: 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e  **.** Call mprin
9470: 74 66 20 77 69 74 68 20 74 68 72 65 65 20 6c 6f  tf with three lo
9480: 6e 67 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d  ng integer argum
9490: 65 6e 74 73 2e 20 20 20 54 68 69 73 20 6d 69 67  ents.   This mig
94a0: 68 74 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d  ht be the.** sam
94b0: 65 20 61 73 20 73 71 6c 69 74 65 33 5f 6d 70 72  e as sqlite3_mpr
94c0: 69 6e 74 66 5f 69 6e 74 20 6f 72 20 73 71 6c 69  intf_int or sqli
94d0: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36  te3_mprintf_int6
94e0: 34 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 0a  4, depending on.
94f0: 2a 2a 20 70 6c 61 74 66 6f 72 6d 2e 0a 2a 2f 0a  ** platform..*/.
9500: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
9510: 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67 28  e3_mprintf_long(
9520: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
9530: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
9540: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
9550: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
9560: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
9570: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
9580: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
9590: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
95a0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
95b0: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
95c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
95d0: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
95e0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ent */.){.  int 
95f0: 69 3b 0a 20 20 6c 6f 6e 67 20 69 6e 74 20 61 5b  i;.  long int a[
9600: 33 5d 3b 0a 20 20 69 6e 74 20 62 5b 33 5d 3b 0a  3];.  int b[3];.
9610: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28    char *z;.  if(
9620: 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20   argc!=5 ){.    
9630: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
9640: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
9650: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
9660: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
9670: 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20         " FORMAT 
9680: 49 4e 54 20 49 4e 54 20 49 4e 54 5c 22 22 2c 20  INT INT INT\"", 
9690: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
96a0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
96b0: 66 6f 72 28 69 3d 32 3b 20 69 3c 35 3b 20 69 2b  for(i=2; i<5; i+
96c0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f  +){.    if( Tcl_
96d0: 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
96e0: 72 67 76 5b 69 5d 2c 20 26 62 5b 69 2d 32 5d 29  rgv[i], &b[i-2])
96f0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
9700: 52 4f 52 3b 0a 20 20 20 20 61 5b 69 2d 32 5d 20  ROR;.    a[i-2] 
9710: 3d 20 28 6c 6f 6e 67 20 69 6e 74 29 62 5b 69 2d  = (long int)b[i-
9720: 32 5d 3b 0a 20 20 20 20 61 5b 69 2d 32 5d 20 26  2];.    a[i-2] &
9730: 3d 20 28 28 28 75 36 34 29 31 29 3c 3c 28 73 69  = (((u64)1)<<(si
9740: 7a 65 6f 66 28 69 6e 74 29 2a 38 29 29 2d 31 3b  zeof(int)*8))-1;
9750: 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74  .  }.  z = sqlit
9760: 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b  e3_mprintf(argv[
9770: 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20  1], a[0], a[1], 
9780: 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70  a[2]);.  Tcl_App
9790: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
97a0: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
97b0: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
97c0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
97d0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
97e0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74  lite3_mprintf_st
97f0: 72 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52  r FORMAT INTEGER
9800: 20 49 4e 54 45 47 45 52 20 53 54 52 49 4e 47 0a   INTEGER STRING.
9810: 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e  **.** Call mprin
9820: 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74 65  tf with two inte
9830: 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61 6e  ger arguments an
9840: 64 20 6f 6e 65 20 73 74 72 69 6e 67 20 61 72 67  d one string arg
9850: 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20  ument.*/.static 
9860: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  int sqlite3_mpri
9870: 6e 74 66 5f 73 74 72 28 0a 20 20 76 6f 69 64 20  ntf_str(.  void 
9880: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
9890: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
98a0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
98b0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
98c0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
98d0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
98e0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
98f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
9900: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
9910: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
9920: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
9930: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
9940: 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69 3b  {.  int a[3], i;
9950: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66  .  char *z;.  if
9960: 28 20 61 72 67 63 3c 34 20 7c 7c 20 61 72 67 63  ( argc<4 || argc
9970: 3e 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  >5 ){.    Tcl_Ap
9980: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
9990: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
99a0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
99b0: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
99c0: 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e   " FORMAT INT IN
99d0: 54 20 3f 53 54 52 49 4e 47 3f 5c 22 22 2c 20 30  T ?STRING?\"", 0
99e0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
99f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66  L_ERROR;.  }.  f
9a00: 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b 2b  or(i=2; i<4; i++
9a10: 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  ){.    if( Tcl_G
9a20: 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72  etInt(interp, ar
9a30: 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 29 20  gv[i], &a[i-2]) 
9a40: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
9a50: 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71  OR;.  }.  z = sq
9a60: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72  lite3_mprintf(ar
9a70: 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31  gv[1], a[0], a[1
9a80: 5d 2c 20 61 72 67 63 3e 34 20 3f 20 61 72 67 76  ], argc>4 ? argv
9a90: 5b 34 5d 20 3a 20 4e 55 4c 4c 29 3b 0a 20 20 54  [4] : NULL);.  T
9aa0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
9ab0: 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20  interp, z, 0);. 
9ac0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
9ad0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
9ae0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
9af0: 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  e:  sqlite3_snpr
9b00: 69 6e 74 66 5f 73 74 72 20 49 4e 54 45 47 45 52  intf_str INTEGER
9b10: 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52 20   FORMAT INTEGER 
9b20: 49 4e 54 45 47 45 52 20 53 54 52 49 4e 47 0a 2a  INTEGER STRING.*
9b30: 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74  *.** Call mprint
9b40: 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74 65 67  f with two integ
9b50: 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61 6e 64  er arguments and
9b60: 20 6f 6e 65 20 73 74 72 69 6e 67 20 61 72 67 75   one string argu
9b70: 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ment.*/.static i
9b80: 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  nt sqlite3_snpri
9b90: 6e 74 66 5f 73 74 72 28 0a 20 20 76 6f 69 64 20  ntf_str(.  void 
9ba0: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
9bb0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
9bc0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
9bd0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
9be0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
9bf0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
9c00: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
9c10: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
9c20: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
9c30: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
9c40: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
9c50: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
9c60: 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69 3b  {.  int a[3], i;
9c70: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61 72  .  int n;.  char
9c80: 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 3c   *z;.  if( argc<
9c90: 35 20 7c 7c 20 61 72 67 63 3e 36 20 29 7b 0a 20  5 || argc>6 ){. 
9ca0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
9cb0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
9cc0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
9cd0: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
9ce0: 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 4e 54 20  ],.       " INT 
9cf0: 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 3f  FORMAT INT INT ?
9d00: 53 54 52 49 4e 47 3f 5c 22 22 2c 20 30 29 3b 0a  STRING?\"", 0);.
9d10: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
9d20: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
9d30: 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72  Tcl_GetInt(inter
9d40: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 6e 29 20  p, argv[1], &n) 
9d50: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
9d60: 4f 52 3b 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b  OR;.  if( n<0 ){
9d70: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
9d80: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e  esult(interp, "N
9d90: 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 6e 65 67   must be non-neg
9da0: 61 74 69 76 65 22 2c 20 30 29 3b 0a 20 20 20 20  ative", 0);.    
9db0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9dc0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 33 3b  ;.  }.  for(i=3;
9dd0: 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<5; i++){.    
9de0: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69  if( Tcl_GetInt(i
9df0: 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20  nterp, argv[i], 
9e00: 26 61 5b 69 2d 33 5d 29 20 29 20 72 65 74 75 72  &a[i-3]) ) retur
9e10: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
9e20: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  z = sqlite3_m
9e30: 61 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20  alloc( n+1 );.  
9e40: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
9e50: 28 6e 2c 20 7a 2c 20 61 72 67 76 5b 32 5d 2c 20  (n, z, argv[2], 
9e60: 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 72 67 63  a[0], a[1], argc
9e70: 3e 34 20 3f 20 61 72 67 76 5b 35 5d 20 3a 20 4e  >4 ? argv[5] : N
9e80: 55 4c 4c 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  ULL);.  Tcl_Appe
9e90: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
9ea0: 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   z, 0);.  sqlite
9eb0: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74  3_free(z);.  ret
9ec0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
9ed0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
9ee0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75  ite3_mprintf_dou
9ef0: 62 6c 65 20 46 4f 52 4d 41 54 20 49 4e 54 45 47  ble FORMAT INTEG
9f00: 45 52 20 49 4e 54 45 47 45 52 20 44 4f 55 42 4c  ER INTEGER DOUBL
9f10: 45 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  E.**.** Call mpr
9f20: 69 6e 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e  intf with two in
9f30: 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20  teger arguments 
9f40: 61 6e 64 20 6f 6e 65 20 64 6f 75 62 6c 65 20 61  and one double a
9f50: 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69  rgument.*/.stati
9f60: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70  c int sqlite3_mp
9f70: 72 69 6e 74 66 5f 64 6f 75 62 6c 65 28 0a 20 20  rintf_double(.  
9f80: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
9f90: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
9fa0: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
9fb0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
9fc0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
9fd0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
9fe0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
9ff0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
a000: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
a010: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
a020: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
a030: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
a040: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33   */.){.  int a[3
a050: 5d 2c 20 69 3b 0a 20 20 64 6f 75 62 6c 65 20 72  ], i;.  double r
a060: 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  ;.  char *z;.  i
a070: 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20  f( argc!=5 ){.  
a080: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
a090: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
a0a0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
a0b0: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
a0c0: 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41  ,.       " FORMA
a0d0: 54 20 49 4e 54 20 49 4e 54 20 44 4f 55 42 4c 45  T INT INT DOUBLE
a0e0: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
a0f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
a100: 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c   }.  for(i=2; i<
a110: 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  4; i++){.    if(
a120: 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65   Tcl_GetInt(inte
a130: 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b  rp, argv[i], &a[
a140: 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54  i-2]) ) return T
a150: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
a160: 69 66 28 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c  if( Tcl_GetDoubl
a170: 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 34  e(interp, argv[4
a180: 5d 2c 20 26 72 29 20 29 20 72 65 74 75 72 6e 20  ], &r) ) return 
a190: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 20 3d  TCL_ERROR;.  z =
a1a0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
a1b0: 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20  (argv[1], a[0], 
a1c0: 61 5b 31 5d 2c 20 72 29 3b 0a 20 20 54 63 6c 5f  a[1], r);.  Tcl_
a1d0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
a1e0: 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71  erp, z, 0);.  sq
a1f0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
a200: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
a210: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
a220: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
a230: 5f 73 63 61 6c 65 64 20 46 4f 52 4d 41 54 20 44  _scaled FORMAT D
a240: 4f 55 42 4c 45 20 44 4f 55 42 4c 45 0a 2a 2a 0a  OUBLE DOUBLE.**.
a250: 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20  ** Call mprintf 
a260: 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 64 6f  with a single do
a270: 75 62 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68  uble argument wh
a280: 69 63 68 20 69 73 20 74 68 65 20 70 72 6f 64 75  ich is the produ
a290: 63 74 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f  ct of the.** two
a2a0: 20 61 72 67 75 6d 65 6e 74 73 20 67 69 76 65 6e   arguments given
a2b0: 20 61 62 6f 76 65 2e 20 20 54 68 69 73 20 69 73   above.  This is
a2c0: 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74   used to generat
a2d0: 65 20 6f 76 65 72 66 6c 6f 77 20 61 6e 64 20 75  e overflow and u
a2e0: 6e 64 65 72 66 6c 6f 77 0a 2a 2a 20 64 6f 75 62  nderflow.** doub
a2f0: 6c 65 73 20 74 6f 20 74 65 73 74 20 74 68 61 74  les to test that
a300: 20 74 68 65 79 20 61 72 65 20 63 6f 6e 76 65 72   they are conver
a310: 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f  ted properly..*/
a320: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
a330: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c  te3_mprintf_scal
a340: 65 64 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  ed(.  void *NotU
a350: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
a360: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
a370: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
a380: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
a390: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
a3a0: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
a3b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
a3c0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
a3d0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
a3e0: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
a3f0: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
a400: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  gument */.){.  i
a410: 6e 74 20 69 3b 0a 20 20 64 6f 75 62 6c 65 20 72  nt i;.  double r
a420: 5b 32 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  [2];.  char *z;.
a430: 20 20 69 66 28 20 61 72 67 63 21 3d 34 20 29 7b    if( argc!=4 ){
a440: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
a450: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
a460: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
a470: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
a480: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f  [0],.       " FO
a490: 52 4d 41 54 20 44 4f 55 42 4c 45 20 44 4f 55 42  RMAT DOUBLE DOUB
a4a0: 4c 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  LE\"", 0);.    r
a4b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a4c0: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20  .  }.  for(i=2; 
a4d0: 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<4; i++){.    i
a4e0: 66 28 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65  f( Tcl_GetDouble
a4f0: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d  (interp, argv[i]
a500: 2c 20 26 72 5b 69 2d 32 5d 29 20 29 20 72 65 74  , &r[i-2]) ) ret
a510: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
a520: 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33   }.  z = sqlite3
a530: 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d  _mprintf(argv[1]
a540: 2c 20 72 5b 30 5d 2a 72 5b 31 5d 29 3b 0a 20 20  , r[0]*r[1]);.  
a550: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
a560: 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a  (interp, z, 0);.
a570: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
a580: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
a590: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
a5a0: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge:  sqlite3_mpr
a5b0: 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 20 46 4f 52  intf_stronly FOR
a5c0: 4d 41 54 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a  MAT STRING.**.**
a5d0: 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69   Call mprintf wi
a5e0: 74 68 20 61 20 73 69 6e 67 6c 65 20 64 6f 75 62  th a single doub
a5f0: 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63  le argument whic
a600: 68 20 69 73 20 74 68 65 20 70 72 6f 64 75 63 74  h is the product
a610: 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20 61   of the.** two a
a620: 72 67 75 6d 65 6e 74 73 20 67 69 76 65 6e 20 61  rguments given a
a630: 62 6f 76 65 2e 20 20 54 68 69 73 20 69 73 20 75  bove.  This is u
a640: 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20  sed to generate 
a650: 6f 76 65 72 66 6c 6f 77 20 61 6e 64 20 75 6e 64  overflow and und
a660: 65 72 66 6c 6f 77 0a 2a 2a 20 64 6f 75 62 6c 65  erflow.** double
a670: 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 74  s to test that t
a680: 68 65 79 20 61 72 65 20 63 6f 6e 76 65 72 74 65  hey are converte
a690: 64 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 73  d properly..*/.s
a6a0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
a6b0: 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c  3_mprintf_stronl
a6c0: 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  y(.  void *NotUs
a6d0: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
a6e0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
a6f0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
a700: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
a710: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
a720: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
a730: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
a740: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
a750: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
a760: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
a770: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
a780: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68  ument */.){.  ch
a790: 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67  ar *z;.  if( arg
a7a0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
a7b0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
a7c0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
a7d0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
a7e0: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
a7f0: 20 20 20 22 20 46 4f 52 4d 41 54 20 53 54 52 49     " FORMAT STRI
a800: 4e 47 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  NG\"", 0);.    r
a810: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a820: 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74  .  }.  z = sqlit
a830: 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b  e3_mprintf(argv[
a840: 31 5d 2c 20 61 72 67 76 5b 32 5d 29 3b 0a 20 20  1], argv[2]);.  
a850: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
a860: 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a  (interp, z, 0);.
a870: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
a880: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
a890: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
a8a0: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge:  sqlite3_mpr
a8b0: 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65 20 46  intf_hexdouble F
a8c0: 4f 52 4d 41 54 20 48 45 58 0a 2a 2a 0a 2a 2a 20  ORMAT HEX.**.** 
a8d0: 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74  Call mprintf wit
a8e0: 68 20 61 20 73 69 6e 67 6c 65 20 64 6f 75 62 6c  h a single doubl
a8f0: 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68  e argument which
a900: 20 69 73 20 64 65 72 69 76 65 64 20 66 72 6f 6d   is derived from
a910: 20 74 68 65 0a 2a 2a 20 68 65 78 61 64 65 63 69   the.** hexadeci
a920: 6d 61 6c 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  mal encoding of 
a930: 61 6e 20 49 45 45 45 20 64 6f 75 62 6c 65 2e 0a  an IEEE double..
a940: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
a950: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65  lite3_mprintf_he
a960: 78 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20  xdouble(.  void 
a970: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
a980: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
a990: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
a9a0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
a9b0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
a9c0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
a9d0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
a9e0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
a9f0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
aa00: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
aa10: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
aa20: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
aa30: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 64  {.  char *z;.  d
aa40: 6f 75 62 6c 65 20 72 3b 0a 20 20 75 6e 73 69 67  ouble r;.  unsig
aa50: 6e 65 64 20 69 6e 74 20 78 31 2c 20 78 32 3b 0a  ned int x1, x2;.
aa60: 20 20 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 20    sqlite_uint64 
aa70: 64 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33  d;.  if( argc!=3
aa80: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
aa90: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
aaa0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
aab0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
aac0: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
aad0: 20 46 4f 52 4d 41 54 20 53 54 52 49 4e 47 5c 22   FORMAT STRING\"
aae0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
aaf0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
ab00: 0a 20 20 69 66 28 20 73 73 63 61 6e 66 28 61 72  .  if( sscanf(ar
ab10: 67 76 5b 32 5d 2c 20 22 25 30 38 78 25 30 38 78  gv[2], "%08x%08x
ab20: 22 2c 20 26 78 32 2c 20 26 78 31 29 21 3d 32 20  ", &x2, &x1)!=2 
ab30: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
ab40: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
ab50: 22 32 6e 64 20 61 72 67 75 6d 65 6e 74 20 73 68  "2nd argument sh
ab60: 6f 75 6c 64 20 62 65 20 31 36 2d 63 68 61 72 61  ould be 16-chara
ab70: 63 74 65 72 73 20 6f 66 20 68 65 78 22 2c 20 30  cters of hex", 0
ab80: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
ab90: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 64  L_ERROR;.  }.  d
aba0: 20 3d 20 78 32 3b 0a 20 20 64 20 3d 20 28 64 3c   = x2;.  d = (d<
abb0: 3c 33 32 29 20 2b 20 78 31 3b 0a 20 20 6d 65 6d  <32) + x1;.  mem
abc0: 63 70 79 28 26 72 2c 20 26 64 2c 20 73 69 7a 65  cpy(&r, &d, size
abd0: 6f 66 28 72 29 29 3b 0a 20 20 7a 20 3d 20 73 71  of(r));.  z = sq
abe0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72  lite3_mprintf(ar
abf0: 67 76 5b 31 5d 2c 20 72 29 3b 0a 20 20 54 63 6c  gv[1], r);.  Tcl
ac00: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
ac10: 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73  terp, z, 0);.  s
ac20: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
ac30: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
ac40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
ac50: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
ac60: 73 68 61 72 65 64 5f 63 61 63 68 65 20 3f 42 4f  shared_cache ?BO
ac70: 4f 4c 45 41 4e 3f 0a 2a 2a 0a 2a 2f 0a 23 69 66  OLEAN?.**.*/.#if
ac80: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
ac90: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
aca0: 48 45 29 0a 73 74 61 74 69 63 20 69 6e 74 20 74  HE).static int t
acb0: 65 73 74 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65  est_enable_share
acc0: 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  d(.  ClientData 
acd0: 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
ace0: 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
acf0: 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
ad00: 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
ad10: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
ad20: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
ad30: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
ad40: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
ad50: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
ad60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
ad70: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
ad80: 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
ad90: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
ada0: 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
adb0: 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
adc0: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 65 6e 61  nt rc;.  int ena
add0: 62 6c 65 3b 0a 20 20 69 6e 74 20 72 65 74 20 3d  ble;.  int ret =
ade0: 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   0;..  if( objc!
adf0: 3d 32 20 26 26 20 6f 62 6a 63 21 3d 31 20 29 7b  =2 && objc!=1 ){
ae00: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
ae10: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
ae20: 20 6f 62 6a 76 2c 20 22 3f 42 4f 4f 4c 45 41 4e   objv, "?BOOLEAN
ae30: 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ?");.    return 
ae40: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
ae50: 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 47 6c   ret = sqlite3Gl
ae60: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65  obalConfig.share
ae70: 64 43 61 63 68 65 45 6e 61 62 6c 65 64 3b 0a 0a  dCacheEnabled;..
ae80: 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b    if( objc==2 ){
ae90: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
aea0: 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
aeb0: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
aec0: 26 65 6e 61 62 6c 65 29 20 29 7b 0a 20 20 20 20  &enable) ){.    
aed0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
aee0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  OR;.    }.    rc
aef0: 20 3d 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c   = sqlite3_enabl
af00: 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 28 65  e_shared_cache(e
af10: 6e 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  nable);.    if( 
af20: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
af30: 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65  .      Tcl_SetRe
af40: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
af50: 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72 72 53  ar *)sqlite3ErrS
af60: 74 72 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  tr(rc), TCL_STAT
af70: 49 43 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  IC);.      retur
af80: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
af90: 20 7d 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74   }.  }.  Tcl_Set
afa0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
afb0: 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e  , Tcl_NewBoolean
afc0: 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20 72 65 74  Obj(ret));.  ret
afd0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
afe0: 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73  ndif..../*.** Us
aff0: 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 78 74  age: sqlite3_ext
b000: 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64  ended_result_cod
b010: 65 73 20 20 20 44 42 20 20 20 20 42 4f 4f 4c 45  es   DB    BOOLE
b020: 41 4e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  AN.**.*/.static 
b030: 69 6e 74 20 74 65 73 74 5f 65 78 74 65 6e 64 65  int test_extende
b040: 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28 0a  d_result_codes(.
b050: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
b060: 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
b070: 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
b080: 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
b090: 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
b0a0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
b0b0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
b0c0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
b0d0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
b0e0: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
b0f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
b100: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
b110: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
b120: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
b130: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
b140: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nts */.){.  int 
b150: 65 6e 61 62 6c 65 3b 0a 20 20 73 71 6c 69 74 65  enable;.  sqlite
b160: 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 6f 62  3 *db;..  if( ob
b170: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
b180: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
b190: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
b1a0: 44 42 20 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20  DB BOOLEAN");.  
b1b0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
b1c0: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
b1d0: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
b1e0: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
b1f0: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
b200: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
b210: 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
b220: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
b230: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
b240: 20 26 65 6e 61 62 6c 65 29 20 29 20 72 65 74 75   &enable) ) retu
b250: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
b260: 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
b270: 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28 64 62  _result_codes(db
b280: 2c 20 65 6e 61 62 6c 65 29 3b 0a 20 20 72 65 74  , enable);.  ret
b290: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
b2a0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
b2b0: 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e  te3_libversion_n
b2c0: 75 6d 62 65 72 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  umber.**.*/.stat
b2d0: 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 69 62 76  ic int test_libv
b2e0: 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 0a 20  ersion_number(. 
b2f0: 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
b300: 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
b310: 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
b320: 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
b330: 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
b340: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
b350: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
b360: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
b370: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
b380: 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
b390: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
b3a0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
b3b0: 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
b3c0: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
b3d0: 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
b3e0: 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 53  ts */.){.  Tcl_S
b3f0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
b400: 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
b410: 6a 28 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  j(sqlite3_libver
b420: 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 29 29 29 3b  sion_number()));
b430: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
b440: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
b450: 3a 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f  : sqlite3_table_
b460: 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 20  column_metadata 
b470: 44 42 20 64 62 6e 61 6d 65 20 74 62 6c 6e 61 6d  DB dbname tblnam
b480: 65 20 63 6f 6c 6e 61 6d 65 0a 2a 2a 0a 2a 2f 0a  e colname.**.*/.
b490: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
b4a0: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
b4b0: 44 41 54 41 0a 73 74 61 74 69 63 20 69 6e 74 20  DATA.static int 
b4c0: 74 65 73 74 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  test_table_colum
b4d0: 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 43 6c  n_metadata(.  Cl
b4e0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
b4f0: 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
b500: 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
b510: 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
b520: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
b530: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
b540: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
b550: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
b560: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
b570: 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
b580: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
b590: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
b5a0: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
b5b0: 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
b5c0: 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
b5d0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
b5e0: 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db;.  const cha
b5f0: 72 20 2a 7a 44 62 3b 0a 20 20 63 6f 6e 73 74 20  r *zDb;.  const 
b600: 63 68 61 72 20 2a 7a 54 62 6c 3b 0a 20 20 63 6f  char *zTbl;.  co
b610: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a  nst char *zCol;.
b620: 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 63 6c 5f    int rc;.  Tcl_
b630: 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a 20 20 63 6f  Obj *pRet;..  co
b640: 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 74  nst char *zDatat
b650: 79 70 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ype;.  const cha
b660: 72 20 2a 7a 43 6f 6c 6c 73 65 71 3b 0a 20 20 69  r *zCollseq;.  i
b670: 6e 74 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 6e  nt notnull;.  in
b680: 74 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20  t primarykey;.  
b690: 69 6e 74 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e  int autoincremen
b6a0: 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  t;..  if( objc!=
b6b0: 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  5 ){.    Tcl_Wro
b6c0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
b6d0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 64  , 1, objv, "DB d
b6e0: 62 6e 61 6d 65 20 74 62 6c 6e 61 6d 65 20 63 6f  bname tblname co
b6f0: 6c 6e 61 6d 65 22 29 3b 0a 20 20 20 20 72 65 74  lname");.    ret
b700: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b710: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
b720: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
b730: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
b740: 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
b750: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b760: 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74   zDb = Tcl_GetSt
b770: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
b780: 20 7a 54 62 6c 20 3d 20 54 63 6c 5f 47 65 74 53   zTbl = Tcl_GetS
b790: 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a  tring(objv[3]);.
b7a0: 20 20 7a 43 6f 6c 20 3d 20 54 63 6c 5f 47 65 74    zCol = Tcl_Get
b7b0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b  String(objv[4]);
b7c0: 0a 0a 20 20 69 66 28 20 73 74 72 6c 65 6e 28 7a  ..  if( strlen(z
b7d0: 44 62 29 3d 3d 30 20 29 20 7a 44 62 20 3d 20 30  Db)==0 ) zDb = 0
b7e0: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
b7f0: 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
b800: 65 74 61 64 61 74 61 28 64 62 2c 20 7a 44 62 2c  etadata(db, zDb,
b810: 20 7a 54 62 6c 2c 20 7a 43 6f 6c 2c 20 0a 20 20   zTbl, zCol, .  
b820: 20 20 20 20 26 7a 44 61 74 61 74 79 70 65 2c 20      &zDatatype, 
b830: 26 7a 43 6f 6c 6c 73 65 71 2c 20 26 6e 6f 74 6e  &zCollseq, &notn
b840: 75 6c 6c 2c 20 26 70 72 69 6d 61 72 79 6b 65 79  ull, &primarykey
b850: 2c 20 26 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74  , &autoincrement
b860: 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  );..  if( rc!=SQ
b870: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
b880: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
b890: 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f  interp, sqlite3_
b8a0: 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a  errmsg(db), 0);.
b8b0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
b8c0: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 52 65  RROR;.  }..  pRe
b8d0: 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29  t = Tcl_NewObj()
b8e0: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
b8f0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
b900: 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pRet, Tcl_NewStr
b910: 69 6e 67 4f 62 6a 28 7a 44 61 74 61 74 79 70 65  ingObj(zDatatype
b920: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
b930: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
b940: 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f  nt(0, pRet, Tcl_
b950: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 43 6f  NewStringObj(zCo
b960: 6c 6c 73 65 71 2c 20 2d 31 29 29 3b 0a 20 20 54  llseq, -1));.  T
b970: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
b980: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c  Element(0, pRet,
b990: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e   Tcl_NewIntObj(n
b9a0: 6f 74 6e 75 6c 6c 29 29 3b 0a 20 20 54 63 6c 5f  otnull));.  Tcl_
b9b0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
b9c0: 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63  ment(0, pRet, Tc
b9d0: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 70 72 69 6d  l_NewIntObj(prim
b9e0: 61 72 79 6b 65 79 29 29 3b 0a 20 20 54 63 6c 5f  arykey));.  Tcl_
b9f0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
ba00: 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63  ment(0, pRet, Tc
ba10: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 75 74 6f  l_NewIntObj(auto
ba20: 69 6e 63 72 65 6d 65 6e 74 29 29 3b 0a 20 20 54  increment));.  T
ba30: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
ba40: 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 0a  interp, pRet);..
ba50: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
ba60: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
ba70: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
ba80: 4e 43 52 42 4c 4f 42 0a 0a 73 74 61 74 69 63 20  NCRBLOB..static 
ba90: 69 6e 74 20 62 6c 6f 62 48 61 6e 64 6c 65 46 72  int blobHandleFr
baa0: 6f 6d 4f 62 6a 28 0a 20 20 54 63 6c 5f 49 6e 74  omObj(.  Tcl_Int
bab0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20  erp *interp, .  
bac0: 54 63 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 2c 0a 20  Tcl_Obj *pObj,. 
bad0: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 2a   sqlite3_blob **
bae0: 70 70 42 6c 6f 62 0a 29 7b 0a 20 20 63 68 61 72  ppBlob.){.  char
baf0: 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20   *z;.  int n;.. 
bb00: 20 7a 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69   z = Tcl_GetStri
bb10: 6e 67 46 72 6f 6d 4f 62 6a 28 70 4f 62 6a 2c 20  ngFromObj(pObj, 
bb20: 26 6e 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 30 20  &n);.  if( n==0 
bb30: 29 7b 0a 20 20 20 20 2a 70 70 42 6c 6f 62 20 3d  ){.    *ppBlob =
bb40: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
bb50: 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20   int notUsed;.  
bb60: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68    Tcl_Channel ch
bb70: 61 6e 6e 65 6c 3b 0a 20 20 20 20 43 6c 69 65 6e  annel;.    Clien
bb80: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61  tData instanceDa
bb90: 74 61 3b 0a 20 20 20 20 0a 20 20 20 20 63 68 61  ta;.    .    cha
bba0: 6e 6e 65 6c 20 3d 20 54 63 6c 5f 47 65 74 43 68  nnel = Tcl_GetCh
bbb0: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 7a 2c  annel(interp, z,
bbc0: 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20   &notUsed);.    
bbd0: 69 66 28 20 21 63 68 61 6e 6e 65 6c 20 29 20 72  if( !channel ) r
bbe0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
bbf0: 0a 0a 20 20 20 20 54 63 6c 5f 46 6c 75 73 68 28  ..    Tcl_Flush(
bc00: 63 68 61 6e 6e 65 6c 29 3b 0a 20 20 20 20 54 63  channel);.    Tc
bc10: 6c 5f 53 65 65 6b 28 63 68 61 6e 6e 65 6c 2c 20  l_Seek(channel, 
bc20: 30 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 0a 20  0, SEEK_SET);.. 
bc30: 20 20 20 69 6e 73 74 61 6e 63 65 44 61 74 61 20     instanceData 
bc40: 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  = Tcl_GetChannel
bc50: 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61  InstanceData(cha
bc60: 6e 6e 65 6c 29 3b 0a 20 20 20 20 2a 70 70 42 6c  nnel);.    *ppBl
bc70: 6f 62 20 3d 20 2a 28 28 73 71 6c 69 74 65 33 5f  ob = *((sqlite3_
bc80: 62 6c 6f 62 20 2a 2a 29 69 6e 73 74 61 6e 63 65  blob **)instance
bc90: 44 61 74 61 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  Data);.  }..  re
bca0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
bcb0: 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 62 6c  /*.** sqlite3_bl
bcc0: 6f 62 5f 62 79 74 65 73 20 20 43 48 41 4e 4e 45  ob_bytes  CHANNE
bcd0: 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  L.*/.static int 
bce0: 74 65 73 74 5f 62 6c 6f 62 5f 62 79 74 65 73 28  test_blob_bytes(
bcf0: 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
bd00: 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74  ientData, /* Not
bd10: 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49   used */.  Tcl_I
bd20: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
bd30: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
bd40: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
bd50: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
bd60: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
bd70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
bd80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
bd90: 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
bda0: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
bdb0: 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
bdc0: 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73  uments */.){.  s
bdd0: 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c  qlite3_blob *pBl
bde0: 6f 62 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  ob;.  int nByte;
bdf0: 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  .  .  if( objc!=
be00: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
be10: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
be20: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 43 48 41 4e  , 1, objv, "CHAN
be30: 4e 45 4c 22 29 3b 0a 20 20 20 20 72 65 74 75 72  NEL");.    retur
be40: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
be50: 0a 0a 20 20 69 66 28 20 62 6c 6f 62 48 61 6e 64  ..  if( blobHand
be60: 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  leFromObj(interp
be70: 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 70 42 6c 6f  , objv[1], &pBlo
be80: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
be90: 45 52 52 4f 52 3b 0a 20 20 6e 42 79 74 65 20 3d  ERROR;.  nByte =
bea0: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79   sqlite3_blob_by
beb0: 74 65 73 28 70 42 6c 6f 62 29 3b 0a 20 20 54 63  tes(pBlob);.  Tc
bec0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
bed0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
bee0: 74 4f 62 6a 28 6e 42 79 74 65 29 29 3b 0a 0a 20  tObj(nByte));.. 
bef0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
bf00: 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  }../*.** sqlite3
bf10: 5f 62 6c 6f 62 5f 63 6c 6f 73 65 20 20 43 48 41  _blob_close  CHA
bf20: 4e 4e 45 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 69  NNEL.*/.static i
bf30: 6e 74 20 74 65 73 74 5f 62 6c 6f 62 5f 63 6c 6f  nt test_blob_clo
bf40: 73 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  se(.  ClientData
bf50: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
bf60: 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63  Not used */.  Tc
bf70: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
bf80: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
bf90: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
bfa0: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
bfb0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
bfc0: 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
bfd0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
bfe0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
bff0: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
c000: 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
c010: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
c020: 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a    sqlite3_blob *
c030: 70 42 6c 6f 62 3b 0a 20 20 0a 20 20 69 66 28 20  pBlob;.  .  if( 
c040: 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
c050: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
c060: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
c070: 20 22 43 48 41 4e 4e 45 4c 22 29 3b 0a 20 20 20   "CHANNEL");.   
c080: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
c090: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 6c  R;.  }..  if( bl
c0a0: 6f 62 48 61 6e 64 6c 65 46 72 6f 6d 4f 62 6a 28  obHandleFromObj(
c0b0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
c0c0: 20 26 70 42 6c 6f 62 29 20 29 20 72 65 74 75 72   &pBlob) ) retur
c0d0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73  n TCL_ERROR;.  s
c0e0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73  qlite3_blob_clos
c0f0: 65 28 70 42 6c 6f 62 29 3b 0a 0a 20 20 72 65 74  e(pBlob);..  ret
c100: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
c110: 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 62 6c 6f  *.** sqlite3_blo
c120: 62 5f 72 65 61 64 20 20 43 48 41 4e 4e 45 4c 20  b_read  CHANNEL 
c130: 4f 46 46 53 45 54 20 4e 0a 2a 2a 0a 2a 2a 20 20  OFFSET N.**.**  
c140: 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73   This command is
c150: 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 74 68   used to test th
c160: 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72  e sqlite3_blob_r
c170: 65 61 64 28 29 20 69 6e 20 77 61 79 73 20 74 68  ead() in ways th
c180: 61 74 0a 2a 2a 20 20 20 74 68 65 20 54 63 6c 20  at.**   the Tcl 
c190: 63 68 61 6e 6e 65 6c 20 69 6e 74 65 72 66 61 63  channel interfac
c1a0: 65 20 64 6f 65 73 20 6e 6f 74 2e 20 54 68 65 20  e does not. The 
c1b0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 73  first argument s
c1c0: 68 6f 75 6c 64 0a 2a 2a 20 20 20 62 65 20 74 68  hould.**   be th
c1d0: 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69  e name of a vali
c1e0: 64 20 63 68 61 6e 6e 65 6c 20 63 72 65 61 74 65  d channel create
c1f0: 64 20 62 79 20 74 68 65 20 5b 69 6e 63 72 62 6c  d by the [incrbl
c200: 6f 62 5d 20 6d 65 74 68 6f 64 0a 2a 2a 20 20 20  ob] method.**   
c210: 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 68 61  of a database ha
c220: 6e 64 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74  ndle. This funct
c230: 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74 65  ion calls sqlite
c240: 33 5f 62 6c 6f 62 5f 72 65 61 64 28 29 0a 2a 2a  3_blob_read().**
c250: 20 20 20 74 6f 20 72 65 61 64 20 4e 20 62 79 74     to read N byt
c260: 65 73 20 66 72 6f 6d 20 6f 66 66 73 65 74 20 4f  es from offset O
c270: 46 46 53 45 54 20 66 72 6f 6d 20 74 68 65 20 75  FFSET from the u
c280: 6e 64 65 72 6c 79 69 6e 67 20 53 51 4c 69 74 65  nderlying SQLite
c290: 0a 2a 2a 20 20 20 62 6c 6f 62 20 68 61 6e 64 6c  .**   blob handl
c2a0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4f 6e 20 73 75  e..**.**   On su
c2b0: 63 63 65 73 73 2c 20 61 20 62 79 74 65 2d 61 72  ccess, a byte-ar
c2c0: 72 61 79 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61  ray object conta
c2d0: 69 6e 69 6e 67 20 74 68 65 20 72 65 61 64 20 64  ining the read d
c2e0: 61 74 61 20 69 73 20 0a 2a 2a 20 20 20 72 65 74  ata is .**   ret
c2f0: 75 72 6e 65 64 2e 20 4f 6e 20 66 61 69 6c 75 72  urned. On failur
c300: 65 2c 20 74 68 65 20 69 6e 74 65 72 70 72 65 74  e, the interpret
c310: 65 72 20 72 65 73 75 6c 74 20 69 73 20 73 65 74  er result is set
c320: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 74 65 78   to the.**   tex
c330: 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  t representation
c340: 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   of the returned
c350: 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65   error code (i.e
c360: 2e 20 22 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22  . "SQLITE_NOMEM"
c370: 29 0a 2a 2a 20 20 20 61 6e 64 20 61 20 54 63 6c  ).**   and a Tcl
c380: 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 74 68   exception is th
c390: 72 6f 77 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rown..*/.static 
c3a0: 69 6e 74 20 74 65 73 74 5f 62 6c 6f 62 5f 72 65  int test_blob_re
c3b0: 61 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  ad(.  ClientData
c3c0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
c3d0: 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63  Not used */.  Tc
c3e0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
c3f0: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
c400: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
c410: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
c420: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
c430: 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
c440: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
c450: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
c460: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
c470: 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
c480: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
c490: 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a    sqlite3_blob *
c4a0: 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 6e 42 79  pBlob;.  int nBy
c4b0: 74 65 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65  te;.  int iOffse
c4c0: 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  t;.  unsigned ch
c4d0: 61 72 20 2a 7a 42 75 66 20 3d 20 30 3b 0a 20 20  ar *zBuf = 0;.  
c4e0: 69 6e 74 20 72 63 3b 0a 20 20 0a 20 20 69 66 28  int rc;.  .  if(
c4f0: 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
c500: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
c510: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
c520: 2c 20 22 43 48 41 4e 4e 45 4c 20 4f 46 46 53 45  , "CHANNEL OFFSE
c530: 54 20 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  T N");.    retur
c540: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
c550: 0a 0a 20 20 69 66 28 20 62 6c 6f 62 48 61 6e 64  ..  if( blobHand
c560: 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  leFromObj(interp
c570: 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 70 42 6c 6f  , objv[1], &pBlo
c580: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
c590: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 43 4c  ERROR;.  if( TCL
c5a0: 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46  _OK!=Tcl_GetIntF
c5b0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
c5c0: 62 6a 76 5b 32 5d 2c 20 26 69 4f 66 66 73 65 74  bjv[2], &iOffset
c5d0: 29 0a 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d  ).   || TCL_OK!=
c5e0: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
c5f0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
c600: 5d 2c 20 26 6e 42 79 74 65 29 0a 20 20 29 7b 20  ], &nByte).  ){ 
c610: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
c620: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
c630: 28 20 6e 42 79 74 65 3e 30 20 29 7b 0a 20 20 20  ( nByte>0 ){.   
c640: 20 7a 42 75 66 20 3d 20 28 75 6e 73 69 67 6e 65   zBuf = (unsigne
c650: 64 20 63 68 61 72 20 2a 29 54 63 6c 5f 41 6c 6c  d char *)Tcl_All
c660: 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20  oc(nByte);.  }. 
c670: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c   rc = sqlite3_bl
c680: 6f 62 5f 72 65 61 64 28 70 42 6c 6f 62 2c 20 7a  ob_read(pBlob, z
c690: 42 75 66 2c 20 6e 42 79 74 65 2c 20 69 4f 66 66  Buf, nByte, iOff
c6a0: 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  set);.  if( rc==
c6b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c6c0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
c6d0: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
c6e0: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 7a 42  wByteArrayObj(zB
c6f0: 75 66 2c 20 6e 42 79 74 65 29 29 3b 0a 20 20 7d  uf, nByte));.  }
c700: 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 53 65  else{.    Tcl_Se
c710: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
c720: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 54  (char *)sqlite3T
c730: 65 73 74 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  estErrorName(rc)
c740: 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
c750: 0a 20 20 7d 0a 20 20 54 63 6c 5f 46 72 65 65 28  .  }.  Tcl_Free(
c760: 28 63 68 61 72 20 2a 29 7a 42 75 66 29 3b 0a 0a  (char *)zBuf);..
c770: 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
c780: 4c 49 54 45 5f 4f 4b 20 3f 20 54 43 4c 5f 4f 4b  LITE_OK ? TCL_OK
c790: 20 3a 20 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 7d   : TCL_ERROR);.}
c7a0: 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  ../*.** sqlite3_
c7b0: 62 6c 6f 62 5f 77 72 69 74 65 20 43 48 41 4e 4e  blob_write CHANN
c7c0: 45 4c 20 4f 46 46 53 45 54 20 44 41 54 41 20 3f  EL OFFSET DATA ?
c7d0: 4e 44 41 54 41 3f 0a 2a 2a 0a 2a 2a 20 20 20 54  NDATA?.**.**   T
c7e0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75  his command is u
c7f0: 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 65 20  sed to test the 
c800: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69  sqlite3_blob_wri
c810: 74 65 28 29 20 69 6e 20 77 61 79 73 20 74 68 61  te() in ways tha
c820: 74 0a 2a 2a 20 20 20 74 68 65 20 54 63 6c 20 63  t.**   the Tcl c
c830: 68 61 6e 6e 65 6c 20 69 6e 74 65 72 66 61 63 65  hannel interface
c840: 20 64 6f 65 73 20 6e 6f 74 2e 20 54 68 65 20 66   does not. The f
c850: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 73 68  irst argument sh
c860: 6f 75 6c 64 0a 2a 2a 20 20 20 62 65 20 74 68 65  ould.**   be the
c870: 20 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64   name of a valid
c880: 20 63 68 61 6e 6e 65 6c 20 63 72 65 61 74 65 64   channel created
c890: 20 62 79 20 74 68 65 20 5b 69 6e 63 72 62 6c 6f   by the [incrblo
c8a0: 62 5d 20 6d 65 74 68 6f 64 0a 2a 2a 20 20 20 6f  b] method.**   o
c8b0: 66 20 61 20 64 61 74 61 62 61 73 65 20 68 61 6e  f a database han
c8c0: 64 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  dle. This functi
c8d0: 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33  on calls sqlite3
c8e0: 5f 62 6c 6f 62 5f 77 72 69 74 65 28 29 0a 2a 2a  _blob_write().**
c8f0: 20 20 20 74 6f 20 77 72 69 74 65 20 74 68 65 20     to write the 
c900: 44 41 54 41 20 62 79 74 65 2d 61 72 72 61 79 20  DATA byte-array 
c910: 74 6f 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  to the underlyin
c920: 67 20 53 51 4c 69 74 65 20 62 6c 6f 62 20 68 61  g SQLite blob ha
c930: 6e 64 6c 65 2e 0a 2a 2a 20 20 20 61 74 20 6f 66  ndle..**   at of
c940: 66 73 65 74 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a  fset OFFSET..**.
c950: 2a 2a 20 20 20 4f 6e 20 73 75 63 63 65 73 73 2c  **   On success,
c960: 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
c970: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 6e   is returned. On
c980: 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 69 6e   failure, the in
c990: 74 65 72 70 72 65 74 65 72 0a 2a 2a 20 20 20 72  terpreter.**   r
c9a0: 65 73 75 6c 74 20 69 73 20 73 65 74 20 74 6f 20  esult is set to 
c9b0: 74 68 65 20 74 65 78 74 20 72 65 70 72 65 73 65  the text represe
c9c0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 72  ntation of the r
c9d0: 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 63 6f  eturned error co
c9e0: 64 65 20 0a 2a 2a 20 20 20 28 69 2e 65 2e 20 22  de .**   (i.e. "
c9f0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 29 20 61  SQLITE_NOMEM") a
ca00: 6e 64 20 61 20 54 63 6c 20 65 78 63 65 70 74 69  nd a Tcl excepti
ca10: 6f 6e 20 69 73 20 74 68 72 6f 77 6e 2e 0a 2a 2f  on is thrown..*/
ca20: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
ca30: 5f 62 6c 6f 62 5f 77 72 69 74 65 28 0a 20 20 43  _blob_write(.  C
ca40: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
ca50: 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65  Data, /* Not use
ca60: 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  d */.  Tcl_Inter
ca70: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
ca80: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
ca90: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
caa0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
cab0: 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
cac0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
cad0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
cae0: 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
caf0: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
cb00: 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
cb10: 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
cb20: 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a  e3_blob *pBlob;.
cb30: 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20    int iOffset;. 
cb40: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 75 6e 73 69   int rc;..  unsi
cb50: 67 6e 65 64 20 63 68 61 72 20 2a 7a 42 75 66 3b  gned char *zBuf;
cb60: 0a 20 20 69 6e 74 20 6e 42 75 66 3b 0a 20 20 0a  .  int nBuf;.  .
cb70: 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 26 26    if( objc!=4 &&
cb80: 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20   objc!=5 ){.    
cb90: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
cba0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
cbb0: 2c 20 22 43 48 41 4e 4e 45 4c 20 4f 46 46 53 45  , "CHANNEL OFFSE
cbc0: 54 20 44 41 54 41 20 3f 4e 44 41 54 41 3f 22 29  T DATA ?NDATA?")
cbd0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
cbe0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
cbf0: 66 28 20 62 6c 6f 62 48 61 6e 64 6c 65 46 72 6f  f( blobHandleFro
cc00: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
cc10: 76 5b 31 5d 2c 20 26 70 42 6c 6f 62 29 20 29 20  v[1], &pBlob) ) 
cc20: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
cc30: 3b 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d  ;.  if( TCL_OK!=
cc40: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
cc50: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
cc60: 5d 2c 20 26 69 4f 66 66 73 65 74 29 20 29 7b 20  ], &iOffset) ){ 
cc70: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
cc80: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 42  ERROR;.  }..  zB
cc90: 75 66 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65  uf = Tcl_GetByte
cca0: 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a  ArrayFromObj(obj
ccb0: 76 5b 33 5d 2c 20 26 6e 42 75 66 29 3b 0a 20 20  v[3], &nBuf);.  
ccc0: 69 66 28 20 6f 62 6a 63 3d 3d 35 20 26 26 20 54  if( objc==5 && T
ccd0: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
cce0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d  (interp, objv[4]
ccf0: 2c 20 26 6e 42 75 66 29 20 29 7b 0a 20 20 20 20  , &nBuf) ){.    
cd00: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
cd10: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
cd20: 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28  ite3_blob_write(
cd30: 70 42 6c 6f 62 2c 20 7a 42 75 66 2c 20 6e 42 75  pBlob, zBuf, nBu
cd40: 66 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 69  f, iOffset);.  i
cd50: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
cd60: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52   ){.    Tcl_SetR
cd70: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
cd80: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 54 65 73  har *)sqlite3Tes
cd90: 74 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  tErrorName(rc), 
cda0: 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20  TCL_VOLATILE);. 
cdb0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63   }..  return (rc
cdc0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 43  ==SQLITE_OK ? TC
cdd0: 4c 5f 4f 4b 20 3a 20 54 43 4c 5f 45 52 52 4f 52  L_OK : TCL_ERROR
cde0: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
cdf0: 20 74 65 73 74 5f 62 6c 6f 62 5f 72 65 6f 70 65   test_blob_reope
ce00: 6e 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  n(.  ClientData 
ce10: 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e  clientData, /* N
ce20: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c  ot used */.  Tcl
ce30: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
ce40: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
ce50: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
ce60: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
ce70: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
ce80: 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
ce90: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
cea0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
ceb0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
cec0: 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
ced0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
cee0: 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 69 52 6f   Tcl_WideInt iRo
cef0: 77 69 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  wid;.  sqlite3_b
cf00: 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e  lob *pBlob;.  in
cf10: 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
cf20: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
cf30: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
cf40: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 43  erp, 1, objv, "C
cf50: 48 41 4e 4e 45 4c 20 52 4f 57 49 44 22 29 3b 0a  HANNEL ROWID");.
cf60: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
cf70: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
cf80: 20 62 6c 6f 62 48 61 6e 64 6c 65 46 72 6f 6d 4f   blobHandleFromO
cf90: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
cfa0: 31 5d 2c 20 26 70 42 6c 6f 62 29 20 29 20 72 65  1], &pBlob) ) re
cfb0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
cfc0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 57 69 64    if( Tcl_GetWid
cfd0: 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  eIntFromObj(inte
cfe0: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 52  rp, objv[2], &iR
cff0: 6f 77 69 64 29 20 29 20 72 65 74 75 72 6e 20 54  owid) ) return T
d000: 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
d010: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72  = sqlite3_blob_r
d020: 65 6f 70 65 6e 28 70 42 6c 6f 62 2c 20 69 52 6f  eopen(pBlob, iRo
d030: 77 69 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  wid);.  if( rc!=
d040: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d050: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
d060: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73  nterp, (char *)s
d070: 71 6c 69 74 65 33 54 65 73 74 45 72 72 6f 72 4e  qlite3TestErrorN
d080: 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 56 4f 4c  ame(rc), TCL_VOL
d090: 41 54 49 4c 45 29 3b 0a 20 20 7d 0a 0a 20 20 72  ATILE);.  }..  r
d0a0: 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
d0b0: 45 5f 4f 4b 20 3f 20 54 43 4c 5f 4f 4b 20 3a 20  E_OK ? TCL_OK : 
d0c0: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 7d 0a 0a 23  TCL_ERROR);.}..#
d0d0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  endif../*.** Usa
d0e0: 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 72 65 61  ge: sqlite3_crea
d0f0: 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 20  te_collation_v2 
d100: 44 42 2d 48 41 4e 44 4c 45 20 4e 41 4d 45 20 43  DB-HANDLE NAME C
d110: 4d 50 2d 50 52 4f 43 20 44 45 4c 2d 50 52 4f 43  MP-PROC DEL-PROC
d120: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 54 63  .**.**   This Tc
d130: 6c 20 70 72 6f 63 20 69 73 20 75 73 65 64 20 66  l proc is used f
d140: 6f 72 20 74 65 73 74 69 6e 67 20 74 68 65 20 65  or testing the e
d150: 78 70 65 72 69 6d 65 6e 74 61 6c 0a 2a 2a 20 20  xperimental.**  
d160: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
d170: 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 29 20 69  collation_v2() i
d180: 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 72  nterface..*/.str
d190: 75 63 74 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f  uct TestCollatio
d1a0: 6e 58 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  nX {.  Tcl_Inter
d1b0: 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c  p *interp;.  Tcl
d1c0: 5f 4f 62 6a 20 2a 70 43 6d 70 3b 0a 20 20 54 63  _Obj *pCmp;.  Tc
d1d0: 6c 5f 4f 62 6a 20 2a 70 44 65 6c 3b 0a 7d 3b 0a  l_Obj *pDel;.};.
d1e0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 54  typedef struct T
d1f0: 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 54 65  estCollationX Te
d200: 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 3b 0a 73 74  stCollationX;.st
d210: 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 43 72  atic void testCr
d220: 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c  eateCollationDel
d230: 28 76 6f 69 64 20 2a 70 43 74 78 29 7b 0a 20 20  (void *pCtx){.  
d240: 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a  TestCollationX *
d250: 70 20 3d 20 28 54 65 73 74 43 6f 6c 6c 61 74 69  p = (TestCollati
d260: 6f 6e 58 20 2a 29 70 43 74 78 3b 0a 0a 20 20 69  onX *)pCtx;..  i
d270: 6e 74 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c  nt rc = Tcl_Eval
d280: 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c  ObjEx(p->interp,
d290: 20 70 2d 3e 70 44 65 6c 2c 20 54 43 4c 5f 45 56   p->pDel, TCL_EV
d2a0: 41 4c 5f 44 49 52 45 43 54 7c 54 43 4c 5f 45 56  AL_DIRECT|TCL_EV
d2b0: 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 69 66  AL_GLOBAL);.  if
d2c0: 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a  ( rc!=TCL_OK ){.
d2d0: 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75      Tcl_Backgrou
d2e0: 6e 64 45 72 72 6f 72 28 70 2d 3e 69 6e 74 65 72  ndError(p->inter
d2f0: 70 29 3b 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 44  p);.  }..  Tcl_D
d300: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70  ecrRefCount(p->p
d310: 43 6d 70 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72  Cmp);.  Tcl_Decr
d320: 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 44 65 6c  RefCount(p->pDel
d330: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
d340: 65 28 28 76 6f 69 64 20 2a 29 70 29 3b 0a 7d 0a  e((void *)p);.}.
d350: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 43  static int testC
d360: 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 43 6d  reateCollationCm
d370: 70 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  p(.  void *pCtx,
d380: 0a 20 20 69 6e 74 20 6e 4c 65 66 74 2c 0a 20 20  .  int nLeft,.  
d390: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4c 65 66  const void *zLef
d3a0: 74 2c 0a 20 20 69 6e 74 20 6e 52 69 67 68 74 2c  t,.  int nRight,
d3b0: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
d3c0: 52 69 67 68 74 0a 29 7b 0a 20 20 54 65 73 74 43  Right.){.  TestC
d3d0: 6f 6c 6c 61 74 69 6f 6e 58 20 2a 70 20 3d 20 28  ollationX *p = (
d3e0: 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a  TestCollationX *
d3f0: 29 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a  )pCtx;.  Tcl_Obj
d400: 20 2a 70 53 63 72 69 70 74 20 3d 20 54 63 6c 5f   *pScript = Tcl_
d410: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d 3e  DuplicateObj(p->
d420: 70 43 6d 70 29 3b 0a 20 20 69 6e 74 20 69 52 65  pCmp);.  int iRe
d430: 73 20 3d 20 30 3b 0a 0a 20 20 54 63 6c 5f 49 6e  s = 0;..  Tcl_In
d440: 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69  crRefCount(pScri
d450: 70 74 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  pt);.  Tcl_ListO
d460: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
d470: 30 2c 20 70 53 63 72 69 70 74 2c 20 54 63 6c 5f  0, pScript, Tcl_
d480: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68  NewStringObj((ch
d490: 61 72 20 2a 29 7a 4c 65 66 74 2c 20 6e 4c 65 66  ar *)zLeft, nLef
d4a0: 74 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  t));.  Tcl_ListO
d4b0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
d4c0: 30 2c 20 70 53 63 72 69 70 74 2c 20 54 63 6c 5f  0, pScript, Tcl_
d4d0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68  NewStringObj((ch
d4e0: 61 72 20 2a 29 7a 52 69 67 68 74 2c 6e 52 69 67  ar *)zRight,nRig
d4f0: 68 74 29 29 3b 0a 0a 20 20 69 66 28 20 54 43 4c  ht));..  if( TCL
d500: 5f 4f 4b 21 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a  _OK!=Tcl_EvalObj
d510: 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 53  Ex(p->interp, pS
d520: 63 72 69 70 74 2c 20 54 43 4c 5f 45 56 41 4c 5f  cript, TCL_EVAL_
d530: 44 49 52 45 43 54 7c 54 43 4c 5f 45 56 41 4c 5f  DIRECT|TCL_EVAL_
d540: 47 4c 4f 42 41 4c 29 0a 20 20 20 7c 7c 20 54 43  GLOBAL).   || TC
d550: 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74  L_OK!=Tcl_GetInt
d560: 46 72 6f 6d 4f 62 6a 28 70 2d 3e 69 6e 74 65 72  FromObj(p->inter
d570: 70 2c 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73  p, Tcl_GetObjRes
d580: 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20  ult(p->interp), 
d590: 26 69 52 65 73 29 0a 20 20 29 7b 0a 20 20 20 20  &iRes).  ){.    
d5a0: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72  Tcl_BackgroundEr
d5b0: 72 6f 72 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a  ror(p->interp);.
d5c0: 20 20 7d 0a 20 20 54 63 6c 5f 44 65 63 72 52 65    }.  Tcl_DecrRe
d5d0: 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b  fCount(pScript);
d5e0: 0a 0a 20 20 72 65 74 75 72 6e 20 69 52 65 73 3b  ..  return iRes;
d5f0: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  .}.static int te
d600: 73 74 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  st_create_collat
d610: 69 6f 6e 5f 76 32 28 0a 20 20 43 6c 69 65 6e 74  ion_v2(.  Client
d620: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
d630: 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a   /* Not used */.
d640: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
d650: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
d660: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
d670: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
d680: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
d690: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
d6a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
d6b0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
d6c0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
d6d0: 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
d6e0: 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
d6f0: 0a 29 7b 0a 20 20 54 65 73 74 43 6f 6c 6c 61 74  .){.  TestCollat
d700: 69 6f 6e 58 20 2a 70 3b 0a 20 20 73 71 6c 69 74  ionX *p;.  sqlit
d710: 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
d720: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35  ;..  if( objc!=5
d730: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
d740: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
d750: 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 2d 48 41   1, objv, "DB-HA
d760: 4e 44 4c 45 20 4e 41 4d 45 20 43 4d 50 2d 50 52  NDLE NAME CMP-PR
d770: 4f 43 20 44 45 4c 2d 50 52 4f 43 22 29 3b 0a 20  OC DEL-PROC");. 
d780: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
d790: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
d7a0: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
d7b0: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
d7c0: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
d7d0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
d7e0: 52 4f 52 3b 0a 0a 20 20 70 20 3d 20 28 54 65 73  ROR;..  p = (Tes
d7f0: 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 29 73 71  tCollationX *)sq
d800: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
d810: 65 6f 66 28 54 65 73 74 43 6f 6c 6c 61 74 69 6f  eof(TestCollatio
d820: 6e 58 29 29 3b 0a 20 20 70 2d 3e 70 43 6d 70 20  nX));.  p->pCmp 
d830: 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 70 2d 3e  = objv[3];.  p->
d840: 70 44 65 6c 20 3d 20 6f 62 6a 76 5b 34 5d 3b 0a  pDel = objv[4];.
d850: 20 20 70 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e    p->interp = in
d860: 74 65 72 70 3b 0a 20 20 54 63 6c 5f 49 6e 63 72  terp;.  Tcl_Incr
d870: 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 43 6d 70  RefCount(p->pCmp
d880: 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
d890: 43 6f 75 6e 74 28 70 2d 3e 70 44 65 6c 29 3b 0a  Count(p->pDel);.
d8a0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
d8b0: 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
d8c0: 5f 76 32 28 64 62 2c 20 54 63 6c 5f 47 65 74 53  _v2(db, Tcl_GetS
d8d0: 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20  tring(objv[2]), 
d8e0: 31 36 2c 20 0a 20 20 20 20 20 20 28 76 6f 69 64  16, .      (void
d8f0: 20 2a 29 70 2c 20 74 65 73 74 43 72 65 61 74 65   *)p, testCreate
d900: 43 6f 6c 6c 61 74 69 6f 6e 43 6d 70 2c 20 74 65  CollationCmp, te
d910: 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f  stCreateCollatio
d920: 6e 44 65 6c 0a 20 20 29 3b 0a 20 20 69 66 28 20  nDel.  );.  if( 
d930: 72 63 21 3d 53 51 4c 49 54 45 5f 4d 49 53 55 53  rc!=SQLITE_MISUS
d940: 45 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  E ){.    Tcl_App
d950: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
d960: 2c 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74  , "sqlite3_creat
d970: 65 5f 63 6f 6c 6c 61 74 65 5f 76 32 28 29 20 66  e_collate_v2() f
d980: 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20  ailed to detect 
d990: 22 0a 20 20 20 20 20 20 22 61 6e 20 69 6e 76 61  ".      "an inva
d9a0: 6c 69 64 20 65 6e 63 6f 64 69 6e 67 22 2c 20 28  lid encoding", (
d9b0: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65  char*)0);.    re
d9c0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d9d0: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
d9e0: 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
d9f0: 69 6f 6e 5f 76 32 28 64 62 2c 20 54 63 6c 5f 47  ion_v2(db, Tcl_G
da00: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
da10: 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  ), SQLITE_UTF8, 
da20: 0a 20 20 20 20 20 20 28 76 6f 69 64 20 2a 29 70  .      (void *)p
da30: 2c 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c  , testCreateColl
da40: 61 74 69 6f 6e 43 6d 70 2c 20 74 65 73 74 43 72  ationCmp, testCr
da50: 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c  eateCollationDel
da60: 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  .  );.  return T
da70: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
da80: 55 53 41 47 45 3a 20 73 71 6c 69 74 65 33 5f 63  USAGE: sqlite3_c
da90: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
daa0: 32 20 44 42 20 4e 41 4d 45 20 4e 41 52 47 20 45  2 DB NAME NARG E
dab0: 4e 43 20 3f 53 57 49 54 43 48 45 53 3f 0a 2a 2a  NC ?SWITCHES?.**
dac0: 0a 2a 2a 20 41 76 61 69 6c 61 62 6c 65 20 73 77  .** Available sw
dad0: 69 74 63 68 65 73 20 61 72 65 3a 0a 2a 2a 0a 2a  itches are:.**.*
dae0: 2a 20 20 20 2d 66 75 6e 63 20 20 20 20 53 43 52  *   -func    SCR
daf0: 49 50 54 0a 2a 2a 20 20 20 2d 73 74 65 70 20 20  IPT.**   -step  
db00: 20 20 53 43 52 49 50 54 0a 2a 2a 20 20 20 2d 66    SCRIPT.**   -f
db10: 69 6e 61 6c 20 20 20 53 43 52 49 50 54 0a 2a 2a  inal   SCRIPT.**
db20: 20 20 20 2d 64 65 73 74 72 6f 79 20 53 43 52 49     -destroy SCRI
db30: 50 54 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  PT.*/.typedef st
db40: 72 75 63 74 20 43 72 65 61 74 65 46 75 6e 63 74  ruct CreateFunct
db50: 69 6f 6e 56 32 20 43 72 65 61 74 65 46 75 6e 63  ionV2 CreateFunc
db60: 74 69 6f 6e 56 32 3b 0a 73 74 72 75 63 74 20 43  tionV2;.struct C
db70: 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 20  reateFunctionV2 
db80: 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  {.  Tcl_Interp *
db90: 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62  interp;.  Tcl_Ob
dba0: 6a 20 2a 70 46 75 6e 63 3b 20 20 20 20 20 20 20  j *pFunc;       
dbb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63 72            /* Scr
dbc0: 69 70 74 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e  ipt for function
dbd0: 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20   invocation */. 
dbe0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 74 65 70 3b   Tcl_Obj *pStep;
dbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc00: 20 2f 2a 20 53 63 72 69 70 74 20 66 6f 72 20 61   /* Script for a
dc10: 67 67 2e 20 73 74 65 70 20 69 6e 76 6f 63 61 74  gg. step invocat
dc20: 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  ion */.  Tcl_Obj
dc30: 20 2a 70 46 69 6e 61 6c 3b 20 20 20 20 20 20 20   *pFinal;       
dc40: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63 72 69           /* Scri
dc50: 70 74 20 66 6f 72 20 61 67 67 2e 20 66 69 6e 61  pt for agg. fina
dc60: 6c 69 7a 61 74 69 6f 6e 20 69 6e 76 6f 63 61 74  lization invocat
dc70: 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  ion */.  Tcl_Obj
dc80: 20 2a 70 44 65 73 74 72 6f 79 3b 20 20 20 20 20   *pDestroy;     
dc90: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74           /* Dest
dca0: 72 75 63 74 6f 72 20 73 63 72 69 70 74 20 2a 2f  ructor script */
dcb0: 0a 7d 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .};.static void 
dcc0: 63 66 32 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  cf2Func(sqlite3_
dcd0: 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 69 6e  context *ctx, in
dce0: 74 20 6e 41 72 67 2c 20 73 71 6c 69 74 65 33 5f  t nArg, sqlite3_
dcf0: 76 61 6c 75 65 20 2a 2a 61 41 72 67 29 7b 0a 7d  value **aArg){.}
dd00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 66 32  .static void cf2
dd10: 53 74 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Step(sqlite3_con
dd20: 74 65 78 74 20 2a 63 74 78 2c 20 69 6e 74 20 6e  text *ctx, int n
dd30: 41 72 67 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  Arg, sqlite3_val
dd40: 75 65 20 2a 2a 61 41 72 67 29 7b 0a 7d 0a 73 74  ue **aArg){.}.st
dd50: 61 74 69 63 20 76 6f 69 64 20 63 66 32 46 69 6e  atic void cf2Fin
dd60: 61 6c 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  al(sqlite3_conte
dd70: 78 74 20 2a 63 74 78 29 7b 0a 7d 0a 73 74 61 74  xt *ctx){.}.stat
dd80: 69 63 20 76 6f 69 64 20 63 66 32 44 65 73 74 72  ic void cf2Destr
dd90: 6f 79 28 76 6f 69 64 20 2a 70 55 73 65 72 29 7b  oy(void *pUser){
dda0: 0a 20 20 43 72 65 61 74 65 46 75 6e 63 74 69 6f  .  CreateFunctio
ddb0: 6e 56 32 20 2a 70 20 3d 20 28 43 72 65 61 74 65  nV2 *p = (Create
ddc0: 46 75 6e 63 74 69 6f 6e 56 32 20 2a 29 70 55 73  FunctionV2 *)pUs
ddd0: 65 72 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e  er;..  if( p->in
dde0: 74 65 72 70 20 26 26 20 70 2d 3e 70 44 65 73 74  terp && p->pDest
ddf0: 72 6f 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  roy ){.    int r
de00: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  c = Tcl_EvalObjE
de10: 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e  x(p->interp, p->
de20: 70 44 65 73 74 72 6f 79 2c 20 30 29 3b 0a 20 20  pDestroy, 0);.  
de30: 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b    if( rc!=TCL_OK
de40: 20 29 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e   ) Tcl_Backgroun
de50: 64 45 72 72 6f 72 28 70 2d 3e 69 6e 74 65 72 70  dError(p->interp
de60: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d  );.  }..  if( p-
de70: 3e 70 46 75 6e 63 20 29 20 54 63 6c 5f 44 65 63  >pFunc ) Tcl_Dec
de80: 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 46 75  rRefCount(p->pFu
de90: 6e 63 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70  nc); .  if( p->p
dea0: 53 74 65 70 20 29 20 54 63 6c 5f 44 65 63 72 52  Step ) Tcl_DecrR
deb0: 65 66 43 6f 75 6e 74 28 70 2d 3e 70 53 74 65 70  efCount(p->pStep
dec0: 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 46 69  ); .  if( p->pFi
ded0: 6e 61 6c 20 29 20 54 63 6c 5f 44 65 63 72 52 65  nal ) Tcl_DecrRe
dee0: 66 43 6f 75 6e 74 28 70 2d 3e 70 46 69 6e 61 6c  fCount(p->pFinal
def0: 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 44 65  ); .  if( p->pDe
df00: 73 74 72 6f 79 20 29 20 54 63 6c 5f 44 65 63 72  stroy ) Tcl_Decr
df10: 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 44 65 73  RefCount(p->pDes
df20: 74 72 6f 79 29 3b 20 0a 20 20 73 71 6c 69 74 65  troy); .  sqlite
df30: 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 73 74 61  3_free(p);.}.sta
df40: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 72 65  tic int test_cre
df50: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28  ate_function_v2(
df60: 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
df70: 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20 20 20  ientData,       
df80: 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a     /* Not used *
df90: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
dfa0: 69 6e 74 65 72 70 2c 20 20 20 20 20 20 20 20 20  interp,         
dfb0: 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 76 6f 6b      /* The invok
dfc0: 69 6e 67 20 54 43 4c 20 69 6e 74 65 72 70 72 65  ing TCL interpre
dfd0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  ter */.  int obj
dfe0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
dff0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
e000: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
e010: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
e020: 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 20 20 20 20  NST objv[]      
e030: 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20       /* Command 
e040: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
e050: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
e060: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
e070: 6e 63 3b 0a 20 20 69 6e 74 20 6e 41 72 67 3b 0a  nc;.  int nArg;.
e080: 20 20 69 6e 74 20 65 6e 63 3b 0a 20 20 43 72 65    int enc;.  Cre
e090: 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 20 2a 70  ateFunctionV2 *p
e0a0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
e0b0: 20 72 63 3b 0a 0a 20 20 73 74 72 75 63 74 20 45   rc;..  struct E
e0c0: 6e 63 54 61 62 6c 65 20 7b 0a 20 20 20 20 63 6f  ncTable {.    co
e0d0: 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 63 3b 0a  nst char *zEnc;.
e0e0: 20 20 20 20 69 6e 74 20 65 6e 63 3b 0a 20 20 7d      int enc;.  }
e0f0: 20 61 45 6e 63 5b 5d 20 3d 20 7b 0a 20 20 20 20   aEnc[] = {.    
e100: 7b 22 75 74 66 38 22 2c 20 20 20 20 53 51 4c 49  {"utf8",    SQLI
e110: 54 45 5f 55 54 46 38 20 7d 2c 0a 20 20 20 20 7b  TE_UTF8 },.    {
e120: 22 75 74 66 31 36 22 2c 20 20 20 53 51 4c 49 54  "utf16",   SQLIT
e130: 45 5f 55 54 46 31 36 20 7d 2c 0a 20 20 20 20 7b  E_UTF16 },.    {
e140: 22 75 74 66 31 36 6c 65 22 2c 20 53 51 4c 49 54  "utf16le", SQLIT
e150: 45 5f 55 54 46 31 36 4c 45 20 7d 2c 0a 20 20 20  E_UTF16LE },.   
e160: 20 7b 22 75 74 66 31 36 62 65 22 2c 20 53 51 4c   {"utf16be", SQL
e170: 49 54 45 5f 55 54 46 31 36 42 45 20 7d 2c 0a 20  ITE_UTF16BE },. 
e180: 20 20 20 7b 22 61 6e 79 22 2c 20 20 20 20 20 53     {"any",     S
e190: 51 4c 49 54 45 5f 41 4e 59 20 7d 2c 0a 20 20 20  QLITE_ANY },.   
e1a0: 20 7b 22 30 22 2c 20 30 20 7d 0a 20 20 7d 3b 0a   {"0", 0 }.  };.
e1b0: 0a 20 20 69 66 28 20 6f 62 6a 63 3c 35 20 7c 7c  .  if( objc<5 ||
e1c0: 20 28 6f 62 6a 63 25 32 29 3d 3d 30 20 29 7b 0a   (objc%2)==0 ){.
e1d0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
e1e0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
e1f0: 6f 62 6a 76 2c 20 22 44 42 20 4e 41 4d 45 20 4e  objv, "DB NAME N
e200: 41 52 47 20 45 4e 43 20 53 57 49 54 43 48 45 53  ARG ENC SWITCHES
e210: 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ...");.    retur
e220: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
e230: 0a 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  ..  if( getDbPoi
e240: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
e250: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
e260: 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
e270: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
e280: 7a 46 75 6e 63 20 3d 20 54 63 6c 5f 47 65 74 53  zFunc = Tcl_GetS
e290: 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
e2a0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
e2b0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
e2c0: 6f 62 6a 76 5b 33 5d 2c 20 26 6e 41 72 67 29 20  objv[3], &nArg) 
e2d0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
e2e0: 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
e2f0: 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 53 74 72  tIndexFromObjStr
e300: 75 63 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  uct(interp, objv
e310: 5b 34 5d 2c 20 61 45 6e 63 2c 20 73 69 7a 65 6f  [4], aEnc, sizeo
e320: 66 28 61 45 6e 63 5b 30 5d 29 2c 20 0a 20 20 20  f(aEnc[0]), .   
e330: 20 20 20 20 20 20 20 22 65 6e 63 6f 64 69 6e 67         "encoding
e340: 22 2c 20 30 2c 20 26 65 6e 63 29 0a 20 20 29 7b  ", 0, &enc).  ){
e350: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
e360: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 65 6e 63  ERROR;.  }.  enc
e370: 20 3d 20 61 45 6e 63 5b 65 6e 63 5d 2e 65 6e 63   = aEnc[enc].enc
e380: 3b 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  ;..  p = sqlite3
e390: 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 43  _malloc(sizeof(C
e3a0: 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 29  reateFunctionV2)
e3b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 20 29  );.  assert( p )
e3c0: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  ;.  memset(p, 0,
e3d0: 20 73 69 7a 65 6f 66 28 43 72 65 61 74 65 46 75   sizeof(CreateFu
e3e0: 6e 63 74 69 6f 6e 56 32 29 29 3b 0a 20 20 70 2d  nctionV2));.  p-
e3f0: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
e400: 3b 0a 0a 20 20 66 6f 72 28 69 3d 35 3b 20 69 3c  ;..  for(i=5; i<
e410: 6f 62 6a 63 3b 20 69 2b 3d 32 29 7b 0a 20 20 20  objc; i+=2){.   
e420: 20 69 6e 74 20 69 53 77 69 74 63 68 3b 0a 20 20   int iSwitch;.  
e430: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a    const char *az
e440: 53 77 69 74 63 68 5b 5d 20 3d 20 7b 22 2d 66 75  Switch[] = {"-fu
e450: 6e 63 22 2c 20 22 2d 73 74 65 70 22 2c 20 22 2d  nc", "-step", "-
e460: 66 69 6e 61 6c 22 2c 20 22 2d 64 65 73 74 72 6f  final", "-destro
e470: 79 22 2c 20 30 7d 3b 0a 20 20 20 20 69 66 28 20  y", 0};.    if( 
e480: 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
e490: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
e4a0: 5b 69 5d 2c 20 61 7a 53 77 69 74 63 68 2c 20 22  [i], azSwitch, "
e4b0: 73 77 69 74 63 68 22 2c 20 30 2c 20 26 69 53 77  switch", 0, &iSw
e4c0: 69 74 63 68 29 20 29 7b 0a 20 20 20 20 20 20 73  itch) ){.      s
e4d0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
e4e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
e4f0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
e500: 20 20 20 73 77 69 74 63 68 28 20 69 53 77 69 74     switch( iSwit
e510: 63 68 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  ch ){.      case
e520: 20 30 3a 20 70 2d 3e 70 46 75 6e 63 20 3d 20 6f   0: p->pFunc = o
e530: 62 6a 76 5b 69 2b 31 5d 3b 20 20 20 20 20 20 62  bjv[i+1];      b
e540: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
e550: 20 31 3a 20 70 2d 3e 70 53 74 65 70 20 3d 20 6f   1: p->pStep = o
e560: 62 6a 76 5b 69 2b 31 5d 3b 20 20 20 20 20 20 62  bjv[i+1];      b
e570: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
e580: 20 32 3a 20 70 2d 3e 70 46 69 6e 61 6c 20 3d 20   2: p->pFinal = 
e590: 6f 62 6a 76 5b 69 2b 31 5d 3b 20 20 20 20 20 62  objv[i+1];     b
e5a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
e5b0: 20 33 3a 20 70 2d 3e 70 44 65 73 74 72 6f 79 20   3: p->pDestroy 
e5c0: 3d 20 6f 62 6a 76 5b 69 2b 31 5d 3b 20 20 20 62  = objv[i+1];   b
e5d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
e5e0: 20 20 69 66 28 20 70 2d 3e 70 46 75 6e 63 20 29    if( p->pFunc )
e5f0: 20 70 2d 3e 70 46 75 6e 63 20 3d 20 54 63 6c 5f   p->pFunc = Tcl_
e600: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d 3e  DuplicateObj(p->
e610: 70 46 75 6e 63 29 3b 20 0a 20 20 69 66 28 20 70  pFunc); .  if( p
e620: 2d 3e 70 53 74 65 70 20 29 20 70 2d 3e 70 53 74  ->pStep ) p->pSt
e630: 65 70 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  ep = Tcl_Duplica
e640: 74 65 4f 62 6a 28 70 2d 3e 70 53 74 65 70 29 3b  teObj(p->pStep);
e650: 20 0a 20 20 69 66 28 20 70 2d 3e 70 46 69 6e 61   .  if( p->pFina
e660: 6c 20 29 20 70 2d 3e 70 46 69 6e 61 6c 20 3d 20  l ) p->pFinal = 
e670: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
e680: 28 70 2d 3e 70 46 69 6e 61 6c 29 3b 20 0a 20 20  (p->pFinal); .  
e690: 69 66 28 20 70 2d 3e 70 44 65 73 74 72 6f 79 20  if( p->pDestroy 
e6a0: 29 20 70 2d 3e 70 44 65 73 74 72 6f 79 20 3d 20  ) p->pDestroy = 
e6b0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
e6c0: 28 70 2d 3e 70 44 65 73 74 72 6f 79 29 3b 20 0a  (p->pDestroy); .
e6d0: 0a 20 20 69 66 28 20 70 2d 3e 70 46 75 6e 63 20  .  if( p->pFunc 
e6e0: 29 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75  ) Tcl_IncrRefCou
e6f0: 6e 74 28 70 2d 3e 70 46 75 6e 63 29 3b 20 0a 20  nt(p->pFunc); . 
e700: 20 69 66 28 20 70 2d 3e 70 53 74 65 70 20 29 20   if( p->pStep ) 
e710: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
e720: 28 70 2d 3e 70 53 74 65 70 29 3b 20 0a 20 20 69  (p->pStep); .  i
e730: 66 28 20 70 2d 3e 70 46 69 6e 61 6c 20 29 20 54  f( p->pFinal ) T
e740: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
e750: 70 2d 3e 70 46 69 6e 61 6c 29 3b 20 0a 20 20 69  p->pFinal); .  i
e760: 66 28 20 70 2d 3e 70 44 65 73 74 72 6f 79 20 29  f( p->pDestroy )
e770: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
e780: 74 28 70 2d 3e 70 44 65 73 74 72 6f 79 29 3b 20  t(p->pDestroy); 
e790: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
e7a0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
e7b0: 5f 76 32 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e  _v2(db, zFunc, n
e7c0: 41 72 67 2c 20 65 6e 63 2c 20 28 76 6f 69 64 20  Arg, enc, (void 
e7d0: 2a 29 70 2c 20 0a 20 20 20 20 20 20 28 70 2d 3e  *)p, .      (p->
e7e0: 70 46 75 6e 63 20 3f 20 63 66 32 46 75 6e 63 20  pFunc ? cf2Func 
e7f0: 3a 20 30 29 2c 0a 20 20 20 20 20 20 28 70 2d 3e  : 0),.      (p->
e800: 70 53 74 65 70 20 3f 20 63 66 32 53 74 65 70 20  pStep ? cf2Step 
e810: 3a 20 30 29 2c 0a 20 20 20 20 20 20 28 70 2d 3e  : 0),.      (p->
e820: 70 46 69 6e 61 6c 20 3f 20 63 66 32 46 69 6e 61  pFinal ? cf2Fina
e830: 6c 20 3a 20 30 29 2c 0a 20 20 20 20 20 20 63 66  l : 0),.      cf
e840: 32 44 65 73 74 72 6f 79 0a 20 20 29 3b 0a 20 20  2Destroy.  );.  
e850: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
e860: 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 52 65 73  K ){.    Tcl_Res
e870: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  etResult(interp)
e880: 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
e890: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73  Result(interp, s
e8a0: 71 6c 69 74 65 33 54 65 73 74 45 72 72 6f 72 4e  qlite3TestErrorN
e8b0: 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20  ame(rc), 0);.   
e8c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
e8d0: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
e8e0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
e8f0: 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
e900: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 20 44  load_extension D
e910: 42 2d 48 41 4e 44 4c 45 20 46 49 4c 45 20 3f 50  B-HANDLE FILE ?P
e920: 52 4f 43 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ROC?.*/.static i
e930: 6e 74 20 74 65 73 74 5f 6c 6f 61 64 5f 65 78 74  nt test_load_ext
e940: 65 6e 73 69 6f 6e 28 0a 20 20 43 6c 69 65 6e 74  ension(.  Client
e950: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
e960: 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a   /* Not used */.
e970: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
e980: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
e990: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
e9a0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
e9b0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
e9c0: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
e9d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
e9e0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
e9f0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
ea00: 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
ea10: 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
ea20: 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66  .){.  Tcl_CmdInf
ea30: 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 73 71 6c  o cmdInfo;.  sql
ea40: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
ea50: 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b  rc;.  char *zDb;
ea60: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a  .  char *zFile;.
ea70: 20 20 63 68 61 72 20 2a 7a 50 72 6f 63 20 3d 20    char *zProc = 
ea80: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20  0;.  char *zErr 
ea90: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  = 0;..  if( objc
eaa0: 21 3d 34 20 26 26 20 6f 62 6a 63 21 3d 33 20 29  !=4 && objc!=3 )
eab0: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
eac0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
ead0: 2c 20 6f 62 6a 76 2c 20 22 44 42 2d 48 41 4e 44  , objv, "DB-HAND
eae0: 4c 45 20 46 49 4c 45 20 3f 50 52 4f 43 3f 22 29  LE FILE ?PROC?")
eaf0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
eb00: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44  _ERROR;.  }.  zD
eb10: 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  b = Tcl_GetStrin
eb20: 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 7a 46  g(objv[1]);.  zF
eb30: 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ile = Tcl_GetStr
eb40: 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
eb50: 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20  if( objc==4 ){. 
eb60: 20 20 20 7a 50 72 6f 63 20 3d 20 54 63 6c 5f 47     zProc = Tcl_G
eb70: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
eb80: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 74  );.  }..  /* Ext
eb90: 72 61 63 74 20 74 68 65 20 43 20 64 61 74 61 62  ract the C datab
eba0: 61 73 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20  ase handle from 
ebb0: 74 68 65 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20  the Tcl command 
ebc0: 6e 61 6d 65 20 2a 2f 0a 20 20 69 66 28 20 21 54  name */.  if( !T
ebd0: 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66  cl_GetCommandInf
ebe0: 6f 28 69 6e 74 65 72 70 2c 20 7a 44 62 2c 20 26  o(interp, zDb, &
ebf0: 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  cmdInfo) ){.    
ec00: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
ec10: 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e  (interp, "comman
ec20: 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 20  d not found: ", 
ec30: 7a 44 62 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  zDb, (char*)0);.
ec40: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
ec50: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 64 62 20 3d  RROR;.  }.  db =
ec60: 20 28 28 73 74 72 75 63 74 20 53 71 6c 69 74 65   ((struct Sqlite
ec70: 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43  Db*)cmdInfo.objC
ec80: 6c 69 65 6e 74 44 61 74 61 29 2d 3e 64 62 3b 0a  lientData)->db;.
ec90: 20 20 61 73 73 65 72 74 28 64 62 29 3b 0a 0a 20    assert(db);.. 
eca0: 20 2f 2a 20 43 61 6c 6c 20 74 68 65 20 75 6e 64   /* Call the und
ecb0: 65 72 6c 79 69 6e 67 20 43 20 66 75 6e 63 74 69  erlying C functi
ecc0: 6f 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  on. If an error 
ecd0: 6f 63 63 75 72 73 2c 20 73 65 74 20 72 63 20 74  occurs, set rc t
ece0: 6f 20 0a 20 20 2a 2a 20 54 43 4c 5f 45 52 52 4f  o .  ** TCL_ERRO
ecf0: 52 20 61 6e 64 20 6c 6f 61 64 20 61 6e 79 20 65  R and load any e
ed00: 72 72 6f 72 20 73 74 72 69 6e 67 20 69 6e 74 6f  rror string into
ed10: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
ed20: 2e 20 49 66 20 6e 6f 20 0a 20 20 2a 2a 20 65 72  . If no .  ** er
ed30: 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
ed40: 72 63 20 74 6f 20 54 43 4c 5f 4f 4b 2e 0a 20 20  rc to TCL_OK..  
ed50: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
ed60: 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
ed70: 53 49 4f 4e 0a 20 20 72 63 20 3d 20 53 51 4c 49  SION.  rc = SQLI
ed80: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7a 45 72 72  TE_ERROR;.  zErr
ed90: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
eda0: 74 66 28 22 74 68 69 73 20 62 75 69 6c 64 20 6f  tf("this build o
edb0: 6d 69 74 73 20 73 71 6c 69 74 65 33 5f 6c 6f 61  mits sqlite3_loa
edc0: 64 5f 65 78 74 65 6e 73 69 6f 6e 28 29 22 29 3b  d_extension()");
edd0: 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d 20 73 71  .#else.  rc = sq
ede0: 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e  lite3_load_exten
edf0: 73 69 6f 6e 28 64 62 2c 20 7a 46 69 6c 65 2c 20  sion(db, zFile, 
ee00: 7a 50 72 6f 63 2c 20 26 7a 45 72 72 29 3b 0a 23  zProc, &zErr);.#
ee10: 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 21 3d  endif.  if( rc!=
ee20: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
ee30: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
ee40: 6e 74 65 72 70 2c 20 7a 45 72 72 20 3f 20 7a 45  nterp, zErr ? zE
ee50: 72 72 20 3a 20 22 22 2c 20 54 43 4c 5f 56 4f 4c  rr : "", TCL_VOL
ee60: 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 63 20 3d  ATILE);.    rc =
ee70: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65   TCL_ERROR;.  }e
ee80: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 54 43  lse{.    rc = TC
ee90: 4c 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  L_OK;.  }.  sqli
eea0: 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a  te3_free(zErr);.
eeb0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
eec0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
eed0: 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61  lite3_enable_loa
eee0: 64 5f 65 78 74 65 6e 73 69 6f 6e 20 44 42 2d 48  d_extension DB-H
eef0: 41 4e 44 4c 45 20 4f 4e 4f 46 46 0a 2a 2f 0a 73  ANDLE ONOFF.*/.s
ef00: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65  tatic int test_e
ef10: 6e 61 62 6c 65 5f 6c 6f 61 64 28 0a 20 20 43 6c  nable_load(.  Cl
ef20: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
ef30: 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64  ata, /* Not used
ef40: 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
ef50: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
ef60: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
ef70: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
ef80: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
ef90: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
efa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
efb0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
efc0: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
efd0: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
efe0: 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
eff0: 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d  s */.){.  Tcl_Cm
f000: 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20  dInfo cmdInfo;. 
f010: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
f020: 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 69 6e 74  char *zDb;.  int
f030: 20 6f 6e 6f 66 66 3b 0a 0a 20 20 69 66 28 20 6f   onoff;..  if( o
f040: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
f050: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
f060: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
f070: 22 44 42 2d 48 41 4e 44 4c 45 20 4f 4e 4f 46 46  "DB-HANDLE ONOFF
f080: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
f090: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
f0a0: 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  zDb = Tcl_GetStr
f0b0: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 0a 20  ing(objv[1]);.. 
f0c0: 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20   /* Extract the 
f0d0: 43 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  C database handl
f0e0: 65 20 66 72 6f 6d 20 74 68 65 20 54 63 6c 20 63  e from the Tcl c
f0f0: 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 2a 2f 0a 20  ommand name */. 
f100: 20 69 66 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d   if( !Tcl_GetCom
f110: 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c  mandInfo(interp,
f120: 20 7a 44 62 2c 20 26 63 6d 64 49 6e 66 6f 29 20   zDb, &cmdInfo) 
f130: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
f140: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
f150: 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f 75  "command not fou
f160: 6e 64 3a 20 22 2c 20 7a 44 62 2c 20 28 63 68 61  nd: ", zDb, (cha
f170: 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
f180: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
f190: 0a 20 20 64 62 20 3d 20 28 28 73 74 72 75 63 74  .  db = ((struct
f1a0: 20 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e   SqliteDb*)cmdIn
f1b0: 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61  fo.objClientData
f1c0: 29 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  )->db;.  assert(
f1d0: 64 62 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74  db);..  /* Get t
f1e0: 68 65 20 6f 6e 6f 66 66 20 70 61 72 61 6d 65 74  he onoff paramet
f1f0: 65 72 20 2a 2f 0a 20 20 69 66 28 20 54 63 6c 5f  er */.  if( Tcl_
f200: 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
f210: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
f220: 5d 2c 20 26 6f 6e 6f 66 66 29 20 29 7b 0a 20 20  ], &onoff) ){.  
f230: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
f240: 4f 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20  OR;.  }..#ifdef 
f250: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
f260: 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 54 63 6c  _EXTENSION.  Tcl
f270: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
f280: 74 65 72 70 2c 20 22 74 68 69 73 20 62 75 69 6c  terp, "this buil
f290: 64 20 6f 6d 69 74 73 20 73 71 6c 69 74 65 33 5f  d omits sqlite3_
f2a0: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 29  load_extension()
f2b0: 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ");.  return TCL
f2c0: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20  _ERROR;.#else.  
f2d0: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c  sqlite3_enable_l
f2e0: 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 64 62  oad_extension(db
f2f0: 2c 20 6f 6e 6f 66 66 29 3b 0a 20 20 72 65 74 75  , onoff);.  retu
f300: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 23 65 6e 64 69  rn TCL_OK;.#endi
f310: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  f.}../*.** Usage
f320: 3a 20 20 73 71 6c 69 74 65 5f 61 62 6f 72 74 0a  :  sqlite_abort.
f330: 2a 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  **.** Shutdown t
f340: 68 65 20 70 72 6f 63 65 73 73 20 69 6d 6d 65 64  he process immed
f350: 69 61 74 65 6c 79 2e 20 20 54 68 69 73 20 69 73  iately.  This is
f360: 20 6e 6f 74 20 61 20 63 6c 65 61 6e 20 73 68 75   not a clean shu
f370: 74 64 6f 77 6e 2e 0a 2a 2a 20 54 68 69 73 20 63  tdown..** This c
f380: 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74  ommand is used t
f390: 6f 20 74 65 73 74 20 74 68 65 20 72 65 63 6f 76  o test the recov
f3a0: 65 72 61 62 69 6c 69 74 79 20 6f 66 20 61 20 64  erability of a d
f3b0: 61 74 61 62 61 73 65 20 69 6e 0a 2a 2a 20 74 68  atabase in.** th
f3c0: 65 20 65 76 65 6e 74 20 6f 66 20 61 20 70 72 6f  e event of a pro
f3d0: 67 72 61 6d 20 63 72 61 73 68 2e 0a 2a 2f 0a 73  gram crash..*/.s
f3e0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
f3f0: 5f 61 62 6f 72 74 28 0a 20 20 76 6f 69 64 20 2a  _abort(.  void *
f400: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
f410: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
f420: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
f430: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
f440: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
f450: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
f460: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
f470: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
f480: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
f490: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
f4a0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
f4b0: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
f4c0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 4d 53  .#if defined(_MS
f4d0: 43 5f 56 45 52 29 0a 20 20 2f 2a 20 57 65 20 64  C_VER).  /* We d
f4e0: 6f 20 74 68 69 73 2c 20 6f 74 68 65 72 77 69 73  o this, otherwis
f4f0: 65 20 74 68 65 20 74 65 73 74 20 77 69 6c 6c 20  e the test will 
f500: 68 61 6c 74 20 77 69 74 68 20 61 20 70 6f 70 75  halt with a popu
f510: 70 20 6d 65 73 73 61 67 65 0a 20 20 20 2a 20 74  p message.   * t
f520: 68 61 74 20 77 65 20 68 61 76 65 20 74 6f 20 63  hat we have to c
f530: 6c 69 63 6b 20 61 77 61 79 20 62 65 66 6f 72 65  lick away before
f540: 20 74 68 65 20 74 65 73 74 20 77 69 6c 6c 20 63   the test will c
f550: 6f 6e 74 69 6e 75 65 2e 0a 20 20 20 2a 2f 0a 20  ontinue..   */. 
f560: 20 5f 73 65 74 5f 61 62 6f 72 74 5f 62 65 68 61   _set_abort_beha
f570: 76 69 6f 72 28 20 30 2c 20 5f 43 41 4c 4c 5f 52  vior( 0, _CALL_R
f580: 45 50 4f 52 54 46 41 55 4c 54 20 29 3b 0a 23 65  EPORTFAULT );.#e
f590: 6e 64 69 66 0a 20 20 65 78 69 74 28 32 35 35 29  ndif.  exit(255)
f5a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 74 65  ;.  assert( inte
f5b0: 72 70 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 54 68  rp==0 );   /* Th
f5c0: 69 73 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66  is will always f
f5d0: 61 69 6c 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ail */.  return 
f5e0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
f5f0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
f600: 6f 75 74 69 6e 65 20 69 73 20 61 20 75 73 65 72  outine is a user
f610: 2d 64 65 66 69 6e 65 64 20 53 51 4c 20 66 75 6e  -defined SQL fun
f620: 63 74 69 6f 6e 20 77 68 6f 73 65 20 70 75 72 70  ction whose purp
f630: 6f 73 65 0a 2a 2a 20 69 73 20 74 6f 20 74 65 73  ose.** is to tes
f640: 74 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 74  t the sqlite_set
f650: 5f 72 65 73 75 6c 74 28 29 20 41 50 49 2e 0a 2a  _result() API..*
f660: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  /.static void te
f670: 73 74 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  stFunc(sqlite3_c
f680: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
f690: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
f6a0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29  e3_value **argv)
f6b0: 7b 0a 20 20 77 68 69 6c 65 28 20 61 72 67 63 3e  {.  while( argc>
f6c0: 3d 32 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =2 ){.    const 
f6d0: 63 68 61 72 20 2a 7a 41 72 67 30 20 3d 20 28 63  char *zArg0 = (c
f6e0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
f6f0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
f700: 3b 0a 20 20 20 20 69 66 28 20 7a 41 72 67 30 20  ;.    if( zArg0 
f710: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ){.      if( 0==
f720: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
f730: 41 72 67 30 2c 20 22 69 6e 74 22 29 20 29 7b 0a  Arg0, "int") ){.
f740: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
f750: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
f760: 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  xt, sqlite3_valu
f770: 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 29 3b  e_int(argv[1]));
f780: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
f790: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
f7a0: 7a 41 72 67 30 2c 22 69 6e 74 36 34 22 29 3d 3d  zArg0,"int64")==
f7b0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
f7c0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
f7d0: 34 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74  4(context, sqlit
f7e0: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61  e3_value_int64(a
f7f0: 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20  rgv[1]));.      
f800: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
f810: 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22  3StrICmp(zArg0,"
f820: 73 74 72 69 6e 67 22 29 3d 3d 30 20 29 7b 0a 20  string")==0 ){. 
f830: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
f840: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
f850: 78 74 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74  xt, (char*)sqlit
f860: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
f870: 67 76 5b 31 5d 29 2c 20 2d 31 2c 0a 20 20 20 20  gv[1]), -1,.    
f880: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54          SQLITE_T
f890: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
f8a0: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
f8b0: 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c  e3StrICmp(zArg0,
f8c0: 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a  "double")==0 ){.
f8d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
f8e0: 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f  result_double(co
f8f0: 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76  ntext, sqlite3_v
f900: 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76  alue_double(argv
f910: 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  [1]));.      }el
f920: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  se if( sqlite3St
f930: 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 6e 75 6c  rICmp(zArg0,"nul
f940: 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  l")==0 ){.      
f950: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
f960: 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 0a  _null(context);.
f970: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
f980: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
f990: 41 72 67 30 2c 22 76 61 6c 75 65 22 29 3d 3d 30  Arg0,"value")==0
f9a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
f9b0: 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65  te3_result_value
f9c0: 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 73  (context, argv[s
f9d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
f9e0: 28 61 72 67 76 5b 31 5d 29 5d 29 3b 0a 20 20 20  (argv[1])]);.   
f9f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fa00: 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74    goto error_out
fa10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
fa20: 6c 73 65 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  lse{.      goto 
fa30: 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 7d  error_out;.    }
fa40: 0a 20 20 20 20 61 72 67 63 20 2d 3d 20 32 3b 0a  .    argc -= 2;.
fa50: 20 20 20 20 61 72 67 76 20 2b 3d 20 32 3b 0a 20      argv += 2;. 
fa60: 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 65 72   }.  return;..er
fa70: 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ror_out:.  sqlit
fa80: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
fa90: 63 6f 6e 74 65 78 74 2c 22 66 69 72 73 74 20 61  context,"first a
faa0: 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62  rgument should b
fab0: 65 20 6f 6e 65 20 6f 66 3a 20 22 0a 20 20 20 20  e one of: ".    
fac0: 20 20 22 69 6e 74 20 69 6e 74 36 34 20 73 74 72    "int int64 str
fad0: 69 6e 67 20 64 6f 75 62 6c 65 20 6e 75 6c 6c 20  ing double null 
fae0: 76 61 6c 75 65 22 2c 20 2d 31 29 3b 0a 7d 0a 0a  value", -1);.}..
faf0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
fb00: 71 6c 69 74 65 5f 72 65 67 69 73 74 65 72 5f 74  qlite_register_t
fb10: 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 20 44 42  est_function  DB
fb20: 20 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 67    NAME.**.** Reg
fb30: 69 73 74 65 72 20 74 68 65 20 74 65 73 74 20 53  ister the test S
fb40: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74  QL function on t
fb50: 68 65 20 64 61 74 61 62 61 73 65 20 44 42 20 75  he database DB u
fb60: 6e 64 65 72 20 74 68 65 20 6e 61 6d 65 20 4e 41  nder the name NA
fb70: 4d 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ME..*/.static in
fb80: 74 20 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f  t test_register_
fb90: 66 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  func(.  void *No
fba0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
fbb0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
fbc0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
fbd0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
fbe0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
fbf0: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
fc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fc10: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
fc20: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
fc30: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
fc40: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
fc50: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
fc60: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
fc70: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72  int rc;.  if( ar
fc80: 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=3 ){.    Tcl
fc90: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
fca0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
fcb0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
fcc0: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20  "", argv[0], .  
fcd0: 20 20 20 20 20 22 20 44 42 20 46 55 4e 43 54 49       " DB FUNCTI
fce0: 4f 4e 2d 4e 41 4d 45 22 2c 20 30 29 3b 0a 20 20  ON-NAME", 0);.  
fcf0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
fd00: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
fd10: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
fd20: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
fd30: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
fd40: 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
fd50: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
fd60: 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c  ion(db, argv[2],
fd70: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
fd80: 2c 20 30 2c 20 0a 20 20 20 20 20 20 74 65 73 74  , 0, .      test
fd90: 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 69  Func, 0, 0);.  i
fda0: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
fdb0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
fdc0: 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
fdd0: 45 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a  ErrStr(rc), 0);.
fde0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
fdf0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
fe00: 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
fe10: 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
fe20: 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
fe30: 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20  ERROR;.  return 
fe40: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
fe50: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
fe60: 5f 66 69 6e 61 6c 69 7a 65 20 20 53 54 4d 54 20  _finalize  STMT 
fe70: 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20  .**.** Finalize 
fe80: 61 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64  a statement hand
fe90: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
fea0: 74 20 74 65 73 74 5f 66 69 6e 61 6c 69 7a 65 28  t test_finalize(
feb0: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
fec0: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
fed0: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
fee0: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
fef0: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
ff00: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
ff10: 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
ff20: 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  rc;.  sqlite3 *d
ff30: 62 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62  b = 0;..  if( ob
ff40: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
ff50: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
ff60: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
ff70: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
ff80: 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
ff90: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
ffa0: 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
ffb0: 3c 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20  <STMT>", 0);.   
ffc0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
ffd0: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
ffe0: 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
fff0: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
10000 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
10010 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
10020 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20  L_ERROR;..  if( 
10030 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 64 62 20  pStmt ){.    db 
10040 3d 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74  = StmtToDb(pStmt
10050 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
10060 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
10070 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74  Stmt);.  Tcl_Set
10080 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
10090 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
100a0 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
100b0 49 43 29 3b 0a 20 20 69 66 28 20 64 62 20 26 26  IC);.  if( db &&
100c0 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
100d0 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20  ode(interp, db, 
100e0 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
100f0 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e  _ERROR;.  return
10100 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
10110 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
10120 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 20 20 53  3_stmt_status  S
10130 54 4d 54 20 20 43 4f 44 45 20 20 52 45 53 45 54  TMT  CODE  RESET
10140 46 4c 41 47 0a 2a 2a 0a 2a 2a 20 47 65 74 20 74  FLAG.**.** Get t
10150 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73 74  he value of a st
10160 61 74 75 73 20 63 6f 75 6e 74 65 72 20 66 72 6f  atus counter fro
10170 6d 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  m a statement..*
10180 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
10190 74 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 0a 20  t_stmt_status(. 
101a0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
101b0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
101c0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
101d0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
101e0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
101f0 0a 20 20 69 6e 74 20 69 56 61 6c 75 65 3b 0a 20  .  int iValue;. 
10200 20 69 6e 74 20 69 2c 20 6f 70 2c 20 72 65 73 65   int i, op, rese
10210 74 46 6c 61 67 3b 0a 20 20 63 6f 6e 73 74 20 63  tFlag;.  const c
10220 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20  har *zOpName;.  
10230 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
10240 74 6d 74 3b 0a 0a 20 20 73 74 61 74 69 63 20 63  tmt;..  static c
10250 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
10260 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
10270 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 6f 70 3b  ame;.    int op;
10280 0a 20 20 7d 20 61 4f 70 5b 5d 20 3d 20 7b 0a 20  .  } aOp[] = {. 
10290 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 53 54 4d     { "SQLITE_STM
102a0 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e  TSTATUS_FULLSCAN
102b0 5f 53 54 45 50 22 2c 20 20 20 53 51 4c 49 54 45  _STEP",   SQLITE
102c0 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c  _STMTSTATUS_FULL
102d0 53 43 41 4e 5f 53 54 45 50 20 20 20 7d 2c 0a 20  SCAN_STEP   },. 
102e0 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 53 54 4d     { "SQLITE_STM
102f0 54 53 54 41 54 55 53 5f 53 4f 52 54 22 2c 20 20  TSTATUS_SORT",  
10300 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
10310 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54  _STMTSTATUS_SORT
10320 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
10330 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 53 54 4d     { "SQLITE_STM
10340 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45  TSTATUS_AUTOINDE
10350 58 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45  X",       SQLITE
10360 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f  _STMTSTATUS_AUTO
10370 49 4e 44 45 58 20 20 20 20 20 20 20 7d 2c 0a 20  INDEX       },. 
10380 20 7d 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d   };.  if( objc!=
10390 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  4 ){.    Tcl_Wro
103a0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
103b0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54  , 1, objv, "STMT
103c0 20 50 41 52 41 4d 45 54 45 52 20 52 45 53 45 54   PARAMETER RESET
103d0 46 4c 41 47 22 29 3b 0a 20 20 20 20 72 65 74 75  FLAG");.    retu
103e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
103f0 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
10400 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
10410 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
10420 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
10430 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
10440 52 3b 0a 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 54  R;.  zOpName = T
10450 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
10460 76 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30  v[2]);.  for(i=0
10470 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 4f  ; i<ArraySize(aO
10480 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  p); i++){.    if
10490 28 20 73 74 72 63 6d 70 28 61 4f 70 5b 69 5d 2e  ( strcmp(aOp[i].
104a0 7a 4e 61 6d 65 2c 20 7a 4f 70 4e 61 6d 65 29 3d  zName, zOpName)=
104b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 70 20 3d  =0 ){.      op =
104c0 20 61 4f 70 5b 69 5d 2e 6f 70 3b 0a 20 20 20 20   aOp[i].op;.    
104d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
104e0 20 7d 0a 20 20 69 66 28 20 69 3e 3d 41 72 72 61   }.  if( i>=Arra
104f0 79 53 69 7a 65 28 61 4f 70 29 20 29 7b 0a 20 20  ySize(aOp) ){.  
10500 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
10510 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
10520 6f 62 6a 76 5b 32 5d 2c 20 26 6f 70 29 20 29 20  objv[2], &op) ) 
10530 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10540 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
10550 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
10560 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
10570 5d 2c 20 26 72 65 73 65 74 46 6c 61 67 29 20 29  ], &resetFlag) )
10580 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
10590 52 3b 0a 20 20 69 56 61 6c 75 65 20 3d 20 73 71  R;.  iValue = sq
105a0 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
105b0 73 28 70 53 74 6d 74 2c 20 6f 70 2c 20 72 65 73  s(pStmt, op, res
105c0 65 74 46 6c 61 67 29 3b 0a 20 20 54 63 6c 5f 53  etFlag);.  Tcl_S
105d0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
105e0 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
105f0 6a 28 69 56 61 6c 75 65 29 29 3b 0a 20 20 72 65  j(iValue));.  re
10600 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
10610 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
10620 6c 69 74 65 33 5f 6e 65 78 74 5f 73 74 6d 74 20  lite3_next_stmt 
10630 20 44 42 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20   DB  STMT.**.** 
10640 52 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20  Return the next 
10650 73 74 61 74 6d 65 6e 74 20 69 6e 20 73 65 71 75  statment in sequ
10660 65 6e 63 65 20 61 66 74 65 72 20 53 54 4d 54 2e  ence after STMT.
10670 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
10680 65 73 74 5f 6e 65 78 74 5f 73 74 6d 74 28 0a 20  est_next_stmt(. 
10690 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
106a0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
106b0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
106c0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
106d0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
106e0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
106f0 2a 70 53 74 6d 74 3b 0a 20 20 73 71 6c 69 74 65  *pStmt;.  sqlite
10700 33 20 2a 64 62 20 3d 20 30 3b 0a 20 20 63 68 61  3 *db = 0;.  cha
10710 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 0a 20 20 69  r zBuf[50];..  i
10720 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
10730 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
10740 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
10750 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
10760 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
10770 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
10780 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
10790 29 2c 20 22 20 44 42 20 53 54 4d 54 22 2c 20 30  ), " DB STMT", 0
107a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
107b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
107c0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
107d0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
107e0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
107f0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
10800 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
10810 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
10820 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
10830 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 26  ring(objv[2]), &
10840 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
10850 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 70 53 74  TCL_ERROR;.  pSt
10860 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f 6e 65 78  mt = sqlite3_nex
10870 74 5f 73 74 6d 74 28 64 62 2c 20 70 53 74 6d 74  t_stmt(db, pStmt
10880 29 3b 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29  );.  if( pStmt )
10890 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
108a0 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72  3TestMakePointer
108b0 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  Str(interp, zBuf
108c0 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72  , pStmt) ) retur
108d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
108e0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
108f0 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
10900 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
10910 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
10920 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
10930 33 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 20  3_stmt_readonly 
10940 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75   STMT.**.** Retu
10950 72 6e 20 74 72 75 65 20 69 66 20 53 54 4d 54 20  rn true if STMT 
10960 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
10970 72 20 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74  r or a pointer t
10980 6f 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  o a statement.**
10990 20 74 68 61 74 20 69 73 20 67 75 61 72 61 6e 74   that is guarant
109a0 65 65 64 20 74 6f 20 6c 65 61 76 65 20 74 68 65  eed to leave the
109b0 20 64 61 74 61 62 61 73 65 20 75 6e 6d 6f 64 69   database unmodi
109c0 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  fied..*/.static 
109d0 69 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 72 65  int test_stmt_re
109e0 61 64 6f 6e 6c 79 28 0a 20 20 76 6f 69 64 20 2a  adonly(.  void *
109f0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
10a00 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
10a10 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
10a20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
10a30 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
10a40 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
10a50 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
10a60 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
10a70 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
10a80 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
10a90 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
10aa0 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
10ab0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
10ac0 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
10ad0 2c 20 22 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20  , " STMT", 0);. 
10ae0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
10af0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
10b00 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
10b10 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
10b20 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
10b30 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
10b40 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
10b50 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 72  = sqlite3_stmt_r
10b60 65 61 64 6f 6e 6c 79 28 70 53 74 6d 74 29 3b 0a  eadonly(pStmt);.
10b70 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
10b80 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
10b90 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 63 29  ewBooleanObj(rc)
10ba0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
10bb0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
10bc0 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ge:  sqlite3_stm
10bd0 74 5f 62 75 73 79 20 20 53 54 4d 54 0a 2a 2a 0a  t_busy  STMT.**.
10be0 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
10bf0 66 20 53 54 4d 54 20 69 73 20 61 20 6e 6f 6e 2d  f STMT is a non-
10c00 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 74 6f 20  NULL pointer to 
10c10 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74  a statement.** t
10c20 68 61 74 20 68 61 73 20 62 65 65 6e 20 73 74 65  hat has been ste
10c30 70 70 65 64 20 62 75 74 20 6e 6f 74 20 74 6f 20  pped but not to 
10c40 63 6f 6d 70 6c 65 74 69 6f 6e 2e 0a 2a 2f 0a 73  completion..*/.s
10c50 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
10c60 74 6d 74 5f 62 75 73 79 28 0a 20 20 76 6f 69 64  tmt_busy(.  void
10c70 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
10c80 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
10c90 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
10ca0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
10cb0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
10cc0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
10cd0 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  t;.  int rc;..  
10ce0 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
10cf0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
10d00 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
10d10 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
10d20 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
10d30 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
10d40 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
10d50 30 29 2c 20 22 20 53 54 4d 54 22 2c 20 30 29 3b  0), " STMT", 0);
10d60 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
10d70 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
10d80 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
10d90 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
10da0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
10db0 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
10dc0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
10dd0 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  c = sqlite3_stmt
10de0 5f 62 75 73 79 28 70 53 74 6d 74 29 3b 0a 20 20  _busy(pStmt);.  
10df0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
10e00 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
10e10 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 63 29 29 3b  BooleanObj(rc));
10e20 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
10e30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
10e40 3a 20 20 75 73 65 73 5f 73 74 6d 74 5f 6a 6f 75  :  uses_stmt_jou
10e50 72 6e 61 6c 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a  rnal  STMT.**.**
10e60 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
10e70 53 54 4d 54 20 75 73 65 73 20 61 20 73 74 61 74  STMT uses a stat
10e80 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  ement journal..*
10e90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 73 65  /.static int use
10ea0 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 28 0a  s_stmt_journal(.
10eb0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
10ec0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
10ed0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
10ee0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
10ef0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
10f00 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
10f10 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20   *pStmt;..  if( 
10f20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
10f30 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
10f40 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
10f50 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
10f60 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
10f70 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
10f80 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
10f90 22 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20  " STMT", 0);.   
10fa0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
10fb0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
10fc0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
10fd0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
10fe0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
10ff0 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
11000 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74  L_ERROR;.  sqlit
11010 65 33 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79  e3_stmt_readonly
11020 28 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53  (pStmt);.  Tcl_S
11030 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
11040 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65  rp, Tcl_NewBoole
11050 61 6e 4f 62 6a 28 28 28 56 64 62 65 20 2a 29 70  anObj(((Vdbe *)p
11060 53 74 6d 74 29 2d 3e 75 73 65 73 53 74 6d 74 4a  Stmt)->usesStmtJ
11070 6f 75 72 6e 61 6c 29 29 3b 0a 20 20 72 65 74 75  ournal));.  retu
11080 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
11090 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
110a0 69 74 65 33 5f 72 65 73 65 74 20 20 53 54 4d 54  ite3_reset  STMT
110b0 20 0a 2a 2a 0a 2a 2a 20 52 65 73 65 74 20 61 20   .**.** Reset a 
110c0 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65  statement handle
110d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
110e0 74 65 73 74 5f 72 65 73 65 74 28 0a 20 20 76 6f  test_reset(.  vo
110f0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
11100 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
11110 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
11120 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
11130 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
11140 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
11150 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  tmt;.  int rc;..
11160 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
11170 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
11180 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
11190 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
111a0 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
111b0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
111c0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
111d0 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c  , 0), " <STMT>",
111e0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
111f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
11200 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
11210 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
11220 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
11230 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
11240 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11250 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
11260 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
11270 20 69 66 28 20 70 53 74 6d 74 20 26 26 20 73 71   if( pStmt && sq
11280 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
11290 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44  (interp, StmtToD
112a0 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 7b  b(pStmt), rc) ){
112b0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
112c0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c  ERROR;.  }.  Tcl
112d0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
112e0 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
112f0 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  orName(rc), TCL_
11300 53 54 41 54 49 43 29 3b 0a 2f 2a 0a 20 20 69 66  STATIC);./*.  if
11310 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
11320 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11330 7d 0a 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43  }.*/.  return TC
11340 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
11350 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65  sage:  sqlite3_e
11360 78 70 69 72 65 64 20 53 54 4d 54 20 0a 2a 2a 0a  xpired STMT .**.
11370 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
11380 66 20 61 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f  f a recompilatio
11390 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  n of the stateme
113a0 6e 74 20 69 73 20 72 65 63 6f 6d 6d 65 6e 64 65  nt is recommende
113b0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
113c0 20 74 65 73 74 5f 65 78 70 69 72 65 64 28 0a 20   test_expired(. 
113d0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
113e0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
113f0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
11400 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
11410 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
11420 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11430 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a  OMIT_DEPRECATED.
11440 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
11450 70 53 74 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a  pStmt;.  if( obj
11460 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
11470 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
11480 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
11490 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
114a0 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
114b0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
114c0 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c  objv[0], 0), " <
114d0 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20  STMT>", 0);.    
114e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
114f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53  ;.  }.  if( getS
11500 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
11510 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
11520 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
11530 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
11540 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74  ERROR;.  Tcl_Set
11550 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
11560 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e  , Tcl_NewBoolean
11570 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 78 70 69  Obj(sqlite3_expi
11580 72 65 64 28 70 53 74 6d 74 29 29 29 3b 0a 23 65  red(pStmt)));.#e
11590 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43  ndif.  return TC
115a0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
115b0 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 74  sage:  sqlite3_t
115c0 72 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67 73  ransfer_bindings
115d0 20 46 52 4f 4d 53 54 4d 54 20 54 4f 53 54 4d 54   FROMSTMT TOSTMT
115e0 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20  .**.** Transfer 
115f0 61 6c 6c 20 62 69 6e 64 69 6e 67 73 20 66 72 6f  all bindings fro
11600 6d 20 46 52 4f 4d 53 54 4d 54 20 6f 76 65 72 20  m FROMSTMT over 
11610 74 6f 20 54 4f 53 54 4d 54 0a 2a 2f 0a 73 74 61  to TOSTMT.*/.sta
11620 74 69 63 20 69 6e 74 20 74 65 73 74 5f 74 72 61  tic int test_tra
11630 6e 73 66 65 72 5f 62 69 6e 64 28 0a 20 20 76 6f  nsfer_bind(.  vo
11640 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
11650 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
11660 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
11670 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
11680 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69  NST objv[].){.#i
11690 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
116a0 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20 20 73  T_DEPRECATED.  s
116b0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
116c0 6d 74 31 2c 20 2a 70 53 74 6d 74 32 3b 0a 20 20  mt1, *pStmt2;.  
116d0 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
116e0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
116f0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
11700 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
11710 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
11720 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
11730 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
11740 30 29 2c 20 22 20 46 52 4f 4d 2d 53 54 4d 54 20  0), " FROM-STMT 
11750 54 4f 2d 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20  TO-STMT", 0);.  
11760 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
11770 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
11780 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
11790 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
117a0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
117b0 74 6d 74 31 29 29 20 72 65 74 75 72 6e 20 54 43  tmt1)) return TC
117c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 67  L_ERROR;.  if( g
117d0 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
117e0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
117f0 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 26 70  ing(objv[2]), &p
11800 53 74 6d 74 32 29 29 20 72 65 74 75 72 6e 20 54  Stmt2)) return T
11810 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
11820 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
11830 65 72 70 2c 20 0a 20 20 20 20 20 54 63 6c 5f 4e  erp, .     Tcl_N
11840 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  ewIntObj(sqlite3
11850 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e  _transfer_bindin
11860 67 73 28 70 53 74 6d 74 31 2c 70 53 74 6d 74 32  gs(pStmt1,pStmt2
11870 29 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  )));.#endif.  re
11880 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
11890 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
118a0 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 20 44 42  lite3_changes DB
118b0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
118c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e  e number of chan
118d0 67 65 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20  ges made to the 
118e0 64 61 74 61 62 61 73 65 20 62 79 20 74 68 65 20  database by the 
118f0 6c 61 73 74 20 53 51 4c 0a 2a 2a 20 65 78 65 63  last SQL.** exec
11900 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ution..*/.static
11910 20 69 6e 74 20 74 65 73 74 5f 63 68 61 6e 67 65   int test_change
11920 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  s(.  void * clie
11930 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
11940 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
11950 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
11960 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
11970 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
11980 64 62 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  db;.  if( objc!=
11990 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
119a0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
119b0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
119c0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
119d0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
119e0 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
119f0 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
11a00 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11a10 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
11a20 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
11a30 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
11a40 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
11a50 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11a60 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
11a70 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
11a80 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  ewIntObj(sqlite3
11a90 5f 63 68 61 6e 67 65 73 28 64 62 29 29 29 3b 0a  _changes(db)));.
11aa0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
11ab0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
11ac0 73 20 74 68 65 20 22 73 74 61 74 69 63 5f 62 69  s the "static_bi
11ad0 6e 64 5f 76 61 6c 75 65 22 20 74 68 61 74 20 76  nd_value" that v
11ae0 61 72 69 61 62 6c 65 73 20 61 72 65 20 62 6f 75  ariables are bou
11af0 6e 64 20 74 6f 20 77 68 65 6e 0a 2a 2a 20 74 68  nd to when.** th
11b00 65 20 46 4c 41 47 20 6f 70 74 69 6f 6e 20 6f 66  e FLAG option of
11b10 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 20 69 73   sqlite3_bind is
11b20 20 22 73 74 61 74 69 63 22 0a 2a 2f 0a 73 74 61   "static".*/.sta
11b30 74 69 63 20 63 68 61 72 20 2a 73 71 6c 69 74 65  tic char *sqlite
11b40 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c  _static_bind_val
11b50 75 65 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69  ue = 0;.static i
11b60 6e 74 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63  nt sqlite_static
11b70 5f 62 69 6e 64 5f 6e 62 79 74 65 20 3d 20 30 3b  _bind_nbyte = 0;
11b80 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
11b90 73 71 6c 69 74 65 33 5f 62 69 6e 64 20 20 56 4d  sqlite3_bind  VM
11ba0 20 20 49 44 58 20 20 56 41 4c 55 45 20 20 46 4c    IDX  VALUE  FL
11bb0 41 47 53 0a 2a 2a 0a 2a 2a 20 53 65 74 73 20 74  AGS.**.** Sets t
11bc0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
11bd0 49 44 58 2d 74 68 20 6f 63 63 75 72 61 6e 63 65  IDX-th occurance
11be0 20 6f 66 20 22 3f 22 20 69 6e 20 74 68 65 20 6f   of "?" in the o
11bf0 72 69 67 69 6e 61 6c 20 53 51 4c 0a 2a 2a 20 73  riginal SQL.** s
11c00 74 72 69 6e 67 2e 20 20 56 41 4c 55 45 20 69 73  tring.  VALUE is
11c10 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 2e 20   the new value. 
11c20 20 49 66 20 46 4c 41 47 53 3d 3d 22 6e 75 6c 6c   If FLAGS=="null
11c30 22 20 74 68 65 6e 20 56 41 4c 55 45 20 69 73 0a  " then VALUE is.
11c40 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 74  ** ignored and t
11c50 68 65 20 76 61 6c 75 65 20 69 73 20 73 65 74 20  he value is set 
11c60 74 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 46 4c 41  to NULL.  If FLA
11c70 47 53 3d 3d 22 73 74 61 74 69 63 22 20 74 68 65  GS=="static" the
11c80 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69  n.** the value i
11c90 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
11ca0 75 65 20 6f 66 20 61 20 73 74 61 74 69 63 20 76  ue of a static v
11cb0 61 72 69 61 62 6c 65 20 6e 61 6d 65 64 0a 2a 2a  ariable named.**
11cc0 20 22 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f   "sqlite_static_
11cd0 62 69 6e 64 5f 76 61 6c 75 65 22 2e 20 20 49 66  bind_value".  If
11ce0 20 46 4c 41 47 53 3d 3d 22 6e 6f 72 6d 61 6c 22   FLAGS=="normal"
11cf0 20 74 68 65 6e 20 61 20 63 6f 70 79 0a 2a 2a 20   then a copy.** 
11d00 6f 66 20 74 68 65 20 56 41 4c 55 45 20 69 73 20  of the VALUE is 
11d10 6d 61 64 65 2e 20 20 49 66 20 46 4c 41 47 53 3d  made.  If FLAGS=
11d20 3d 22 62 6c 6f 62 31 30 22 20 74 68 65 6e 20 61  ="blob10" then a
11d30 20 56 41 4c 55 45 20 69 73 20 69 67 6e 6f 72 65   VALUE is ignore
11d40 64 0a 2a 2a 20 61 6e 20 61 20 31 30 2d 62 79 74  d.** an a 10-byt
11d50 65 20 62 6c 6f 62 20 22 61 62 63 5c 30 30 30 78  e blob "abc\000x
11d60 79 7a 5c 30 30 30 70 71 22 20 69 73 20 69 6e 73  yz\000pq" is ins
11d70 65 72 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  erted..*/.static
11d80 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 28 0a   int test_bind(.
11d90 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
11da0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
11db0 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
11dc0 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
11dd0 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
11de0 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
11df0 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
11e00 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
11e10 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
11e20 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
11e30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
11e40 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
11e50 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
11e60 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
11e70 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
11e80 69 64 78 3b 0a 20 20 69 66 28 20 61 72 67 63 21  idx;.  if( argc!
11e90 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =5 ){.    Tcl_Ap
11ea0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
11eb0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
11ec0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
11ed0 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
11ee0 20 20 22 20 56 4d 20 49 44 58 20 56 41 4c 55 45    " VM IDX VALUE
11ef0 20 28 6e 75 6c 6c 7c 73 74 61 74 69 63 7c 6e 6f   (null|static|no
11f00 72 6d 61 6c 29 5c 22 22 2c 20 30 29 3b 0a 20 20  rmal)\"", 0);.  
11f10 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
11f20 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
11f30 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
11f40 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 70  erp, argv[1], &p
11f50 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
11f60 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
11f70 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72  Tcl_GetInt(inter
11f80 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26 69 64 78  p, argv[2], &idx
11f90 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
11fa0 52 52 4f 52 3b 0a 20 20 69 66 28 20 73 74 72 63  RROR;.  if( strc
11fb0 6d 70 28 61 72 67 76 5b 34 5d 2c 22 6e 75 6c 6c  mp(argv[4],"null
11fc0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ")==0 ){.    rc 
11fd0 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e  = sqlite3_bind_n
11fe0 75 6c 6c 28 70 53 74 6d 74 2c 20 69 64 78 29 3b  ull(pStmt, idx);
11ff0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
12000 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 73 74 61  cmp(argv[4],"sta
12010 74 69 63 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tic")==0 ){.    
12020 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
12030 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64  d_text(pStmt, id
12040 78 2c 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63  x, sqlite_static
12050 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 20 2d 31 2c  _bind_value, -1,
12060 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   0);.  }else if(
12070 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c   strcmp(argv[4],
12080 22 73 74 61 74 69 63 2d 6e 62 79 74 65 73 22 29  "static-nbytes")
12090 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
120a0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
120b0 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 73 71  t(pStmt, idx, sq
120c0 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64  lite_static_bind
120d0 5f 76 61 6c 75 65 2c 0a 20 20 20 20 20 20 20 20  _value,.        
120e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
12100 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e  qlite_static_bin
12110 64 5f 6e 62 79 74 65 2c 20 30 29 3b 0a 20 20 7d  d_nbyte, 0);.  }
12120 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
12130 61 72 67 76 5b 34 5d 2c 22 6e 6f 72 6d 61 6c 22  argv[4],"normal"
12140 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
12150 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
12160 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 61  xt(pStmt, idx, a
12170 72 67 76 5b 33 5d 2c 20 2d 31 2c 20 53 51 4c 49  rgv[3], -1, SQLI
12180 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
12190 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
121a0 70 28 61 72 67 76 5b 34 5d 2c 22 62 6c 6f 62 31  p(argv[4],"blob1
121b0 30 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  0")==0 ){.    rc
121c0 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
121d0 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c  text(pStmt, idx,
121e0 20 22 61 62 63 5c 30 30 30 78 79 7a 5c 30 30 30   "abc\000xyz\000
121f0 70 71 22 2c 20 31 30 2c 20 53 51 4c 49 54 45 5f  pq", 10, SQLITE_
12200 53 54 41 54 49 43 29 3b 0a 20 20 7d 65 6c 73 65  STATIC);.  }else
12210 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
12220 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
12230 34 74 68 20 61 72 67 75 6d 65 6e 74 20 73 68 6f  4th argument sho
12240 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20 20  uld be ".       
12250 20 22 5c 22 6e 75 6c 6c 5c 22 20 6f 72 20 5c 22   "\"null\" or \"
12260 73 74 61 74 69 63 5c 22 20 6f 72 20 5c 22 6e 6f  static\" or \"no
12270 72 6d 61 6c 5c 22 22 2c 20 30 29 3b 0a 20 20 20  rmal\"", 0);.   
12280 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
12290 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  R;.  }.  if( sql
122a0 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
122b0 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62  interp, StmtToDb
122c0 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72  (pStmt), rc) ) r
122d0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
122e0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
122f0 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
12300 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66      sprintf(zBuf
12310 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b 0a  , "(%d) ", rc);.
12320 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
12330 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
12340 66 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  f, sqlite3ErrStr
12350 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (rc), 0);.    re
12360 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12370 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
12380 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  _OK;.}..#ifndef 
12390 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
123a0 36 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61  6./*.** Usage: a
123b0 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20  dd_test_collate 
123c0 3c 64 62 20 70 74 72 3e 20 3c 75 74 66 38 3e 20  <db ptr> <utf8> 
123d0 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36  <utf16le> <utf16
123e0 62 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  be>.**.** This f
123f0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
12400 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
12410 69 74 65 20 73 65 6c 65 63 74 73 20 74 68 65 20  ite selects the 
12420 63 6f 72 72 65 63 74 20 63 6f 6c 6c 61 74 69 6f  correct collatio
12430 6e 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 63 61  n.** sequence ca
12440 6c 6c 62 61 63 6b 20 77 68 65 6e 20 6d 75 6c 74  llback when mult
12450 69 70 6c 65 20 76 65 72 73 69 6f 6e 73 20 28 66  iple versions (f
12460 6f 72 20 64 69 66 66 65 72 65 6e 74 20 74 65 78  or different tex
12470 74 20 65 6e 63 6f 64 69 6e 67 73 29 0a 2a 2a 20  t encodings).** 
12480 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a  are available..*
12490 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69  *.** Calling thi
124a0 73 20 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74  s routine regist
124b0 65 72 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ers the collatio
124c0 6e 20 73 65 71 75 65 6e 63 65 20 22 74 65 73 74  n sequence "test
124d0 5f 63 6f 6c 6c 61 74 65 22 0a 2a 2a 20 77 69 74  _collate".** wit
124e0 68 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  h database handl
124f0 65 20 3c 64 62 3e 2e 20 54 68 65 20 73 65 63 6f  e <db>. The seco
12500 6e 64 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74  nd argument must
12510 20 62 65 20 61 20 6c 69 73 74 20 6f 66 20 74 68   be a list of th
12520 72 65 65 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20 76  ree.** boolean v
12530 61 6c 75 65 73 2e 20 49 66 20 74 68 65 20 66 69  alues. If the fi
12540 72 73 74 20 69 73 20 74 72 75 65 2c 20 74 68 65  rst is true, the
12550 6e 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  n a version of t
12560 65 73 74 5f 63 6f 6c 6c 61 74 65 20 69 73 0a 2a  est_collate is.*
12570 2a 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72  * registered for
12580 20 55 54 46 2d 38 2c 20 69 66 20 74 68 65 20 73   UTF-8, if the s
12590 65 63 6f 6e 64 20 69 73 20 74 72 75 65 2c 20 61  econd is true, a
125a0 20 76 65 72 73 69 6f 6e 20 69 73 20 72 65 67 69   version is regi
125b0 73 74 65 72 65 64 20 66 6f 72 0a 2a 2a 20 55 54  stered for.** UT
125c0 46 2d 31 36 6c 65 2c 20 69 66 20 74 68 65 20 74  F-16le, if the t
125d0 68 69 72 64 20 69 73 20 74 72 75 65 2c 20 61 20  hird is true, a 
125e0 55 54 46 2d 31 36 62 65 20 76 65 72 73 69 6f 6e  UTF-16be version
125f0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a   is available..*
12600 2a 20 50 72 65 76 69 6f 75 73 20 76 65 72 73 69  * Previous versi
12610 6f 6e 73 20 6f 66 20 74 65 73 74 5f 63 6f 6c 6c  ons of test_coll
12620 61 74 65 20 61 72 65 20 64 65 6c 65 74 65 64 2e  ate are deleted.
12630 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61  .**.** The colla
12640 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 65  tion sequence te
12650 73 74 5f 63 6f 6c 6c 61 74 65 20 69 73 20 69 6d  st_collate is im
12660 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 61 6c  plemented by cal
12670 6c 69 6e 67 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c  ling the.** foll
12680 6f 77 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74  owing TCL script
12690 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 74 65 73 74 5f  :.**.**   "test_
126a0 63 6f 6c 6c 61 74 65 20 3c 65 6e 63 3e 20 3c 6c  collate <enc> <l
126b0 68 73 3e 20 3c 72 68 73 3e 22 0a 2a 2a 0a 2a 2a  hs> <rhs>".**.**
126c0 20 54 68 65 20 3c 6c 68 73 3e 20 61 6e 64 20 3c   The <lhs> and <
126d0 72 68 73 3e 20 61 72 65 20 74 68 65 20 74 77 6f  rhs> are the two
126e0 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 63 6f   values being co
126f0 6d 70 61 72 65 64 2c 20 65 6e 63 6f 64 65 64 20  mpared, encoded 
12700 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 54 68 65  in UTF-8..** The
12710 20 3c 65 6e 63 3e 20 70 61 72 61 6d 65 74 65 72   <enc> parameter
12720 20 69 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67   is the encoding
12730 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   of the collatio
12740 6e 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a  n function that.
12750 2a 2a 20 53 51 4c 69 74 65 20 73 65 6c 65 63 74  ** SQLite select
12760 65 64 20 74 6f 20 63 61 6c 6c 2e 20 54 68 65 20  ed to call. The 
12770 54 43 4c 20 74 65 73 74 20 73 63 72 69 70 74 20  TCL test script 
12780 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 0a 2a  implements the.*
12790 2a 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  * "test_collate"
127a0 20 70 72 6f 63 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74   proc..**.** Not
127b0 65 20 74 68 61 74 20 74 68 69 73 20 77 69 6c 6c  e that this will
127c0 20 6f 6e 6c 79 20 77 6f 72 6b 20 77 69 74 68 20   only work with 
127d0 6f 6e 65 20 69 6e 74 65 70 72 65 74 65 72 20 61  one intepreter a
127e0 74 20 61 20 74 69 6d 65 2c 20 61 73 20 74 68 65  t a time, as the
127f0 0a 2a 2a 20 69 6e 74 65 72 70 20 70 6f 69 6e 74  .** interp point
12800 65 72 20 74 6f 20 75 73 65 20 77 68 65 6e 20 65  er to use when e
12810 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 54 43  valuating the TC
12820 4c 20 73 63 72 69 70 74 20 69 73 20 73 74 6f 72  L script is stor
12830 65 64 20 69 6e 0a 2a 2a 20 70 54 65 73 74 43 6f  ed in.** pTestCo
12840 6c 6c 61 74 65 49 6e 74 65 72 70 2e 0a 2a 2f 0a  llateInterp..*/.
12850 73 74 61 74 69 63 20 54 63 6c 5f 49 6e 74 65 72  static Tcl_Inter
12860 70 2a 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49  p* pTestCollateI
12870 6e 74 65 72 70 3b 0a 73 74 61 74 69 63 20 69 6e  nterp;.static in
12880 74 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66  t test_collate_f
12890 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70 43 74  unc(.  void *pCt
128a0 78 2c 20 0a 20 20 69 6e 74 20 6e 41 2c 20 63 6f  x, .  int nA, co
128b0 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a 20 20  nst void *zA,.  
128c0 69 6e 74 20 6e 42 2c 20 63 6f 6e 73 74 20 76 6f  int nB, const vo
128d0 69 64 20 2a 7a 42 0a 29 7b 0a 20 20 54 63 6c 5f  id *zB.){.  Tcl_
128e0 49 6e 74 65 72 70 20 2a 69 20 3d 20 70 54 65 73  Interp *i = pTes
128f0 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 3b 0a  tCollateInterp;.
12900 20 20 69 6e 74 20 65 6e 63 69 6e 20 3d 20 53 51    int encin = SQ
12910 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
12920 70 43 74 78 29 3b 0a 20 20 69 6e 74 20 72 65 73  pCtx);.  int res
12930 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 73 71  ;.  int n;..  sq
12940 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
12950 6c 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58  l;.  Tcl_Obj *pX
12960 3b 0a 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65  ;..  pX = Tcl_Ne
12970 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74  wStringObj("test
12980 5f 63 6f 6c 6c 61 74 65 22 2c 20 2d 31 29 3b 0a  _collate", -1);.
12990 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
129a0 6e 74 28 70 58 29 3b 0a 0a 20 20 73 77 69 74 63  nt(pX);..  switc
129b0 68 28 20 65 6e 63 69 6e 20 29 7b 0a 20 20 20 20  h( encin ){.    
129c0 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46 38  case SQLITE_UTF8
129d0 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74  :.      Tcl_List
129e0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
129f0 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72  (i,pX,Tcl_NewStr
12a00 69 6e 67 4f 62 6a 28 22 55 54 46 2d 38 22 2c 2d  ingObj("UTF-8",-
12a10 31 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  1));.      break
12a20 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
12a30 45 5f 55 54 46 31 36 4c 45 3a 0a 20 20 20 20 20  E_UTF16LE:.     
12a40 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
12a50 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54  ndElement(i,pX,T
12a60 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
12a70 22 55 54 46 2d 31 36 4c 45 22 2c 2d 31 29 29 3b  "UTF-16LE",-1));
12a80 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
12a90 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54    case SQLITE_UT
12aa0 46 31 36 42 45 3a 0a 20 20 20 20 20 20 54 63 6c  F16BE:.      Tcl
12ab0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
12ac0 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e  ement(i,pX,Tcl_N
12ad0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46  ewStringObj("UTF
12ae0 2d 31 36 42 45 22 2c 2d 31 29 29 3b 0a 20 20 20  -16BE",-1));.   
12af0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
12b00 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73  fault:.      ass
12b10 65 72 74 28 30 29 3b 0a 20 20 7d 0a 0a 20 20 73  ert(0);.  }..  s
12b20 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
12b30 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 56 61  nMalloc();.  pVa
12b40 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  l = sqlite3Value
12b50 4e 65 77 28 30 29 3b 0a 20 20 69 66 28 20 70 56  New(0);.  if( pV
12b60 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
12b70 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61  3ValueSetStr(pVa
12b80 6c 2c 20 6e 41 2c 20 7a 41 2c 20 65 6e 63 69 6e  l, nA, zA, encin
12b90 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
12ba0 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65  ;.    n = sqlite
12bb0 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 56  3_value_bytes(pV
12bc0 61 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  al);.    Tcl_Lis
12bd0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
12be0 74 28 69 2c 70 58 2c 0a 20 20 20 20 20 20 20 20  t(i,pX,.        
12bf0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
12c00 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  ((char*)sqlite3_
12c10 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29  value_text(pVal)
12c20 2c 6e 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ,n));.    sqlite
12c30 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61  3ValueSetStr(pVa
12c40 6c 2c 20 6e 42 2c 20 7a 42 2c 20 65 6e 63 69 6e  l, nB, zB, encin
12c50 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
12c60 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65  ;.    n = sqlite
12c70 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 56  3_value_bytes(pV
12c80 61 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  al);.    Tcl_Lis
12c90 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
12ca0 74 28 69 2c 70 58 2c 0a 20 20 20 20 20 20 20 20  t(i,pX,.        
12cb0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
12cc0 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  ((char*)sqlite3_
12cd0 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29  value_text(pVal)
12ce0 2c 6e 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ,n));.    sqlite
12cf0 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
12d00 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
12d10 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
12d20 3b 0a 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  ;..  Tcl_EvalObj
12d30 45 78 28 69 2c 20 70 58 2c 20 30 29 3b 0a 20 20  Ex(i, pX, 0);.  
12d40 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
12d50 28 70 58 29 3b 0a 20 20 54 63 6c 5f 47 65 74 49  (pX);.  Tcl_GetI
12d60 6e 74 46 72 6f 6d 4f 62 6a 28 69 2c 20 54 63 6c  ntFromObj(i, Tcl
12d70 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 29  _GetObjResult(i)
12d80 2c 20 26 72 65 73 29 3b 0a 20 20 72 65 74 75 72  , &res);.  retur
12d90 6e 20 72 65 73 3b 0a 7d 0a 73 74 61 74 69 63 20  n res;.}.static 
12da0 69 6e 74 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65  int test_collate
12db0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
12dc0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
12dd0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
12de0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
12df0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
12e00 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
12e10 62 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20  b;.  int val;.  
12e20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
12e30 56 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  Val;.  int rc;..
12e40 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 20    if( objc!=5 ) 
12e50 67 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20  goto bad_args;. 
12e60 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74   pTestCollateInt
12e70 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
12e80 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
12e90 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
12ea0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
12eb0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
12ec0 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28  CL_ERROR;..  if(
12ed0 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74   TCL_OK!=Tcl_Get
12ee0 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
12ef0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
12f00 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &val) ) return T
12f10 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
12f20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
12f30 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 74  collation(db, "t
12f40 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53 51  est_collate", SQ
12f50 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20  LITE_UTF8, .    
12f60 20 20 20 20 20 20 28 76 6f 69 64 20 2a 29 53 51        (void *)SQ
12f70 4c 49 54 45 5f 55 54 46 38 2c 20 76 61 6c 3f 74  LITE_UTF8, val?t
12f80 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63  est_collate_func
12f90 3a 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  :0);.  if( rc==S
12fa0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12fb0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 55 74 66  const void *zUtf
12fc0 31 36 3b 0a 20 20 20 20 69 66 28 20 54 43 4c 5f  16;.    if( TCL_
12fd0 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  OK!=Tcl_GetBoole
12fe0 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
12ff0 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29  , objv[3], &val)
13000 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
13010 52 4f 52 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ROR;.    rc = sq
13020 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
13030 6c 61 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74  lation(db, "test
13040 5f 63 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54  _collate", SQLIT
13050 45 5f 55 54 46 31 36 4c 45 2c 20 0a 20 20 20 20  E_UTF16LE, .    
13060 20 20 20 20 20 20 20 20 28 76 6f 69 64 20 2a 29          (void *)
13070 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20  SQLITE_UTF16LE, 
13080 76 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61 74 65  val?test_collate
13090 5f 66 75 6e 63 3a 30 29 3b 0a 20 20 20 20 69 66  _func:0);.    if
130a0 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65  ( TCL_OK!=Tcl_Ge
130b0 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
130c0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
130d0 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20   &val) ) return 
130e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 23 69 66 20  TCL_ERROR;..#if 
130f0 30 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  0.    if( sqlite
13100 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 3e 30 20  3_iMallocFail>0 
13110 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13120 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 2b 2b 3b 0a  _iMallocFail++;.
13130 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
13140 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
13150 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
13160 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69  .    pVal = sqli
13170 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b  te3ValueNew(db);
13180 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
13190 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31  eSetStr(pVal, -1
131a0 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  , "test_collate"
131b0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
131c0 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
131d0 20 20 20 7a 55 74 66 31 36 20 3d 20 73 71 6c 69     zUtf16 = sqli
131e0 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61  te3ValueText(pVa
131f0 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  l, SQLITE_UTF16N
13200 41 54 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20  ATIVE);.    if( 
13210 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
13220 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
13230 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
13240 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
13250 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
13260 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 64 62  e_collation16(db
13270 2c 20 7a 55 74 66 31 36 2c 20 53 51 4c 49 54 45  , zUtf16, SQLITE
13280 5f 55 54 46 31 36 42 45 2c 20 0a 20 20 20 20 20  _UTF16BE, .     
13290 20 20 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c       (void *)SQL
132a0 49 54 45 5f 55 54 46 31 36 42 45 2c 20 76 61 6c  ITE_UTF16BE, val
132b0 3f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75  ?test_collate_fu
132c0 6e 63 3a 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  nc:0);.    }.   
132d0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
132e0 65 28 70 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c  e(pVal);.    sql
132f0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
13300 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d  (db->mutex);.  }
13310 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
13320 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
13330 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
13340 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
13350 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
13360 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
13370 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
13380 65 72 70 2c 20 73 71 6c 69 74 65 33 54 65 73 74  erp, sqlite3Test
13390 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30  ErrorName(rc), 0
133a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
133b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
133c0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 62  eturn TCL_OK;..b
133d0 61 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 41  ad_args:.  Tcl_A
133e0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
133f0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
13400 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
13410 2c 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  ,.      Tcl_GetS
13420 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
13430 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 44 42 3e  v[0], 0), " <DB>
13440 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65   <utf8> <utf16le
13450 3e 20 3c 75 74 66 31 36 62 65 3e 22 2c 20 30 29  > <utf16be>", 0)
13460 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ;.  return TCL_E
13470 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  RROR;.}../*.** W
13480 68 65 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  hen the collatio
13490 6e 20 6e 65 65 64 65 64 20 63 61 6c 6c 62 61 63  n needed callbac
134a0 6b 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 72 65  k is invoked, re
134b0 63 6f 72 64 20 74 68 65 20 6e 61 6d 65 20 6f 66  cord the name of
134c0 20 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74   .** the request
134d0 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  ed collating fun
134e0 63 74 69 6f 6e 20 68 65 72 65 2e 20 20 54 68 65  ction here.  The
134f0 20 72 65 63 6f 72 64 65 64 20 6e 61 6d 65 20 69   recorded name i
13500 73 20 6c 69 6e 6b 65 64 0a 2a 2a 20 74 6f 20 61  s linked.** to a
13510 20 54 43 4c 20 76 61 72 69 61 62 6c 65 20 61 6e   TCL variable an
13520 64 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73  d used to make s
13530 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65 71  ure that the req
13540 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  uested collation
13550 0a 2a 2a 20 6e 61 6d 65 20 69 73 20 63 6f 72 72  .** name is corr
13560 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ect..*/.static c
13570 68 61 72 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61  har zNeededColla
13580 74 69 6f 6e 5b 32 30 30 5d 3b 0a 73 74 61 74 69  tion[200];.stati
13590 63 20 63 68 61 72 20 2a 70 7a 4e 65 65 64 65 64  c char *pzNeeded
135a0 43 6f 6c 6c 61 74 69 6f 6e 20 3d 20 7a 4e 65 65  Collation = zNee
135b0 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 3b 0a 0a 0a  dedCollation;...
135c0 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20 77 68 65  /*.** Called whe
135d0 6e 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  n a collating se
135e0 71 75 65 6e 63 65 20 69 73 20 6e 65 65 64 65 64  quence is needed
135f0 2e 20 20 52 65 67 69 73 74 65 72 65 64 20 75 73  .  Registered us
13600 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63  ing.** sqlite3_c
13610 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31  ollation_needed1
13620 36 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  6()..*/.static v
13630 6f 69 64 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65  oid test_collate
13640 5f 6e 65 65 64 65 64 5f 63 62 28 0a 20 20 76 6f  _needed_cb(.  vo
13650 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 73 71 6c  id *pCtx, .  sql
13660 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20  ite3 *db,.  int 
13670 65 54 65 78 74 52 65 70 2c 0a 20 20 63 6f 6e 73  eTextRep,.  cons
13680 74 20 76 6f 69 64 20 2a 70 4e 61 6d 65 0a 29 7b  t void *pName.){
13690 0a 20 20 69 6e 74 20 65 6e 63 20 3d 20 45 4e 43  .  int enc = ENC
136a0 28 64 62 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  (db);.  int i;. 
136b0 20 63 68 61 72 20 2a 7a 3b 0a 20 20 66 6f 72 28   char *z;.  for(
136c0 7a 20 3d 20 28 63 68 61 72 2a 29 70 4e 61 6d 65  z = (char*)pName
136d0 2c 20 69 3d 30 3b 20 2a 7a 20 7c 7c 20 7a 5b 31  , i=0; *z || z[1
136e0 5d 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ]; z++){.    if(
136f0 20 2a 7a 20 29 20 7a 4e 65 65 64 65 64 43 6f 6c   *z ) zNeededCol
13700 6c 61 74 69 6f 6e 5b 69 2b 2b 5d 20 3d 20 2a 7a  lation[i++] = *z
13710 3b 0a 20 20 7d 0a 20 20 7a 4e 65 65 64 65 64 43  ;.  }.  zNeededC
13720 6f 6c 6c 61 74 69 6f 6e 5b 69 5d 20 3d 20 30 3b  ollation[i] = 0;
13730 0a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  .  sqlite3_creat
13740 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 20  e_collation(.   
13750 20 20 20 64 62 2c 20 22 74 65 73 74 5f 63 6f 6c     db, "test_col
13760 6c 61 74 65 22 2c 20 45 4e 43 28 64 62 29 2c 20  late", ENC(db), 
13770 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54  SQLITE_INT_TO_PT
13780 52 28 65 6e 63 29 2c 20 74 65 73 74 5f 63 6f 6c  R(enc), test_col
13790 6c 61 74 65 5f 66 75 6e 63 29 3b 0a 7d 0a 0a 2f  late_func);.}../
137a0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64 64 5f  *.** Usage: add_
137b0 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65  test_collate_nee
137c0 64 65 64 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63  ded DB.*/.static
137d0 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 6c 61 74   int test_collat
137e0 65 5f 6e 65 65 64 65 64 28 0a 20 20 76 6f 69 64  e_needed(.  void
137f0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
13800 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
13810 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
13820 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
13830 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
13840 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
13850 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
13860 21 3d 32 20 29 20 67 6f 74 6f 20 62 61 64 5f 61  !=2 ) goto bad_a
13870 72 67 73 3b 0a 20 20 69 66 28 20 67 65 74 44 62  rgs;.  if( getDb
13880 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
13890 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
138a0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
138b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
138c0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
138d0 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64  collation_needed
138e0 31 36 28 64 62 2c 20 30 2c 20 74 65 73 74 5f 63  16(db, 0, test_c
138f0 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 5f 63 62  ollate_needed_cb
13900 29 3b 0a 20 20 7a 4e 65 65 64 65 64 43 6f 6c 6c  );.  zNeededColl
13910 61 74 69 6f 6e 5b 30 5d 20 3d 20 30 3b 0a 20 20  ation[0] = 0;.  
13920 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
13930 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
13940 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
13950 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74  TCL_ERROR;.  ret
13960 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 62 61 64  urn TCL_OK;..bad
13970 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 57 72 6f  _args:.  Tcl_Wro
13980 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
13990 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29  , 1, objv, "DB")
139a0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ;.  return TCL_E
139b0 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  RROR;.}../*.** t
139c0 63 6c 63 6d 64 3a 20 20 20 61 64 64 5f 61 6c 69  clcmd:   add_ali
139d0 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c  gnment_test_coll
139e0 61 74 69 6f 6e 73 20 20 44 42 0a 2a 2a 0a 2a 2a  ations  DB.**.**
139f0 20 41 64 64 20 74 77 6f 20 6e 65 77 20 63 6f 6c   Add two new col
13a00 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
13a10 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
13a20 20 44 42 0a 2a 2a 0a 2a 2a 20 20 20 20 20 75 74   DB.**.**     ut
13a30 66 31 36 5f 61 6c 69 67 6e 65 64 0a 2a 2a 20 20  f16_aligned.**  
13a40 20 20 20 75 74 66 31 36 5f 75 6e 61 6c 69 67 6e     utf16_unalign
13a50 65 64 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 63 6f  ed.**.** Both co
13a60 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
13a70 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 73  s use the same s
13a80 6f 72 74 20 6f 72 64 65 72 20 61 73 20 42 49 4e  ort order as BIN
13a90 41 52 59 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79  ARY..** The only
13aa0 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 20 74   difference is t
13ab0 68 61 74 20 74 68 65 20 75 74 66 31 36 5f 61 6c  hat the utf16_al
13ac0 69 67 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 0a  igned collating.
13ad0 2a 2a 20 73 65 71 75 65 6e 63 65 20 69 73 20 64  ** sequence is d
13ae0 65 63 6c 61 72 65 64 20 77 69 74 68 20 74 68 65  eclared with the
13af0 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c   SQLITE_UTF16_AL
13b00 49 47 4e 45 44 20 66 6c 61 67 2e 0a 2a 2a 20 42  IGNED flag..** B
13b10 6f 74 68 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  oth collating fu
13b20 6e 63 74 69 6f 6e 73 20 69 6e 63 72 65 6d 65 6e  nctions incremen
13b30 74 20 74 68 65 20 75 6e 61 6c 69 67 6e 65 64 20  t the unaligned 
13b40 75 74 66 31 36 20 63 6f 75 6e 74 65 72 0a 2a 2a  utf16 counter.**
13b50 20 77 68 65 6e 65 76 65 72 20 74 68 65 79 20 73   whenever they s
13b60 65 65 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  ee a string that
13b70 20 62 65 67 69 6e 73 20 6f 6e 20 61 6e 20 6f 64   begins on an od
13b80 64 20 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e  d byte boundary.
13b90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
13ba0 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f  naligned_string_
13bb0 63 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 73 74 61  counter = 0;.sta
13bc0 74 69 63 20 69 6e 74 20 61 6c 69 67 6e 6d 65 6e  tic int alignmen
13bd0 74 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76 6f 69  tCollFunc(.  voi
13be0 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e  d *NotUsed,.  in
13bf0 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
13c00 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e  oid *pKey1,.  in
13c10 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76  t nKey2, const v
13c20 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20  oid *pKey2.){.  
13c30 69 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d  int rc, n;.  n =
13c40 20 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e   nKey1<nKey2 ? n
13c50 4b 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20  Key1 : nKey2;.  
13c60 69 66 28 20 6e 4b 65 79 31 3e 30 20 26 26 20 31  if( nKey1>0 && 1
13c70 3d 3d 28 31 26 28 53 51 4c 49 54 45 5f 50 54 52  ==(1&(SQLITE_PTR
13c80 5f 54 4f 5f 49 4e 54 28 70 4b 65 79 31 29 29 29  _TO_INT(pKey1)))
13c90 20 29 20 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72   ) unaligned_str
13ca0 69 6e 67 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  ing_counter++;. 
13cb0 20 69 66 28 20 6e 4b 65 79 32 3e 30 20 26 26 20   if( nKey2>0 && 
13cc0 31 3d 3d 28 31 26 28 53 51 4c 49 54 45 5f 50 54  1==(1&(SQLITE_PT
13cd0 52 5f 54 4f 5f 49 4e 54 28 70 4b 65 79 32 29 29  R_TO_INT(pKey2))
13ce0 29 20 29 20 75 6e 61 6c 69 67 6e 65 64 5f 73 74  ) ) unaligned_st
13cf0 72 69 6e 67 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a  ring_counter++;.
13d00 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b    rc = memcmp(pK
13d10 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a  ey1, pKey2, n);.
13d20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20    if( rc==0 ){. 
13d30 20 20 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d 20     rc = nKey1 - 
13d40 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74  nKey2;.  }.  ret
13d50 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63  urn rc;.}.static
13d60 20 69 6e 74 20 61 64 64 5f 61 6c 69 67 6e 6d 65   int add_alignme
13d70 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f  nt_test_collatio
13d80 6e 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ns(.  void * cli
13d90 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
13da0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
13db0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
13dc0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
13dd0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
13de0 2a 64 62 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3e  *db;.  if( objc>
13df0 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65  =2 ){.    if( ge
13e00 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
13e10 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
13e20 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
13e30 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
13e40 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  OR;.    sqlite3_
13e50 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
13e60 28 64 62 2c 20 22 75 74 66 31 36 5f 75 6e 61 6c  (db, "utf16_unal
13e70 69 67 6e 65 64 22 2c 20 53 51 4c 49 54 45 5f 55  igned", SQLITE_U
13e80 54 46 31 36 2c 20 0a 20 20 20 20 20 20 20 20 30  TF16, .        0
13e90 2c 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c 46  , alignmentCollF
13ea0 75 6e 63 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  unc);.    sqlite
13eb0 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
13ec0 6f 6e 28 64 62 2c 20 22 75 74 66 31 36 5f 61 6c  on(db, "utf16_al
13ed0 69 67 6e 65 64 22 2c 20 53 51 4c 49 54 45 5f 55  igned", SQLITE_U
13ee0 54 46 31 36 5f 41 4c 49 47 4e 45 44 2c 20 0a 20  TF16_ALIGNED, . 
13ef0 20 20 20 20 20 20 20 30 2c 20 61 6c 69 67 6e 6d         0, alignm
13f00 65 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b 0a 20 20  entCollFunc);.  
13f10 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
13f20 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  E_OK;.}.#endif /
13f30 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
13f40 45 5f 4f 4d 49 54 5f 55 54 46 31 36 29 20 2a 2f  E_OMIT_UTF16) */
13f50 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61  ../*.** Usage: a
13f60 64 64 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  dd_test_function
13f70 20 3c 64 62 20 70 74 72 3e 20 3c 75 74 66 38 3e   <db ptr> <utf8>
13f80 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31   <utf16le> <utf1
13f90 36 62 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  6be>.**.** This 
13fa0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
13fb0 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
13fc0 4c 69 74 65 20 73 65 6c 65 63 74 73 20 74 68 65  Lite selects the
13fd0 20 63 6f 72 72 65 63 74 20 75 73 65 72 0a 2a 2a   correct user.**
13fe0 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 62 61   function callba
13ff0 63 6b 20 77 68 65 6e 20 6d 75 6c 74 69 70 6c 65  ck when multiple
14000 20 76 65 72 73 69 6f 6e 73 20 28 66 6f 72 20 64   versions (for d
14010 69 66 66 65 72 65 6e 74 20 74 65 78 74 20 65 6e  ifferent text en
14020 63 6f 64 69 6e 67 73 29 0a 2a 2a 20 61 72 65 20  codings).** are 
14030 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  available..**.**
14040 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   Calling this ro
14050 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 20  utine registers 
14060 75 70 20 74 6f 20 74 68 72 65 65 20 76 65 72 73  up to three vers
14070 69 6f 6e 73 20 6f 66 20 74 68 65 20 75 73 65 72  ions of the user
14080 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 22 74 65   function.** "te
14090 73 74 5f 66 75 6e 63 74 69 6f 6e 22 20 77 69 74  st_function" wit
140a0 68 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  h database handl
140b0 65 20 3c 64 62 3e 2e 20 20 49 66 20 74 68 65 20  e <db>.  If the 
140c0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
140d0 69 73 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 6e  is.** true, then
140e0 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 65   a version of te
140f0 73 74 5f 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  st_function is r
14100 65 67 69 73 74 65 72 65 64 20 66 6f 72 20 55 54  egistered for UT
14110 46 2d 38 2c 20 69 66 20 74 68 65 0a 2a 2a 20 74  F-8, if the.** t
14120 68 69 72 64 20 69 73 20 74 72 75 65 2c 20 61 20  hird is true, a 
14130 76 65 72 73 69 6f 6e 20 69 73 20 72 65 67 69 73  version is regis
14140 74 65 72 65 64 20 66 6f 72 20 55 54 46 2d 31 36  tered for UTF-16
14150 6c 65 2c 20 69 66 20 74 68 65 20 66 6f 75 72 74  le, if the fourt
14160 68 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 61 20  h is.** true, a 
14170 55 54 46 2d 31 36 62 65 20 76 65 72 73 69 6f 6e  UTF-16be version
14180 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20   is available.  
14190 50 72 65 76 69 6f 75 73 20 76 65 72 73 69 6f 6e  Previous version
141a0 73 20 6f 66 0a 2a 2a 20 74 65 73 74 5f 66 75 6e  s of.** test_fun
141b0 63 74 69 6f 6e 20 61 72 65 20 64 65 6c 65 74 65  ction are delete
141c0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 75 73 65  d..**.** The use
141d0 72 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d  r function is im
141e0 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 61 6c  plemented by cal
141f0 6c 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ling the followi
14200 6e 67 20 54 43 4c 20 73 63 72 69 70 74 3a 0a 2a  ng TCL script:.*
14210 2a 0a 2a 2a 20 20 20 22 74 65 73 74 5f 66 75 6e  *.**   "test_fun
14220 63 74 69 6f 6e 20 3c 65 6e 63 3e 20 3c 61 72 67  ction <enc> <arg
14230 3e 22 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65 20 3c  >".**.** Where <
14240 65 6e 63 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55  enc> is one of U
14250 54 46 2d 38 2c 20 55 54 46 2d 31 36 4c 45 20 6f  TF-8, UTF-16LE o
14260 72 20 55 54 46 31 36 42 45 2c 20 61 6e 64 20 3c  r UTF16BE, and <
14270 61 72 67 3e 20 69 73 20 74 68 65 0a 2a 2a 20 73  arg> is the.** s
14280 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 70  ingle argument p
14290 61 73 73 65 64 20 74 6f 20 74 68 65 20 53 51 4c  assed to the SQL
142a0 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 76   function. The v
142b0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
142c0 0a 2a 2a 20 74 68 65 20 54 43 4c 20 73 63 72 69  .** the TCL scri
142d0 70 74 20 69 73 20 75 73 65 64 20 61 73 20 74 68  pt is used as th
142e0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
142f0 66 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74 69  f the SQL functi
14300 6f 6e 2e 20 49 74 0a 2a 2a 20 69 73 20 70 61 73  on. It.** is pas
14310 73 65 64 20 74 6f 20 53 51 4c 69 74 65 20 75 73  sed to SQLite us
14320 69 6e 67 20 55 54 46 2d 31 36 42 45 20 66 6f 72  ing UTF-16BE for
14330 20 61 20 55 54 46 2d 38 20 74 65 73 74 5f 66 75   a UTF-8 test_fu
14340 6e 63 74 69 6f 6e 28 29 2c 20 55 54 46 2d 38 0a  nction(), UTF-8.
14350 2a 2a 20 66 6f 72 20 61 20 55 54 46 2d 31 36 4c  ** for a UTF-16L
14360 45 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 28  E test_function(
14370 29 2c 20 61 6e 64 20 55 54 46 2d 31 36 4c 45 20  ), and UTF-16LE 
14380 66 6f 72 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74  for an implement
14390 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 70 72  ation that.** pr
143a0 65 66 65 72 73 20 55 54 46 2d 31 36 42 45 2e 0a  efers UTF-16BE..
143b0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
143c0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 73 74 61  E_OMIT_UTF16.sta
143d0 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 66 75  tic void test_fu
143e0 6e 63 74 69 6f 6e 5f 75 74 66 38 28 0a 20 20 73  nction_utf8(.  s
143f0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
14400 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72  pCtx, .  int nAr
14410 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  g,.  sqlite3_val
14420 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54  ue **argv.){.  T
14430 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
14440 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58  p;.  Tcl_Obj *pX
14450 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ;.  sqlite3_valu
14460 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72  e *pVal;.  inter
14470 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70 20  p = (Tcl_Interp 
14480 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  *)sqlite3_user_d
14490 61 74 61 28 70 43 74 78 29 3b 0a 20 20 70 58 20  ata(pCtx);.  pX 
144a0 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
144b0 62 6a 28 22 74 65 73 74 5f 66 75 6e 63 74 69 6f  bj("test_functio
144c0 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49  n", -1);.  Tcl_I
144d0 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b  ncrRefCount(pX);
144e0 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
144f0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
14500 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53  rp, pX, Tcl_NewS
14510 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 38 22  tringObj("UTF-8"
14520 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
14530 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
14540 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 0a  nt(interp, pX, .
14550 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72        Tcl_NewStr
14560 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71  ingObj((char*)sq
14570 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
14580 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b  (argv[0]), -1));
14590 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  .  Tcl_EvalObjEx
145a0 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 30 29 3b  (interp, pX, 0);
145b0 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
145c0 75 6e 74 28 70 58 29 3b 0a 20 20 73 71 6c 69 74  unt(pX);.  sqlit
145d0 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70  e3_result_text(p
145e0 43 74 78 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  Ctx, Tcl_GetStri
145f0 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  ngResult(interp)
14600 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41  , -1, SQLITE_TRA
14610 4e 53 49 45 4e 54 29 3b 0a 20 20 70 56 61 6c 20  NSIENT);.  pVal 
14620 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
14630 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  w(0);.  sqlite3V
14640 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c  alueSetStr(pVal,
14650 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72 69   -1, Tcl_GetStri
14660 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  ngResult(interp)
14670 2c 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f  , .      SQLITE_
14680 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41  UTF8, SQLITE_STA
14690 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  TIC);.  sqlite3_
146a0 72 65 73 75 6c 74 5f 74 65 78 74 31 36 62 65 28  result_text16be(
146b0 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61  pCtx, sqlite3_va
146c0 6c 75 65 5f 74 65 78 74 31 36 62 65 28 70 56 61  lue_text16be(pVa
146d0 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53 51  l),.      -1, SQ
146e0 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
146f0 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
14700 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 73 74 61  ree(pVal);.}.sta
14710 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 66 75  tic void test_fu
14720 6e 63 74 69 6f 6e 5f 75 74 66 31 36 6c 65 28 0a  nction_utf16le(.
14730 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
14740 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20  t *pCtx, .  int 
14750 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nArg,.  sqlite3_
14760 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
14770 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
14780 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  terp;.  Tcl_Obj 
14790 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  *pX;.  sqlite3_v
147a0 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e  alue *pVal;.  in
147b0 74 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65  terp = (Tcl_Inte
147c0 72 70 20 2a 29 73 71 6c 69 74 65 33 5f 75 73 65  rp *)sqlite3_use
147d0 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20  r_data(pCtx);.  
147e0 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  pX = Tcl_NewStri
147f0 6e 67 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e 63  ngObj("test_func
14800 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63  tion", -1);.  Tc
14810 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
14820 58 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  X);.  Tcl_ListOb
14830 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
14840 6e 74 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e  nterp, pX, Tcl_N
14850 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46  ewStringObj("UTF
14860 2d 31 36 4c 45 22 2c 20 2d 31 29 29 3b 0a 20 20  -16LE", -1));.  
14870 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
14880 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
14890 20 70 58 2c 20 0a 20 20 20 20 20 20 54 63 6c 5f   pX, .      Tcl_
148a0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68  NewStringObj((ch
148b0 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
148c0 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 2c  e_text(argv[0]),
148d0 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61   -1));.  Tcl_Eva
148e0 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70  lObjEx(interp, p
148f0 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63  X, 0);.  Tcl_Dec
14900 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20  rRefCount(pX);. 
14910 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56   pVal = sqlite3V
14920 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73 71  alueNew(0);.  sq
14930 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
14940 28 70 56 61 6c 2c 20 2d 31 2c 20 54 63 6c 5f 47  (pVal, -1, Tcl_G
14950 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69  etStringResult(i
14960 6e 74 65 72 70 29 2c 20 0a 20 20 20 20 20 20 53  nterp), .      S
14970 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
14980 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71  TE_STATIC);.  sq
14990 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
149a0 74 28 70 43 74 78 2c 28 63 68 61 72 2a 29 73 71  t(pCtx,(char*)sq
149b0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
149c0 28 70 56 61 6c 29 2c 2d 31 2c 53 51 4c 49 54 45  (pVal),-1,SQLITE
149d0 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73  _TRANSIENT);.  s
149e0 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
149f0 70 56 61 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20  pVal);.}.static 
14a00 76 6f 69 64 20 74 65 73 74 5f 66 75 6e 63 74 69  void test_functi
14a10 6f 6e 5f 75 74 66 31 36 62 65 28 0a 20 20 73 71  on_utf16be(.  sq
14a20 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
14a30 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67  Ctx, .  int nArg
14a40 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
14a50 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54 63  e **argv.){.  Tc
14a60 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
14a70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b  ;.  Tcl_Obj *pX;
14a80 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
14a90 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72 70   *pVal;.  interp
14aa0 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a   = (Tcl_Interp *
14ab0 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61  )sqlite3_user_da
14ac0 74 61 28 70 43 74 78 29 3b 0a 20 20 70 58 20 3d  ta(pCtx);.  pX =
14ad0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
14ae0 6a 28 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  j("test_function
14af0 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e  ", -1);.  Tcl_In
14b00 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a  crRefCount(pX);.
14b10 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
14b20 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
14b30 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53 74  p, pX, Tcl_NewSt
14b40 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 42  ringObj("UTF-16B
14b50 45 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  E", -1));.  Tcl_
14b60 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
14b70 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c  ment(interp, pX,
14b80 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53   .      Tcl_NewS
14b90 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29  tringObj((char*)
14ba0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
14bb0 78 74 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29  xt(argv[0]), -1)
14bc0 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  );.  Tcl_EvalObj
14bd0 45 78 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 30  Ex(interp, pX, 0
14be0 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  );.  Tcl_DecrRef
14bf0 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 70 56 61  Count(pX);.  pVa
14c00 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  l = sqlite3Value
14c10 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65  New(0);.  sqlite
14c20 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61  3ValueSetStr(pVa
14c30 6c 2c 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74  l, -1, Tcl_GetSt
14c40 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72  ringResult(inter
14c50 70 29 2c 20 0a 20 20 20 20 20 20 53 51 4c 49 54  p), .      SQLIT
14c60 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53  E_UTF8, SQLITE_S
14c70 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65  TATIC);.  sqlite
14c80 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36 28  3_result_text16(
14c90 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61  pCtx, sqlite3_va
14ca0 6c 75 65 5f 74 65 78 74 31 36 6c 65 28 70 56 61  lue_text16le(pVa
14cb0 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53 51  l),.      -1, SQ
14cc0 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
14cd0 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
14ce0 74 5f 74 65 78 74 31 36 62 65 28 70 43 74 78 2c  t_text16be(pCtx,
14cf0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
14d00 65 78 74 31 36 6c 65 28 70 56 61 6c 29 2c 0a 20  ext16le(pVal),. 
14d10 20 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f       -1, SQLITE_
14d20 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71  TRANSIENT);.  sq
14d30 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
14d40 74 31 36 6c 65 28 70 43 74 78 2c 20 73 71 6c 69  t16le(pCtx, sqli
14d50 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36  te3_value_text16
14d60 6c 65 28 70 56 61 6c 29 2c 0a 20 20 20 20 20 20  le(pVal),.      
14d70 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
14d80 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  IENT);.  sqlite3
14d90 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
14da0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
14db0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
14dc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
14dd0 74 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 76 6f  t_function(.  vo
14de0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
14df0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
14e00 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
14e10 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
14e20 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69  NST objv[].){.#i
14e30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14e40 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65  T_UTF16.  sqlite
14e50 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 76 61 6c  3 *db;.  int val
14e60 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35  ;..  if( objc!=5
14e70 20 29 20 67 6f 74 6f 20 62 61 64 5f 61 72 67 73   ) goto bad_args
14e80 3b 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  ;.  if( getDbPoi
14e90 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
14ea0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
14eb0 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
14ec0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
14ed0 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c   if( TCL_OK!=Tcl
14ee0 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
14ef0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
14f00 32 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75  2], &val) ) retu
14f10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
14f20 69 66 28 20 76 61 6c 20 29 7b 0a 20 20 20 20 73  if( val ){.    s
14f30 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
14f40 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74  nction(db, "test
14f50 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 31 2c 20 53  _function", 1, S
14f60 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20  QLITE_UTF8, .   
14f70 20 20 20 20 20 69 6e 74 65 72 70 2c 20 74 65 73       interp, tes
14f80 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 38 2c  t_function_utf8,
14f90 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66   0, 0);.  }.  if
14fa0 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65  ( TCL_OK!=Tcl_Ge
14fb0 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
14fc0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
14fd0 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20   &val) ) return 
14fe0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
14ff0 20 76 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69   val ){.    sqli
15000 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
15010 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 66 75  ion(db, "test_fu
15020 6e 63 74 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49  nction", 1, SQLI
15030 54 45 5f 55 54 46 31 36 4c 45 2c 20 0a 20 20 20  TE_UTF16LE, .   
15040 20 20 20 20 20 69 6e 74 65 72 70 2c 20 74 65 73       interp, tes
15050 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36  t_function_utf16
15060 6c 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  le, 0, 0);.  }. 
15070 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c   if( TCL_OK!=Tcl
15080 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
15090 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
150a0 34 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75  4], &val) ) retu
150b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
150c0 69 66 28 20 76 61 6c 20 29 7b 0a 20 20 20 20 73  if( val ){.    s
150d0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
150e0 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74  nction(db, "test
150f0 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 31 2c 20 53  _function", 1, S
15100 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20 0a  QLITE_UTF16BE, .
15110 20 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20          interp, 
15120 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74  test_function_ut
15130 66 31 36 62 65 2c 20 30 2c 20 30 29 3b 0a 20 20  f16be, 0, 0);.  
15140 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
15150 4f 4b 3b 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20  OK;.bad_args:.  
15160 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
15170 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
15180 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
15190 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 54 63 6c  e \"",.      Tcl
151a0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
151b0 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
151c0 20 3c 44 42 3e 20 3c 75 74 66 38 3e 20 3c 75 74   <DB> <utf8> <ut
151d0 66 31 36 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e  f16le> <utf16be>
151e0 22 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  ", 0);.#endif /*
151f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
15200 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54  16 */.  return T
15210 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a  CL_ERROR;.}../*.
15220 2a 2a 20 55 73 61 67 65 3a 20 20 20 20 20 20 20  ** Usage:       
15230 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 65    sqlite3_test_e
15240 72 72 73 74 72 20 3c 65 72 72 20 63 6f 64 65 3e  rrstr <err code>
15250 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 61 74  .**.** Test that
15260 20 74 68 65 20 65 6e 67 6c 69 73 68 20 6c 61 6e   the english lan
15270 67 75 61 67 65 20 73 74 72 69 6e 67 20 65 71 75  guage string equ
15280 69 76 61 6c 65 6e 74 73 20 66 6f 72 20 73 71 6c  ivalents for sql
15290 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 73 0a  ite error codes.
152a0 2a 2a 20 61 72 65 20 73 61 6e 65 2e 20 54 68 65  ** are sane. The
152b0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 6e   parameter is an
152c0 20 69 6e 74 65 67 65 72 20 72 65 70 72 65 73 65   integer represe
152d0 6e 74 69 6e 67 20 61 6e 20 73 71 6c 69 74 65 20  nting an sqlite 
152e0 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 54  error code..** T
152f0 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 6c  he result is a l
15300 69 73 74 20 6f 66 20 74 77 6f 20 65 6c 65 6d 65  ist of two eleme
15310 6e 74 73 2c 20 74 68 65 20 73 74 72 69 6e 67 20  nts, the string 
15320 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
15330 66 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 20 63  f the.** error c
15340 6f 64 65 20 61 6e 64 20 74 68 65 20 65 6e 67 6c  ode and the engl
15350 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70  ish language exp
15360 6c 61 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  lanation..*/.sta
15370 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72 72  tic int test_err
15380 73 74 72 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  str(.  void * cl
15390 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
153a0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
153b0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
153c0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
153d0 76 5b 5d 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a  v[].){.  char *z
153e0 43 6f 64 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Code;.  int i;. 
153f0 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a   if( objc!=1 ){.
15400 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
15410 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
15420 6f 62 6a 76 2c 20 22 3c 65 72 72 6f 72 20 63 6f  objv, "<error co
15430 64 65 3e 22 29 3b 0a 20 20 7d 0a 0a 20 20 7a 43  de>");.  }..  zC
15440 6f 64 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ode = Tcl_GetStr
15450 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20  ing(objv[1]);.  
15460 66 6f 72 28 69 3d 30 3b 20 69 3c 32 30 30 3b 20  for(i=0; i<200; 
15470 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 30 3d  i++){.    if( 0=
15480 3d 73 74 72 63 6d 70 28 74 31 45 72 72 6f 72 4e  =strcmp(t1ErrorN
15490 61 6d 65 28 69 29 2c 20 7a 43 6f 64 65 29 20 29  ame(i), zCode) )
154a0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 54 63   break;.  }.  Tc
154b0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
154c0 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69  rp, (char *)sqli
154d0 74 65 33 45 72 72 53 74 72 28 69 29 2c 20 30 29  te3ErrStr(i), 0)
154e0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
154f0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
15500 65 3a 20 20 20 20 62 72 65 61 6b 70 6f 69 6e 74  e:    breakpoint
15510 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
15520 69 6e 65 20 65 78 69 73 74 73 20 66 6f 72 20 6f  ine exists for o
15530 6e 65 20 70 75 72 70 6f 73 65 20 2d 20 74 6f 20  ne purpose - to 
15540 70 72 6f 76 69 64 65 20 61 20 70 6c 61 63 65 20  provide a place 
15550 74 6f 20 70 75 74 20 61 0a 2a 2a 20 62 72 65 61  to put a.** brea
15560 6b 70 6f 69 6e 74 20 77 69 74 68 20 47 44 42 20  kpoint with GDB 
15570 74 68 61 74 20 63 61 6e 20 62 65 20 74 72 69 67  that can be trig
15580 67 65 72 65 64 20 75 73 69 6e 67 20 54 43 4c 20  gered using TCL 
15590 63 6f 64 65 2e 20 20 54 68 65 20 75 73 65 0a 2a  code.  The use.*
155a0 2a 20 66 6f 72 20 74 68 69 73 20 69 73 20 77 68  * for this is wh
155b0 65 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  en a particular 
155c0 74 65 73 74 20 66 61 69 6c 73 20 6f 6e 20 28 73  test fails on (s
155d0 61 79 29 20 74 68 65 20 31 34 38 35 74 68 20 69  ay) the 1485th i
155e0 74 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 20  teration..** In 
155f0 74 68 65 20 54 43 4c 20 74 65 73 74 20 73 63 72  the TCL test scr
15600 69 70 74 2c 20 77 65 20 63 61 6e 20 61 64 64 20  ipt, we can add 
15610 63 6f 64 65 20 6c 69 6b 65 20 74 68 69 73 3a 0a  code like this:.
15620 2a 2a 0a 2a 2a 20 20 20 20 20 69 66 20 7b 24 69  **.**     if {$i
15630 3d 3d 31 34 38 35 7d 20 62 72 65 61 6b 70 6f 69  ==1485} breakpoi
15640 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 72 75  nt.**.** Then ru
15650 6e 20 74 65 73 74 66 69 78 74 75 72 65 20 69 6e  n testfixture in
15660 20 74 68 65 20 64 65 62 75 67 67 65 72 20 61 6e   the debugger an
15670 64 20 77 61 69 74 20 66 6f 72 20 74 68 65 20 62  d wait for the b
15680 72 65 61 6b 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20  reakpoint to.** 
15690 66 69 72 65 2e 20 20 54 68 65 6e 20 61 64 64 69  fire.  Then addi
156a0 74 69 6f 6e 61 6c 20 62 72 65 61 6b 70 6f 69 6e  tional breakpoin
156b0 74 73 20 63 61 6e 20 62 65 20 73 65 74 20 74 6f  ts can be set to
156c0 20 74 72 61 63 65 20 64 6f 77 6e 20 74 68 65 20   trace down the 
156d0 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  bug..*/.static i
156e0 6e 74 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69  nt test_breakpoi
156f0 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  nt(.  void *NotU
15700 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
15710 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
15720 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
15730 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
15740 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
15750 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
15760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
15770 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
15780 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
15790 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
157a0 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
157b0 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 72  gument */.){.  r
157c0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 20  eturn TCL_OK;   
157d0 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68        /* Do noth
157e0 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ing */.}../*.** 
157f0 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
15800 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 20 20  _bind_zeroblob  
15810 53 54 4d 54 20 49 44 58 20 4e 0a 2a 2a 0a 2a 2a  STMT IDX N.**.**
15820 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65   Test the sqlite
15830 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 20  3_bind_zeroblob 
15840 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54  interface.  STMT
15850 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73   is a prepared s
15860 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 49 44 58  tatement..** IDX
15870 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
15880 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74   a wildcard in t
15890 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
158a0 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d  ement.  This com
158b0 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20  mand.** binds a 
158c0 4e 2d 62 79 74 65 20 7a 65 72 6f 2d 66 69 6c 6c  N-byte zero-fill
158d0 65 64 20 42 4c 4f 42 20 74 6f 20 74 68 65 20 77  ed BLOB to the w
158e0 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74  ildcard..*/.stat
158f0 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
15900 5f 7a 65 72 6f 62 6c 6f 62 28 0a 20 20 76 6f 69  _zeroblob(.  voi
15910 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
15920 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
15930 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
15940 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
15950 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
15960 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
15970 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  mt;.  int idx;. 
15980 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 72 63   int n;.  int rc
15990 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  ;..  if( objc!=4
159a0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
159b0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
159c0 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20   1, objv, "STMT 
159d0 49 44 58 20 4e 22 29 3b 0a 20 20 20 20 72 65 74  IDX N");.    ret
159e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
159f0 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
15a00 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
15a10 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
15a20 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
15a30 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
15a40 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
15a50 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
15a60 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69  erp, objv[2], &i
15a70 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  dx) ) return TCL
15a80 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
15a90 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
15aa0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
15ab0 20 26 6e 29 20 29 20 72 65 74 75 72 6e 20 54 43   &n) ) return TC
15ac0 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
15ad0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65   sqlite3_bind_ze
15ae0 72 6f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 64  roblob(pStmt, id
15af0 78 2c 20 6e 29 3b 0a 20 20 69 66 28 20 73 71 6c  x, n);.  if( sql
15b00 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
15b10 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62  interp, StmtToDb
15b20 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72  (pStmt), rc) ) r
15b30 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
15b40 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
15b50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
15b60 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15b70 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
15b80 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
15b90 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ge:   sqlite3_bi
15ba0 6e 64 5f 69 6e 74 20 20 53 54 4d 54 20 4e 20 56  nd_int  STMT N V
15bb0 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  ALUE.**.** Test 
15bc0 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
15bd0 5f 69 6e 74 20 69 6e 74 65 72 66 61 63 65 2e 20  _int interface. 
15be0 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61   STMT is a prepa
15bf0 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  red statement..*
15c00 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78  * N is the index
15c10 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69   of a wildcard i
15c20 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
15c30 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20  tatement.  This 
15c40 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73  command.** binds
15c50 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
15c60 72 20 56 41 4c 55 45 20 74 6f 20 74 68 61 74 20  r VALUE to that 
15c70 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61  wildcard..*/.sta
15c80 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
15c90 64 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20  d_int(.  void * 
15ca0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
15cb0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
15cc0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
15cd0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
15ce0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
15cf0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
15d00 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74    int idx;.  int
15d10 20 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63   value;.  int rc
15d20 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  ;..  if( objc!=4
15d30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
15d40 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
15d50 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
15d60 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
15d70 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
15d80 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
15d90 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20  [0], 0), " STMT 
15da0 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20  N VALUE", 0);.  
15db0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
15dc0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
15dd0 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
15de0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
15df0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
15e00 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
15e10 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
15e20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
15e30 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
15e40 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72  ], &idx) ) retur
15e50 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
15e60 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
15e70 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
15e80 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20 29 20  v[3], &value) ) 
15e90 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15ea0 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
15eb0 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74  3_bind_int(pStmt
15ec0 2c 20 69 64 78 2c 20 76 61 6c 75 65 29 3b 0a 20  , idx, value);. 
15ed0 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
15ee0 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
15ef0 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c  StmtToDb(pStmt),
15f00 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
15f10 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
15f20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15f30 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
15f40 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  RROR;.  }..  ret
15f50 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
15f60 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
15f70 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
15f80 34 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a  4  STMT N VALUE.
15f90 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73  **.** Test the s
15fa0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
15fb0 34 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54  4 interface.  ST
15fc0 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64  MT is a prepared
15fd0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e   statement..** N
15fe0 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
15ff0 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74   a wildcard in t
16000 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
16010 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d  ement.  This com
16020 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20  mand.** binds a 
16030 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 56  64-bit integer V
16040 41 4c 55 45 20 74 6f 20 74 68 61 74 20 77 69 6c  ALUE to that wil
16050 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  dcard..*/.static
16060 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 69   int test_bind_i
16070 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 20 63  nt64(.  void * c
16080 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
16090 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
160a0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
160b0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
160c0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
160d0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
160e0 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 36 34 20   int idx;.  i64 
160f0 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b  value;.  int rc;
16100 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20  ..  if( objc!=4 
16110 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
16120 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
16130 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
16140 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
16150 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
16160 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
16170 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e  0], 0), " STMT N
16180 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20   VALUE", 0);.   
16190 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
161a0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
161b0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
161c0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
161d0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
161e0 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
161f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
16200 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
16210 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
16220 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e  , &idx) ) return
16230 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
16240 28 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74  ( Tcl_GetWideInt
16250 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
16260 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29  objv[3], &value)
16270 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
16280 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
16290 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
162a0 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75  pStmt, idx, valu
162b0 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  e);.  if( sqlite
162c0 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
162d0 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53  erp, StmtToDb(pS
162e0 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75  tmt), rc) ) retu
162f0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16300 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16310 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
16320 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
16330 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
16340 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  .}.../*.** Usage
16350 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
16360 5f 64 6f 75 62 6c 65 20 20 53 54 4d 54 20 4e 20  _double  STMT N 
16370 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74  VALUE.**.** Test
16380 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e   the sqlite3_bin
16390 64 5f 64 6f 75 62 6c 65 20 69 6e 74 65 72 66 61  d_double interfa
163a0 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70  ce.  STMT is a p
163b0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
163c0 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69  t..** N is the i
163d0 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61  ndex of a wildca
163e0 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72  rd in the prepar
163f0 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ed statement.  T
16400 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62  his command.** b
16410 69 6e 64 73 20 61 20 36 34 2d 62 69 74 20 69 6e  inds a 64-bit in
16420 74 65 67 65 72 20 56 41 4c 55 45 20 74 6f 20 74  teger VALUE to t
16430 68 61 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f  hat wildcard..*/
16440 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
16450 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 0a 20 20  _bind_double(.  
16460 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
16470 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
16480 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
16490 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
164a0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
164b0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
164c0 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78  pStmt;.  int idx
164d0 3b 0a 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65  ;.  double value
164e0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f  ;.  int rc;.  co
164f0 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 3b 0a  nst char *zVal;.
16500 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 61 74 69    int i;.  stati
16510 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b  c const struct {
16520 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
16530 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e  *zName;     /* N
16540 61 6d 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  ame of the speci
16550 61 6c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  al floating poin
16560 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 75  t value */.    u
16570 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 55 70 70  nsigned int iUpp
16580 65 72 3b 20 20 20 2f 2a 20 55 70 70 65 72 20 33  er;   /* Upper 3
16590 32 20 62 69 74 73 20 2a 2f 0a 20 20 20 20 75 6e  2 bits */.    un
165a0 73 69 67 6e 65 64 20 69 6e 74 20 69 4c 6f 77 65  signed int iLowe
165b0 72 3b 20 20 20 2f 2a 20 4c 6f 77 65 72 20 33 32  r;   /* Lower 32
165c0 20 62 69 74 73 20 2a 2f 0a 20 20 7d 20 61 53 70   bits */.  } aSp
165d0 65 63 69 61 6c 46 70 5b 5d 20 3d 20 7b 0a 20 20  ecialFp[] = {.  
165e0 20 20 7b 20 20 22 4e 61 4e 22 2c 20 20 20 20 20    {  "NaN",     
165f0 20 30 78 37 66 66 66 66 66 66 66 2c 20 30 78 66   0x7fffffff, 0xf
16600 66 66 66 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b  fffffff },.    {
16610 20 20 22 53 4e 61 4e 22 2c 20 20 20 20 20 30 78    "SNaN",     0x
16620 37 66 66 37 66 66 66 66 2c 20 30 78 66 66 66 66  7ff7ffff, 0xffff
16630 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22  ffff },.    {  "
16640 2d 4e 61 4e 22 2c 20 20 20 20 20 30 78 66 66 66  -NaN",     0xfff
16650 66 66 66 66 66 2c 20 30 78 66 66 66 66 66 66 66  fffff, 0xfffffff
16660 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 53 4e  f },.    {  "-SN
16670 61 4e 22 2c 20 20 20 20 30 78 66 66 66 37 66 66  aN",    0xfff7ff
16680 66 66 2c 20 30 78 66 66 66 66 66 66 66 66 20 7d  ff, 0xffffffff }
16690 2c 0a 20 20 20 20 7b 20 20 22 2b 49 6e 66 22 2c  ,.    {  "+Inf",
166a0 20 20 20 20 20 30 78 37 66 66 30 30 30 30 30 2c       0x7ff00000,
166b0 20 30 78 30 30 30 30 30 30 30 30 20 7d 2c 0a 20   0x00000000 },. 
166c0 20 20 20 7b 20 20 22 2d 49 6e 66 22 2c 20 20 20     {  "-Inf",   
166d0 20 20 30 78 66 66 66 30 30 30 30 30 2c 20 30 78    0xfff00000, 0x
166e0 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20  00000000 },.    
166f0 7b 20 20 22 45 70 73 69 6c 6f 6e 22 2c 20 20 30  {  "Epsilon",  0
16700 78 30 30 30 30 30 30 30 30 2c 20 30 78 30 30 30  x00000000, 0x000
16710 30 30 30 30 31 20 7d 2c 0a 20 20 20 20 7b 20 20  00001 },.    {  
16720 22 2d 45 70 73 69 6c 6f 6e 22 2c 20 30 78 38 30  "-Epsilon", 0x80
16730 30 30 30 30 30 30 2c 20 30 78 30 30 30 30 30 30  000000, 0x000000
16740 30 31 20 7d 2c 0a 20 20 20 20 7b 20 20 22 4e 61  01 },.    {  "Na
16750 4e 30 22 2c 20 20 20 20 20 30 78 37 66 66 38 30  N0",     0x7ff80
16760 30 30 30 2c 20 30 78 30 30 30 30 30 30 30 30 20  000, 0x00000000 
16770 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 4e 61 4e 30  },.    {  "-NaN0
16780 22 2c 20 20 20 20 30 78 66 66 66 38 30 30 30 30  ",    0xfff80000
16790 2c 20 30 78 30 30 30 30 30 30 30 30 20 7d 2c 0a  , 0x00000000 },.
167a0 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63    };..  if( objc
167b0 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
167c0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
167d0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
167e0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
167f0 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
16800 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
16810 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54  bjv[0], 0), " ST
16820 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b  MT N VALUE", 0);
16830 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
16840 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
16850 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
16860 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
16870 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
16880 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
16890 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
168a0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
168b0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
168c0 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65  v[2], &idx) ) re
168d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
168e0 0a 20 20 2f 2a 20 49 6e 74 65 72 63 65 70 74 20  .  /* Intercept 
168f0 74 68 65 20 73 74 72 69 6e 67 20 22 4e 61 4e 22  the string "NaN"
16900 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 61 20   and generate a 
16910 4e 61 4e 20 76 61 6c 75 65 20 66 6f 72 20 69 74  NaN value for it
16920 2e 0a 20 20 2a 2a 20 41 6c 6c 20 6f 74 68 65 72  ..  ** All other
16930 20 73 74 72 69 6e 67 73 20 61 72 65 20 70 61 73   strings are pas
16940 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 54  sed through to T
16950 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d  cl_GetDoubleFrom
16960 4f 62 6a 28 29 2e 0a 20 20 2a 2a 20 54 63 6c 5f  Obj()..  ** Tcl_
16970 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a  GetDoubleFromObj
16980 28 29 20 73 68 6f 75 6c 64 20 75 6e 64 65 72 73  () should unders
16990 74 61 6e 64 20 22 4e 61 4e 22 20 62 75 74 20 73  tand "NaN" but s
169a0 6f 6d 65 20 76 65 72 73 69 6f 6e 73 0a 20 20 2a  ome versions.  *
169b0 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62 75 67 2e  * contain a bug.
169c0 0a 20 20 2a 2f 0a 20 20 7a 56 61 6c 20 3d 20 54  .  */.  zVal = T
169d0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
169e0 76 5b 33 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30  v[3]);.  for(i=0
169f0 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 70 65 63  ; i<sizeof(aSpec
16a00 69 61 6c 46 70 29 2f 73 69 7a 65 6f 66 28 61 53  ialFp)/sizeof(aS
16a10 70 65 63 69 61 6c 46 70 5b 30 5d 29 3b 20 69 2b  pecialFp[0]); i+
16a20 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63  +){.    if( strc
16a30 6d 70 28 61 53 70 65 63 69 61 6c 46 70 5b 69 5d  mp(aSpecialFp[i]
16a40 2e 7a 4e 61 6d 65 2c 20 7a 56 61 6c 29 3d 3d 30  .zName, zVal)==0
16a50 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
16a60 33 5f 75 69 6e 74 36 34 20 78 3b 0a 20 20 20 20  3_uint64 x;.    
16a70 20 20 78 20 3d 20 61 53 70 65 63 69 61 6c 46 70    x = aSpecialFp
16a80 5b 69 5d 2e 69 55 70 70 65 72 3b 0a 20 20 20 20  [i].iUpper;.    
16a90 20 20 78 20 3c 3c 3d 20 33 32 3b 0a 20 20 20 20    x <<= 32;.    
16aa0 20 20 78 20 7c 3d 20 61 53 70 65 63 69 61 6c 46    x |= aSpecialF
16ab0 70 5b 69 5d 2e 69 4c 6f 77 65 72 3b 0a 20 20 20  p[i].iLower;.   
16ac0 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
16ad0 66 28 76 61 6c 75 65 29 3d 3d 38 20 29 3b 0a 20  f(value)==8 );. 
16ae0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a       assert( siz
16af0 65 6f 66 28 78 29 3d 3d 38 20 29 3b 0a 20 20 20  eof(x)==8 );.   
16b00 20 20 20 6d 65 6d 63 70 79 28 26 76 61 6c 75 65     memcpy(&value
16b10 2c 20 26 78 2c 20 38 29 3b 0a 20 20 20 20 20 20  , &x, 8);.      
16b20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
16b30 0a 20 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f 66  .  if( i>=sizeof
16b40 28 61 53 70 65 63 69 61 6c 46 70 29 2f 73 69 7a  (aSpecialFp)/siz
16b50 65 6f 66 28 61 53 70 65 63 69 61 6c 46 70 5b 30  eof(aSpecialFp[0
16b60 5d 29 20 26 26 0a 20 20 20 20 20 20 20 20 20 54  ]) &&.         T
16b70 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d  cl_GetDoubleFrom
16b80 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
16b90 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20 29 7b 0a  [3], &value) ){.
16ba0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
16bb0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  RROR;.  }.  rc =
16bc0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f   sqlite3_bind_do
16bd0 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 64 78 2c  uble(pStmt, idx,
16be0 20 76 61 6c 75 65 29 3b 0a 20 20 69 66 28 20 73   value);.  if( s
16bf0 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
16c00 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f  e(interp, StmtTo
16c10 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29  Db(pStmt), rc) )
16c20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16c30 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  R;.  if( rc!=SQL
16c40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
16c50 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
16c60 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43    }..  return TC
16c70 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
16c80 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
16c90 62 69 6e 64 5f 6e 75 6c 6c 20 20 53 54 4d 54 20  bind_null  STMT 
16ca0 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65  N.**.** Test the
16cb0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
16cc0 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53  ll interface.  S
16cd0 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65  TMT is a prepare
16ce0 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  d statement..** 
16cf0 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  N is the index o
16d00 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20  f a wildcard in 
16d10 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
16d20 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  tement.  This co
16d30 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61  mmand.** binds a
16d40 20 4e 55 4c 4c 20 74 6f 20 74 68 65 20 77 69 6c   NULL to the wil
16d50 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  dcard..*/.static
16d60 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 6e   int test_bind_n
16d70 75 6c 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ull(.  void * cl
16d80 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
16d90 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
16da0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
16db0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
16dc0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
16dd0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
16de0 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 72  int idx;.  int r
16df0 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
16e00 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
16e10 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
16e20 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
16e30 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
16e40 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
16e50 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
16e60 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54  v[0], 0), " STMT
16e70 20 4e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74   N", 0);.    ret
16e80 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16e90 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
16ea0 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
16eb0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
16ec0 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
16ed0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
16ee0 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
16ef0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
16f00 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69  erp, objv[2], &i
16f10 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  dx) ) return TCL
16f20 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
16f30 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c  sqlite3_bind_nul
16f40 6c 28 70 53 74 6d 74 2c 20 69 64 78 29 3b 0a 20  l(pStmt, idx);. 
16f50 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
16f60 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
16f70 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c  StmtToDb(pStmt),
16f80 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
16f90 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
16fa0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16fb0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
16fc0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  RROR;.  }..  ret
16fd0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
16fe0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
16ff0 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 20  lite3_bind_text 
17000 20 53 54 4d 54 20 4e 20 53 54 52 49 4e 47 20 42   STMT N STRING B
17010 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  YTES.**.** Test 
17020 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
17030 5f 74 65 78 74 20 69 6e 74 65 72 66 61 63 65 2e  _text interface.
17040 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70    STMT is a prep
17050 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
17060 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65  ** N is the inde
17070 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20  x of a wildcard 
17080 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
17090 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73  statement.  This
170a0 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64   command.** bind
170b0 73 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67  s a UTF-8 string
170c0 20 53 54 52 49 4e 47 20 74 6f 20 74 68 65 20 77   STRING to the w
170d0 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 73 74  ildcard.  The st
170e0 72 69 6e 67 20 69 73 20 42 59 54 45 53 20 62 79  ring is BYTES by
170f0 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a  tes.** long..*/.
17100 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
17110 62 69 6e 64 5f 74 65 78 74 28 0a 20 20 76 6f 69  bind_text(.  voi
17120 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
17130 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
17140 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
17150 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
17160 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
17170 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
17180 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  mt;.  int idx;. 
17190 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 68   int bytes;.  ch
171a0 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74  ar *value;.  int
171b0 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
171c0 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=5 ){.    Tcl_A
171d0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
171e0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
171f0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
17200 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
17210 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
17220 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54  bjv[0], 0), " ST
17230 4d 54 20 4e 20 56 41 4c 55 45 20 42 59 54 45 53  MT N VALUE BYTES
17240 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
17250 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
17260 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
17270 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
17280 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
17290 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
172a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
172b0 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
172c0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
172d0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78  p, objv[2], &idx
172e0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
172f0 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d 20  RROR;.  value = 
17300 28 63 68 61 72 2a 29 54 63 6c 5f 47 65 74 42 79  (char*)Tcl_GetBy
17310 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f  teArrayFromObj(o
17320 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 3b  bjv[3], &bytes);
17330 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
17340 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
17350 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73   objv[4], &bytes
17360 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
17370 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
17380 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
17390 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75  pStmt, idx, valu
173a0 65 2c 20 62 79 74 65 73 2c 20 53 51 4c 49 54 45  e, bytes, SQLITE
173b0 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 69  _TRANSIENT);.  i
173c0 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
173d0 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74  rCode(interp, St
173e0 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72  mtToDb(pStmt), r
173f0 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
17400 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21  ERROR;.  if( rc!
17410 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17420 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
17430 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
17440 65 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65 28  e3TestErrorName(
17450 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  rc), 0);.    ret
17460 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17470 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
17480 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
17490 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
174a0 69 6e 64 5f 74 65 78 74 31 36 20 3f 2d 73 74 61  ind_text16 ?-sta
174b0 74 69 63 3f 20 53 54 4d 54 20 4e 20 53 54 52 49  tic? STMT N STRI
174c0 4e 47 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54  NG BYTES.**.** T
174d0 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f  est the sqlite3_
174e0 62 69 6e 64 5f 74 65 78 74 31 36 20 69 6e 74 65  bind_text16 inte
174f0 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20  rface.  STMT is 
17500 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
17510 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68  ment..** N is th
17520 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c  e index of a wil
17530 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65  dcard in the pre
17540 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
17550 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a    This command.*
17560 2a 20 62 69 6e 64 73 20 61 20 55 54 46 2d 31 36  * binds a UTF-16
17570 20 73 74 72 69 6e 67 20 53 54 52 49 4e 47 20 74   string STRING t
17580 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e 20  o the wildcard. 
17590 20 54 68 65 20 73 74 72 69 6e 67 20 69 73 20 42   The string is B
175a0 59 54 45 53 20 62 79 74 65 73 0a 2a 2a 20 6c 6f  YTES bytes.** lo
175b0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
175c0 74 20 74 65 73 74 5f 62 69 6e 64 5f 74 65 78 74  t test_bind_text
175d0 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  16(.  void * cli
175e0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
175f0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
17600 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
17610 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
17620 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  [].){.#ifndef SQ
17630 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
17640 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
17650 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78  pStmt;.  int idx
17660 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20  ;.  int bytes;. 
17670 20 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20   char *value;.  
17680 69 6e 74 20 72 63 3b 0a 0a 20 20 76 6f 69 64 20  int rc;..  void 
17690 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 3d  (*xDel)(void*) =
176a0 20 28 6f 62 6a 63 3d 3d 36 3f 53 51 4c 49 54 45   (objc==6?SQLITE
176b0 5f 53 54 41 54 49 43 3a 53 51 4c 49 54 45 5f 54  _STATIC:SQLITE_T
176c0 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 54 63 6c  RANSIENT);.  Tcl
176d0 5f 4f 62 6a 20 2a 6f 53 74 6d 74 20 20 20 20 3d  _Obj *oStmt    =
176e0 20 6f 62 6a 76 5b 6f 62 6a 63 2d 34 5d 3b 0a 20   objv[objc-4];. 
176f0 20 54 63 6c 5f 4f 62 6a 20 2a 6f 4e 20 20 20 20   Tcl_Obj *oN    
17700 20 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 33     = objv[objc-3
17710 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 53  ];.  Tcl_Obj *oS
17720 74 72 69 6e 67 20 20 3d 20 6f 62 6a 76 5b 6f 62  tring  = objv[ob
17730 6a 63 2d 32 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a  jc-2];.  Tcl_Obj
17740 20 2a 6f 42 79 74 65 73 20 20 20 3d 20 6f 62 6a   *oBytes   = obj
17750 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 0a 20 20 69 66  v[objc-1];..  if
17760 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a  ( objc!=5 && obj
17770 63 21 3d 36 29 7b 0a 20 20 20 20 54 63 6c 5f 41  c!=6){.    Tcl_A
17780 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
17790 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
177a0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
177b0 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
177c0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
177d0 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54  bjv[0], 0), " ST
177e0 4d 54 20 4e 20 56 41 4c 55 45 20 42 59 54 45 53  MT N VALUE BYTES
177f0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
17800 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
17810 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
17820 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
17830 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 53 74  cl_GetString(oSt
17840 6d 74 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  mt), &pStmt) ) r
17850 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17860 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
17870 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
17880 20 6f 4e 2c 20 26 69 64 78 29 20 29 20 72 65 74   oN, &idx) ) ret
17890 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
178a0 20 76 61 6c 75 65 20 3d 20 28 63 68 61 72 2a 29   value = (char*)
178b0 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
178c0 46 72 6f 6d 4f 62 6a 28 6f 53 74 72 69 6e 67 2c  FromObj(oString,
178d0 20 30 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47   0);.  if( Tcl_G
178e0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
178f0 65 72 70 2c 20 6f 42 79 74 65 73 2c 20 26 62 79  erp, oBytes, &by
17900 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43  tes) ) return TC
17910 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
17920 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
17930 78 74 31 36 28 70 53 74 6d 74 2c 20 69 64 78 2c  xt16(pStmt, idx,
17940 20 28 76 6f 69 64 20 2a 29 76 61 6c 75 65 2c 20   (void *)value, 
17950 62 79 74 65 73 2c 20 78 44 65 6c 29 3b 0a 20 20  bytes, xDel);.  
17960 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
17970 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53  rrCode(interp, S
17980 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20  tmtToDb(pStmt), 
17990 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
179a0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
179b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
179c0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
179d0 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
179e0 74 65 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65  te3TestErrorName
179f0 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (rc), 0);.    re
17a00 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17a10 20 20 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53    }..#endif /* S
17a20 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
17a30 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   */.  return TCL
17a40 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
17a50 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
17a60 69 6e 64 5f 62 6c 6f 62 20 3f 2d 73 74 61 74 69  ind_blob ?-stati
17a70 63 3f 20 53 54 4d 54 20 4e 20 44 41 54 41 20 42  c? STMT N DATA B
17a80 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  YTES.**.** Test 
17a90 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
17aa0 5f 62 6c 6f 62 20 69 6e 74 65 72 66 61 63 65 2e  _blob interface.
17ab0 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70    STMT is a prep
17ac0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
17ad0 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65  ** N is the inde
17ae0 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20  x of a wildcard 
17af0 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
17b00 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73  statement.  This
17b10 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64   command.** bind
17b20 73 20 61 20 42 4c 4f 42 20 74 6f 20 74 68 65 20  s a BLOB to the 
17b30 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 42  wildcard.  The B
17b40 4c 4f 42 20 69 73 20 42 59 54 45 53 20 62 79 74  LOB is BYTES byt
17b50 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73  es in size..*/.s
17b60 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
17b70 69 6e 64 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64  ind_blob(.  void
17b80 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
17b90 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
17ba0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
17bb0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
17bc0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
17bd0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
17be0 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  t;.  int idx;.  
17bf0 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 68 61  int bytes;.  cha
17c00 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20  r *value;.  int 
17c10 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 64 65  rc;.  sqlite3_de
17c20 73 74 72 75 63 74 6f 72 5f 74 79 70 65 20 78 44  structor_type xD
17c30 65 73 74 72 75 63 74 6f 72 20 3d 20 53 51 4c 49  estructor = SQLI
17c40 54 45 5f 54 52 41 4e 53 49 45 4e 54 3b 0a 0a 20  TE_TRANSIENT;.. 
17c50 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20   if( objc!=5 && 
17c60 6f 62 6a 63 21 3d 36 20 29 7b 0a 20 20 20 20 54  objc!=6 ){.    T
17c70 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
17c80 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
17c90 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
17ca0 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
17cb0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
17cc0 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
17cd0 22 20 53 54 4d 54 20 4e 20 44 41 54 41 20 42 59  " STMT N DATA BY
17ce0 54 45 53 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  TES", 0);.    re
17cf0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17d00 20 20 7d 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d    }..  if( objc=
17d10 3d 36 20 29 7b 0a 20 20 20 20 78 44 65 73 74 72  =6 ){.    xDestr
17d20 75 63 74 6f 72 20 3d 20 53 51 4c 49 54 45 5f 53  uctor = SQLITE_S
17d30 54 41 54 49 43 3b 0a 20 20 20 20 6f 62 6a 76 2b  TATIC;.    objv+
17d40 2b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  +;.  }..  if( ge
17d50 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
17d60 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
17d70 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
17d80 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
17d90 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
17da0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
17db0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
17dc0 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e  , &idx) ) return
17dd0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 76 61   TCL_ERROR;.  va
17de0 6c 75 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  lue = Tcl_GetStr
17df0 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20  ing(objv[3]);.  
17e00 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
17e10 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
17e20 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73 29 20 29  jv[4], &bytes) )
17e30 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17e40 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
17e50 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74  e3_bind_blob(pSt
17e60 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 2c 20  mt, idx, value, 
17e70 62 79 74 65 73 2c 20 78 44 65 73 74 72 75 63 74  bytes, xDestruct
17e80 6f 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  or);.  if( sqlit
17e90 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
17ea0 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70  terp, StmtToDb(p
17eb0 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74  Stmt), rc) ) ret
17ec0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17ed0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17ee0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
17ef0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
17f00 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
17f10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
17f20 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
17f30 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74  _parameter_count
17f40 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74    STMT.**.** Ret
17f50 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
17f60 66 20 77 69 6c 64 63 61 72 64 73 20 69 6e 20 74  f wildcards in t
17f70 68 65 20 67 69 76 65 6e 20 73 74 61 74 65 6d 65  he given stateme
17f80 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
17f90 74 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61  t test_bind_para
17fa0 6d 65 74 65 72 5f 63 6f 75 6e 74 28 0a 20 20 76  meter_count(.  v
17fb0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
17fc0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
17fd0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
17fe0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
17ff0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
18000 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
18010 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  Stmt;..  if( obj
18020 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
18030 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
18040 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
18050 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72  TMT");.    retur
18060 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
18070 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
18080 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
18090 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
180a0 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
180b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
180c0 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
180d0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
180e0 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
180f0 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
18100 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 29 29  r_count(pStmt)))
18110 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
18120 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
18130 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  e:   sqlite3_bin
18140 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65  d_parameter_name
18150 20 20 53 54 4d 54 20 20 4e 0a 2a 2a 0a 2a 2a 20    STMT  N.**.** 
18160 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
18170 6f 66 20 74 68 65 20 4e 74 68 20 77 69 6c 64 63  of the Nth wildc
18180 61 72 64 2e 20 20 54 68 65 20 66 69 72 73 74 20  ard.  The first 
18190 77 69 6c 64 63 61 72 64 20 69 73 20 31 2e 0a 2a  wildcard is 1..*
181a0 2a 20 41 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  * An empty strin
181b0 67 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  g is returned if
181c0 20 4e 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e   N is out of ran
181d0 67 65 20 6f 72 20 69 66 20 74 68 65 20 77 69 6c  ge or if the wil
181e0 64 63 61 72 64 0a 2a 2a 20 69 73 20 6e 61 6d 65  dcard.** is name
181f0 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  less..*/.static 
18200 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 70 61  int test_bind_pa
18210 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 0a 20 20  rameter_name(.  
18220 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
18230 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
18240 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
18250 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
18260 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
18270 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
18280 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 3b 0a  pStmt;.  int i;.
18290 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
182a0 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
182b0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
182c0 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20 4e 22  , objv, "STMT N"
182d0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
182e0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
182f0 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
18300 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
18310 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
18320 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
18330 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
18340 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
18350 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
18360 6a 76 5b 32 5d 2c 20 26 69 29 20 29 20 72 65 74  jv[2], &i) ) ret
18370 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
18380 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
18390 74 28 69 6e 74 65 72 70 2c 20 0a 20 20 20 20 20  t(interp, .     
183a0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
183b0 28 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61  (sqlite3_bind_pa
183c0 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70 53 74  rameter_name(pSt
183d0 6d 74 2c 69 29 2c 2d 31 29 0a 20 20 29 3b 0a 20  mt,i),-1).  );. 
183e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
183f0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
18400 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70    sqlite3_bind_p
18410 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 20 20  arameter_index  
18420 53 54 4d 54 20 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a  STMT  NAME.**.**
18430 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
18440 78 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72  x of the wildcar
18450 64 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20  d called NAME.  
18460 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 72  Return 0 if ther
18470 65 20 69 73 0a 2a 2a 20 6e 6f 20 73 75 63 68 20  e is.** no such 
18480 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61  wildcard..*/.sta
18490 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
184a0 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65  d_parameter_inde
184b0 78 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  x(.  void * clie
184c0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
184d0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
184e0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
184f0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
18500 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
18510 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69  tmt *pStmt;..  i
18520 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
18530 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
18540 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
18550 6a 76 2c 20 22 53 54 4d 54 20 4e 41 4d 45 22 29  jv, "STMT NAME")
18560 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
18570 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
18580 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
18590 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
185a0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
185b0 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
185c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
185d0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
185e0 69 6e 74 65 72 70 2c 20 0a 20 20 20 20 20 54 63  interp, .     Tc
185f0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 0a 20 20 20  l_NewIntObj(.   
18600 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
18610 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78  _parameter_index
18620 28 70 53 74 6d 74 2c 54 63 6c 5f 47 65 74 53 74  (pStmt,Tcl_GetSt
18630 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 0a 20  ring(objv[2])). 
18640 20 20 20 20 29 0a 20 20 29 3b 0a 20 20 72 65 74      ).  );.  ret
18650 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
18660 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
18670 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64  lite3_clear_bind
18680 69 6e 67 73 20 53 54 4d 54 0a 2a 2a 0a 2a 2f 0a  ings STMT.**.*/.
18690 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
186a0 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 28 0a  clear_bindings(.
186b0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
186c0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
186d0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
186e0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
186f0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
18700 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
18710 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20   *pStmt;..  if( 
18720 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
18730 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
18740 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
18750 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65   "STMT");.    re
18760 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18770 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d    }.  if( getStm
18780 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
18790 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
187a0 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
187b0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
187c0 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ROR;.  Tcl_SetOb
187d0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
187e0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71  Tcl_NewIntObj(sq
187f0 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64  lite3_clear_bind
18800 69 6e 67 73 28 70 53 74 6d 74 29 29 29 3b 0a 20  ings(pStmt)));. 
18810 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
18820 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
18830 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 20    sqlite3_sleep 
18840 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 0a 2a 2f 0a  MILLISECONDS.*/.
18850 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
18860 73 6c 65 65 70 28 0a 20 20 76 6f 69 64 20 2a 20  sleep(.  void * 
18870 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
18880 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
18890 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
188a0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
188b0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 6d  bjv[].){.  int m
188c0 73 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  s;..  if( objc!=
188d0 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
188e0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
188f0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c  , 1, objv, "MILL
18900 49 53 45 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20  ISECONDS");.    
18910 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
18920 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
18930 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
18940 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26  terp, objv[1], &
18950 6d 73 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ms) ){.    retur
18960 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
18970 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
18980 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
18990 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65  NewIntObj(sqlite
189a0 33 5f 73 6c 65 65 70 28 6d 73 29 29 29 3b 0a 20  3_sleep(ms)));. 
189b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
189c0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
189d0 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
189e0 5f 65 72 72 63 6f 64 65 20 44 42 0a 2a 2a 0a 2a  _errcode DB.**.*
189f0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 74 72  * Return the str
18a00 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69  ing representati
18a10 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  on of the most r
18a20 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20  ecent sqlite3_* 
18a30 41 50 49 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64  API.** error cod
18a40 65 2e 20 65 2e 67 2e 20 22 53 51 4c 49 54 45 5f  e. e.g. "SQLITE_
18a50 45 52 52 4f 52 22 2e 0a 2a 2f 0a 73 74 61 74 69  ERROR"..*/.stati
18a60 63 20 69 6e 74 20 74 65 73 74 5f 65 78 5f 65 72  c int test_ex_er
18a70 72 63 6f 64 65 28 0a 20 20 76 6f 69 64 20 2a 20  rcode(.  void * 
18a80 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
18a90 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
18aa0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
18ab0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
18ac0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
18ad0 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
18ae0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
18af0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
18b00 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
18b10 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
18b20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
18b30 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
18b40 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
18b50 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
18b60 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18b70 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
18b80 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
18b90 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
18ba0 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
18bb0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18bc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
18bd0 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28  xtended_errcode(
18be0 64 62 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  db);.  Tcl_Appen
18bf0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
18c00 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
18c10 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72  ame(rc), 0);.  r
18c20 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
18c30 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
18c40 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 20 44  qlite3_errcode D
18c50 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  B.**.** Return t
18c60 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  he string repres
18c70 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
18c80 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69  most recent sqli
18c90 74 65 33 5f 2a 20 41 50 49 0a 2a 2a 20 65 72 72  te3_* API.** err
18ca0 6f 72 20 63 6f 64 65 2e 20 65 2e 67 2e 20 22 53  or code. e.g. "S
18cb0 51 4c 49 54 45 5f 45 52 52 4f 52 22 2e 0a 2a 2f  QLITE_ERROR"..*/
18cc0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
18cd0 5f 65 72 72 63 6f 64 65 28 0a 20 20 76 6f 69 64  _errcode(.  void
18ce0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
18cf0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
18d00 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
18d10 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
18d20 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
18d30 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
18d40 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
18d50 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
18d60 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
18d70 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
18d80 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
18d90 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
18da0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
18db0 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20  , " DB", 0);.   
18dc0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
18dd0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
18de0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
18df0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
18e00 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
18e10 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
18e20 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
18e30 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20  3_errcode(db);. 
18e40 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
18e50 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
18e60 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
18e70 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  ), 0);.  return 
18e80 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
18e90 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
18ea0 33 5f 65 72 72 6d 73 67 20 44 42 0a 2a 2a 0a 2a  3_errmsg DB.**.*
18eb0 2a 20 52 65 74 75 72 6e 73 20 74 68 65 20 55 54  * Returns the UT
18ec0 46 2d 38 20 72 65 70 72 65 73 65 6e 74 61 74 69  F-8 representati
18ed0 6f 6e 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20  on of the error 
18ee0 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 20 66  message string f
18ef0 6f 72 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72  or the.** most r
18f00 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20  ecent sqlite3_* 
18f10 41 50 49 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61  API call..*/.sta
18f20 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72 72  tic int test_err
18f30 6d 73 67 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  msg(.  void * cl
18f40 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
18f50 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
18f60 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
18f70 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
18f80 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
18f90 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *db;.  const ch
18fa0 61 72 20 2a 7a 45 72 72 3b 0a 0a 20 20 69 66 28  ar *zErr;..  if(
18fb0 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
18fc0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
18fd0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
18fe0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
18ff0 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
19000 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
19010 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29  v[0]), " DB", 0)
19020 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
19030 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
19040 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
19050 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
19060 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
19070 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
19080 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20  _ERROR;..  zErr 
19090 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  = sqlite3_errmsg
190a0 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  (db);.  Tcl_SetO
190b0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
190c0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
190d0 6a 28 7a 45 72 72 2c 20 2d 31 29 29 3b 0a 20 20  j(zErr, -1));.  
190e0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
190f0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
19100 20 74 65 73 74 5f 65 72 72 6d 73 67 31 36 20 44   test_errmsg16 D
19110 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  B.**.** Returns 
19120 74 68 65 20 55 54 46 2d 31 36 20 72 65 70 72 65  the UTF-16 repre
19130 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
19140 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73   error message s
19150 74 72 69 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a  tring for the.**
19160 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
19170 69 74 65 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e  ite3_* API call.
19180 20 54 68 69 73 20 69 73 20 61 20 62 79 74 65 20   This is a byte 
19190 61 72 72 61 79 20 6f 62 6a 65 63 74 20 61 74 20  array object at 
191a0 74 68 65 20 54 43 4c 20 0a 2a 2a 20 6c 65 76 65  the TCL .** leve
191b0 6c 2c 20 61 6e 64 20 69 74 20 69 6e 63 6c 75 64  l, and it includ
191c0 65 73 20 74 68 65 20 30 78 30 30 20 30 78 30 30  es the 0x00 0x00
191d0 20 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65   terminator byte
191e0 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
191f0 74 68 65 0a 2a 2a 20 55 54 46 2d 31 36 20 73 74  the.** UTF-16 st
19200 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
19210 69 6e 74 20 74 65 73 74 5f 65 72 72 6d 73 67 31  int test_errmsg1
19220 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  6(.  void * clie
19230 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
19240 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
19250 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
19260 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
19270 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ].){.#ifndef SQL
19280 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
19290 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
192a0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 45 72 72  const void *zErr
192b0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
192c0 7a 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 20 3d  z;.  int bytes =
192d0 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   0;..  if( objc!
192e0 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
192f0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
19300 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
19310 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
19320 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
19330 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
19340 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
19350 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19360 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
19370 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
19380 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
19390 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
193a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
193b0 3b 0a 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69  ;..  zErr = sqli
193c0 74 65 33 5f 65 72 72 6d 73 67 31 36 28 64 62 29  te3_errmsg16(db)
193d0 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a  ;.  if( zErr ){.
193e0 20 20 20 20 7a 20 3d 20 7a 45 72 72 3b 0a 20 20      z = zErr;.  
193f0 20 20 66 6f 72 28 62 79 74 65 73 3d 30 3b 20 7a    for(bytes=0; z
19400 5b 62 79 74 65 73 5d 20 7c 7c 20 7a 5b 62 79 74  [bytes] || z[byt
19410 65 73 2b 31 5d 3b 20 62 79 74 65 73 2b 3d 32 29  es+1]; bytes+=2)
19420 7b 7d 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74  {}.  }.  Tcl_Set
19430 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
19440 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  , Tcl_NewByteArr
19450 61 79 4f 62 6a 28 7a 45 72 72 2c 20 62 79 74 65  ayObj(zErr, byte
19460 73 29 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  s));.#endif /* S
19470 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
19480 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   */.  return TCL
19490 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
194a0 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65  age: sqlite3_pre
194b0 70 61 72 65 20 44 42 20 73 71 6c 20 62 79 74 65  pare DB sql byte
194c0 73 20 3f 74 61 69 6c 76 61 72 3f 0a 2a 2a 0a 2a  s ?tailvar?.**.*
194d0 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20  * Compile up to 
194e0 3c 62 79 74 65 73 3e 20 62 79 74 65 73 20 6f 66  <bytes> bytes of
194f0 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 53 51   the supplied SQ
19500 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75  L string <sql> u
19510 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65  sing.** database
19520 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68   handle <DB>. Th
19530 65 20 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69  e parameter <tai
19540 6c 76 61 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d  lval> is the nam
19550 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a  e of a global.**
19560 20 76 61 72 69 61 62 6c 65 20 74 68 61 74 20 69   variable that i
19570 73 20 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75  s set to the unu
19580 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c  sed portion of <
19590 73 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20 41  sql> (if any). A
195a0 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65 20  .** STMT handle 
195b0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
195c0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
195d0 70 72 65 70 61 72 65 28 0a 20 20 76 6f 69 64 20  prepare(.  void 
195e0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
195f0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
19600 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
19610 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
19620 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
19630 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
19640 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20  t char *zSql;.  
19650 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 6f 6e  int bytes;.  con
19660 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 20 3d  st char *zTail =
19670 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   0;.  sqlite3_st
19680 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
19690 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
196a0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
196b0 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63   objc!=5 && objc
196c0 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
196d0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
196e0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
196f0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
19700 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
19710 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
19720 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73  , " DB sql bytes
19730 20 3f 74 61 69 6c 76 61 72 3f 22 2c 20 30 29 3b   ?tailvar?", 0);
19740 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
19750 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
19760 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
19770 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
19780 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
19790 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
197a0 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20  ERROR;.  zSql = 
197b0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
197c0 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54 63  jv[2]);.  if( Tc
197d0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
197e0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
197f0 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75 72   &bytes) ) retur
19800 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
19810 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
19820 70 61 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20 62  pare(db, zSql, b
19830 79 74 65 73 2c 20 26 70 53 74 6d 74 2c 20 6f 62  ytes, &pStmt, ob
19840 6a 63 3e 3d 35 20 3f 20 26 7a 54 61 69 6c 20 3a  jc>=5 ? &zTail :
19850 20 30 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74   0);.  Tcl_Reset
19860 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
19870 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
19880 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
19890 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72   db, rc) ) retur
198a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
198b0 66 28 20 7a 54 61 69 6c 20 26 26 20 6f 62 6a 63  f( zTail && objc
198c0 3e 3d 35 20 29 7b 0a 20 20 20 20 69 66 28 20 62  >=5 ){.    if( b
198d0 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ytes>=0 ){.     
198e0 20 62 79 74 65 73 20 3d 20 62 79 74 65 73 20 2d   bytes = bytes -
198f0 20 28 69 6e 74 29 28 7a 54 61 69 6c 2d 7a 53 71   (int)(zTail-zSq
19900 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  l);.    }.    if
19910 28 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54  ( (int)strlen(zT
19920 61 69 6c 29 3c 62 79 74 65 73 20 29 7b 0a 20 20  ail)<bytes ){.  
19930 20 20 20 20 62 79 74 65 73 20 3d 20 28 69 6e 74      bytes = (int
19940 29 73 74 72 6c 65 6e 28 7a 54 61 69 6c 29 3b 0a  )strlen(zTail);.
19950 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4f 62      }.    Tcl_Ob
19960 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  jSetVar2(interp,
19970 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 54 63 6c   objv[4], 0, Tcl
19980 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54  _NewStringObj(zT
19990 61 69 6c 2c 20 62 79 74 65 73 29 2c 20 30 29 3b  ail, bytes), 0);
199a0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
199b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
199c0 61 73 73 65 72 74 28 20 70 53 74 6d 74 3d 3d 30  assert( pStmt==0
199d0 20 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28   );.    sprintf(
199e0 7a 42 75 66 2c 20 22 28 25 64 29 20 22 2c 20 72  zBuf, "(%d) ", r
199f0 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  c);.    Tcl_Appe
19a00 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
19a10 20 7a 42 75 66 2c 20 73 71 6c 69 74 65 33 5f 65   zBuf, sqlite3_e
19a20 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20  rrmsg(db), 0);. 
19a30 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
19a40 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
19a50 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28  pStmt ){.    if(
19a60 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65   sqlite3TestMake
19a70 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72  PointerStr(inter
19a80 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20  p, zBuf, pStmt) 
19a90 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
19aa0 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  OR;.    Tcl_Appe
19ab0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
19ac0 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20   zBuf, 0);.  }. 
19ad0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
19ae0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
19af0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
19b00 76 32 20 44 42 20 73 71 6c 20 62 79 74 65 73 20  v2 DB sql bytes 
19b10 3f 74 61 69 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a 20  ?tailvar?.**.** 
19b20 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62  Compile up to <b
19b30 79 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74  ytes> bytes of t
19b40 68 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20  he supplied SQL 
19b50 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69  string <sql> usi
19b60 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68  ng.** database h
19b70 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20  andle <DB>. The 
19b80 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76  parameter <tailv
19b90 61 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20  al> is the name 
19ba0 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76  of a global.** v
19bb0 61 72 69 61 62 6c 65 20 74 68 61 74 20 69 73 20  ariable that is 
19bc0 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65  set to the unuse
19bd0 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71  d portion of <sq
19be0 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a  l> (if any). A.*
19bf0 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73  * STMT handle is
19c00 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
19c10 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72  atic int test_pr
19c20 65 70 61 72 65 5f 76 32 28 0a 20 20 76 6f 69 64  epare_v2(.  void
19c30 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
19c40 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
19c50 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
19c60 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
19c70 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
19c80 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
19c90 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  st char *zSql;. 
19ca0 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 6f   int bytes;.  co
19cb0 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 20  nst char *zTail 
19cc0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  = 0;.  sqlite3_s
19cd0 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
19ce0 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b    char zBuf[50];
19cf0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
19d00 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a  ( objc!=5 && obj
19d10 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
19d20 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
19d30 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
19d40 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
19d50 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
19d60 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
19d70 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74 65  ), " DB sql byte
19d80 73 20 74 61 69 6c 76 61 72 22 2c 20 30 29 3b 0a  s tailvar", 0);.
19d90 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
19da0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
19db0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
19dc0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
19dd0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
19de0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
19df0 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54  RROR;.  zSql = T
19e00 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
19e10 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c  v[2]);.  if( Tcl
19e20 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
19e30 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
19e40 26 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e  &bytes) ) return
19e50 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
19e60 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
19e70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c  are_v2(db, zSql,
19e80 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c 20   bytes, &pStmt, 
19e90 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54 61 69 6c  objc>=5 ? &zTail
19ea0 20 3a 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28   : 0);.  assert(
19eb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
19ec0 20 70 53 74 6d 74 3d 3d 30 29 3b 0a 20 20 54 63   pStmt==0);.  Tc
19ed0 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
19ee0 74 65 72 70 29 3b 0a 20 20 69 66 28 20 73 71 6c  terp);.  if( sql
19ef0 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
19f00 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20  interp, db, rc) 
19f10 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
19f20 4f 52 3b 0a 20 20 69 66 28 20 7a 54 61 69 6c 20  OR;.  if( zTail 
19f30 26 26 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20  && objc>=5 ){.  
19f40 20 20 69 66 28 20 62 79 74 65 73 3e 3d 30 20 29    if( bytes>=0 )
19f50 7b 0a 20 20 20 20 20 20 62 79 74 65 73 20 3d 20  {.      bytes = 
19f60 62 79 74 65 73 20 2d 20 28 69 6e 74 29 28 7a 54  bytes - (int)(zT
19f70 61 69 6c 2d 7a 53 71 6c 29 3b 0a 20 20 20 20 7d  ail-zSql);.    }
19f80 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56  .    Tcl_ObjSetV
19f90 61 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  ar2(interp, objv
19fa0 5b 34 5d 2c 20 30 2c 20 54 63 6c 5f 4e 65 77 53  [4], 0, Tcl_NewS
19fb0 74 72 69 6e 67 4f 62 6a 28 7a 54 61 69 6c 2c 20  tringObj(zTail, 
19fc0 62 79 74 65 73 29 2c 20 30 29 3b 0a 20 20 7d 0a  bytes), 0);.  }.
19fd0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19fe0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
19ff0 74 28 20 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20  t( pStmt==0 );. 
1a000 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c     sprintf(zBuf,
1a010 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b 0a 20   "(%d) ", rc);. 
1a020 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1a030 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
1a040 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
1a050 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (db), 0);.    re
1a060 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1a070 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d 74    }..  if( pStmt
1a080 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
1a090 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74  te3TestMakePoint
1a0a0 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42  erStr(interp, zB
1a0b0 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74  uf, pStmt) ) ret
1a0c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1a0d0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1a0e0 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
1a0f0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
1a100 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1a110 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1a120 65 33 5f 70 72 65 70 61 72 65 5f 74 6b 74 33 31  e3_prepare_tkt31
1a130 33 34 20 44 42 0a 2a 2a 0a 2a 2a 20 47 65 6e 65  34 DB.**.** Gene
1a140 72 61 74 65 20 61 20 70 72 65 70 61 72 65 64 20  rate a prepared 
1a150 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 61 20  statement for a 
1a160 7a 65 72 6f 2d 62 79 74 65 20 73 74 72 69 6e 67  zero-byte string
1a170 20 61 73 20 61 20 74 65 73 74 0a 2a 2a 20 66 6f   as a test.** fo
1a180 72 20 74 69 63 6b 65 74 20 23 33 31 33 34 2e 20  r ticket #3134. 
1a190 20 54 68 65 20 73 74 72 69 6e 67 20 73 68 6f 75   The string shou
1a1a0 6c 64 20 62 65 20 70 72 65 63 65 65 64 65 64 20  ld be preceeded 
1a1b0 62 79 20 61 20 7a 65 72 6f 20 62 79 74 65 2e 0a  by a zero byte..
1a1c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1a1d0 73 74 5f 70 72 65 70 61 72 65 5f 74 6b 74 33 31  st_prepare_tkt31
1a1e0 33 34 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  34(.  void * cli
1a1f0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1a200 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1a210 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1a220 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1a230 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
1a240 2a 64 62 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  *db;.  static co
1a250 6e 73 74 20 63 68 61 72 20 7a 53 71 6c 5b 5d 20  nst char zSql[] 
1a260 3d 20 22 5c 30 30 30 53 45 4c 45 43 54 20 31 22  = "\000SELECT 1"
1a270 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
1a280 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63   *pStmt = 0;.  c
1a290 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20  har zBuf[50];.  
1a2a0 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
1a2b0 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
1a2c0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1a2d0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1a2e0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1a2f0 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
1a300 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1a310 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79  0]), " DB sql by
1a320 74 65 73 20 74 61 69 6c 76 61 72 22 2c 20 30 29  tes tailvar", 0)
1a330 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1a340 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
1a350 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
1a360 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1a370 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1a380 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
1a390 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
1a3a0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
1a3b0 32 28 64 62 2c 20 26 7a 53 71 6c 5b 31 5d 2c 20  2(db, &zSql[1], 
1a3c0 30 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  0, &pStmt, 0);. 
1a3d0 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51 4c 49   assert(rc==SQLI
1a3e0 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d  TE_OK || pStmt==
1a3f0 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  0);.  if( sqlite
1a400 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
1a410 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
1a420 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1a430 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1a440 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
1a450 72 74 28 20 70 53 74 6d 74 3d 3d 30 20 29 3b 0a  rt( pStmt==0 );.
1a460 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66      sprintf(zBuf
1a470 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b 0a  , "(%d) ", rc);.
1a480 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1a490 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
1a4a0 66 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  f, sqlite3_errms
1a4b0 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 72  g(db), 0);.    r
1a4c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1a4d0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d  .  }..  if( pStm
1a4e0 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  t ){.    if( sql
1a4f0 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e  ite3TestMakePoin
1a500 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a  terStr(interp, z
1a510 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65  Buf, pStmt) ) re
1a520 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1a530 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1a540 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
1a550 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  f, 0);.  }.  ret
1a560 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1a570 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1a580 74 65 33 5f 70 72 65 70 61 72 65 31 36 20 44 42  te3_prepare16 DB
1a590 20 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76   sql bytes tailv
1a5a0 61 72 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65  ar.**.** Compile
1a5b0 20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62   up to <bytes> b
1a5c0 79 74 65 73 20 6f 66 20 74 68 65 20 73 75 70 70  ytes of the supp
1a5d0 6c 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20  lied SQL string 
1a5e0 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64  <sql> using.** d
1a5f0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c  atabase handle <
1a600 44 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74  DB>. The paramet
1a610 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20  er <tailval> is 
1a620 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c  the name of a gl
1a630 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65  obal.** variable
1a640 20 74 68 61 74 20 69 73 20 73 65 74 20 74 6f 20   that is set to 
1a650 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69  the unused porti
1a660 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20  on of <sql> (if 
1a670 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20  any). A.** STMT 
1a680 68 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e  handle is return
1a690 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1a6a0 74 20 74 65 73 74 5f 70 72 65 70 61 72 65 31 36  t test_prepare16
1a6b0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1a6c0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1a6d0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1a6e0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1a6f0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1a700 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
1a710 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
1a720 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
1a730 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c 3b  onst void *zSql;
1a740 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
1a750 54 61 69 6c 20 3d 20 30 3b 0a 20 20 54 63 6c 5f  Tail = 0;.  Tcl_
1a760 4f 62 6a 20 2a 70 54 61 69 6c 20 3d 20 30 3b 0a  Obj *pTail = 0;.
1a770 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1a780 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61  pStmt = 0;.  cha
1a790 72 20 7a 42 75 66 5b 35 30 5d 3b 20 0a 20 20 69  r zBuf[50]; .  i
1a7a0 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 79 74  nt rc;.  int byt
1a7b0 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  es;             
1a7c0 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67 65     /* The intege
1a7d0 72 20 73 70 65 63 69 66 69 65 64 20 61 73 20 61  r specified as a
1a7e0 72 67 20 33 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  rg 3 */.  int ob
1a7f0 6a 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  jlen;           
1a800 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65 2d      /* The byte-
1a810 61 72 72 61 79 20 6c 65 6e 67 74 68 20 6f 66 20  array length of 
1a820 61 72 67 20 32 20 2a 2f 0a 0a 20 20 69 66 28 20  arg 2 */..  if( 
1a830 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21  objc!=5 && objc!
1a840 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =4 ){.    Tcl_Ap
1a850 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1a860 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1a870 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1a880 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
1a890 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
1a8a0 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20   " DB sql bytes 
1a8b0 3f 74 61 69 6c 76 61 72 3f 22 2c 20 30 29 3b 0a  ?tailvar?", 0);.
1a8c0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1a8d0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1a8e0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1a8f0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1a900 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
1a910 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1a920 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54  RROR;.  zSql = T
1a930 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
1a940 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
1a950 26 6f 62 6a 6c 65 6e 29 3b 0a 20 20 69 66 28 20  &objlen);.  if( 
1a960 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
1a970 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
1a980 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74  ], &bytes) ) ret
1a990 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
1a9a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
1a9b0 72 65 70 61 72 65 31 36 28 64 62 2c 20 7a 53 71  repare16(db, zSq
1a9c0 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74  l, bytes, &pStmt
1a9d0 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54 61  , objc>=5 ? &zTa
1a9e0 69 6c 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 73  il : 0);.  if( s
1a9f0 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
1aa00 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63  e(interp, db, rc
1aa10 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1aa20 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 20 29  RROR;.  if( rc )
1aa30 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
1aa40 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
1aa50 66 28 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20  f( objc>=5 ){.  
1aa60 20 20 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20    if( zTail ){. 
1aa70 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 6f 62       objlen = ob
1aa80 6a 6c 65 6e 20 2d 20 28 69 6e 74 29 28 28 75 38  jlen - (int)((u8
1aa90 20 2a 29 7a 54 61 69 6c 2d 28 75 38 20 2a 29 7a   *)zTail-(u8 *)z
1aaa0 53 71 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Sql);.    }else{
1aab0 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20  .      objlen = 
1aac0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  0;.    }.    pTa
1aad0 69 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65  il = Tcl_NewByte
1aae0 41 72 72 61 79 4f 62 6a 28 28 75 38 20 2a 29 7a  ArrayObj((u8 *)z
1aaf0 54 61 69 6c 2c 20 6f 62 6a 6c 65 6e 29 3b 0a 20  Tail, objlen);. 
1ab00 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
1ab10 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 20 20  unt(pTail);.    
1ab20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69  Tcl_ObjSetVar2(i
1ab30 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
1ab40 30 2c 20 70 54 61 69 6c 2c 20 30 29 3b 0a 20 20  0, pTail, 0);.  
1ab50 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
1ab60 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 7d 0a 0a  nt(pTail);.  }..
1ab70 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
1ab80 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65     if( sqlite3Te
1ab90 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  stMakePointerStr
1aba0 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70  (interp, zBuf, p
1abb0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
1abc0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1abd0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1abe0 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
1abf0 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
1ac00 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
1ac10 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  /.  return TCL_O
1ac20 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1ac30 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  e: sqlite3_prepa
1ac40 72 65 31 36 5f 76 32 20 44 42 20 73 71 6c 20 62  re16_v2 DB sql b
1ac50 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 0a 2a  ytes ?tailvar?.*
1ac60 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20  *.** Compile up 
1ac70 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65 73  to <bytes> bytes
1ac80 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
1ac90 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c   SQL string <sql
1aca0 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62  > using.** datab
1acb0 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e  ase handle <DB>.
1acc0 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 3c   The parameter <
1acd0 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65 20  tailval> is the 
1ace0 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c  name of a global
1acf0 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68 61  .** variable tha
1ad00 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
1ad10 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f  unused portion o
1ad20 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79 29  f <sql> (if any)
1ad30 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64  . A.** STMT hand
1ad40 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  le is returned..
1ad50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1ad60 73 74 5f 70 72 65 70 61 72 65 31 36 5f 76 32 28  st_prepare16_v2(
1ad70 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1ad80 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1ad90 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1ada0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1adb0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1adc0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
1add0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73  E_OMIT_UTF16.  s
1ade0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
1adf0 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c 3b 0a  nst void *zSql;.
1ae00 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 54    const void *zT
1ae10 61 69 6c 20 3d 20 30 3b 0a 20 20 54 63 6c 5f 4f  ail = 0;.  Tcl_O
1ae20 62 6a 20 2a 70 54 61 69 6c 20 3d 20 30 3b 0a 20  bj *pTail = 0;. 
1ae30 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1ae40 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  Stmt = 0;.  char
1ae50 20 7a 42 75 66 5b 35 30 5d 3b 20 0a 20 20 69 6e   zBuf[50]; .  in
1ae60 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 79 74 65  t rc;.  int byte
1ae70 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
1ae80 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67 65 72    /* The integer
1ae90 20 73 70 65 63 69 66 69 65 64 20 61 73 20 61 72   specified as ar
1aea0 67 20 33 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  g 3 */.  int obj
1aeb0 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  len;            
1aec0 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65 2d 61     /* The byte-a
1aed0 72 72 61 79 20 6c 65 6e 67 74 68 20 6f 66 20 61  rray length of a
1aee0 72 67 20 32 20 2a 2f 0a 0a 20 20 69 66 28 20 6f  rg 2 */..  if( o
1aef0 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d  bjc!=5 && objc!=
1af00 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
1af10 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1af20 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1af30 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1af40 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
1af50 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
1af60 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f  " DB sql bytes ?
1af70 74 61 69 6c 76 61 72 3f 22 2c 20 30 29 3b 0a 20  tailvar?", 0);. 
1af80 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1af90 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
1afa0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
1afb0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1afc0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
1afd0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1afe0 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63  ROR;.  zSql = Tc
1aff0 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
1b000 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
1b010 6f 62 6a 6c 65 6e 29 3b 0a 20 20 69 66 28 20 54  objlen);.  if( T
1b020 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
1b030 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
1b040 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75  , &bytes) ) retu
1b050 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
1b060 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
1b070 65 70 61 72 65 31 36 5f 76 32 28 64 62 2c 20 7a  epare16_v2(db, z
1b080 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74  Sql, bytes, &pSt
1b090 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a  mt, objc>=5 ? &z
1b0a0 54 61 69 6c 20 3a 20 30 29 3b 0a 20 20 69 66 28  Tail : 0);.  if(
1b0b0 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
1b0c0 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20  ode(interp, db, 
1b0d0 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
1b0e0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
1b0f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
1b100 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1b110 20 69 66 28 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a   if( objc>=5 ){.
1b120 20 20 20 20 69 66 28 20 7a 54 61 69 6c 20 29 7b      if( zTail ){
1b130 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20  .      objlen = 
1b140 6f 62 6a 6c 65 6e 20 2d 20 28 69 6e 74 29 28 28  objlen - (int)((
1b150 75 38 20 2a 29 7a 54 61 69 6c 2d 28 75 38 20 2a  u8 *)zTail-(u8 *
1b160 29 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  )zSql);.    }els
1b170 65 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20  e{.      objlen 
1b180 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
1b190 54 61 69 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79  Tail = Tcl_NewBy
1b1a0 74 65 41 72 72 61 79 4f 62 6a 28 28 75 38 20 2a  teArrayObj((u8 *
1b1b0 29 7a 54 61 69 6c 2c 20 6f 62 6a 6c 65 6e 29 3b  )zTail, objlen);
1b1c0 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
1b1d0 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20  Count(pTail);.  
1b1e0 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
1b1f0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d  (interp, objv[4]
1b200 2c 20 30 2c 20 70 54 61 69 6c 2c 20 30 29 3b 0a  , 0, pTail, 0);.
1b210 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
1b220 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 7d  ount(pTail);.  }
1b230 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b  ..  if( pStmt ){
1b240 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1b250 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53  TestMakePointerS
1b260 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  tr(interp, zBuf,
1b270 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e   pStmt) ) return
1b280 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1b290 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1b2a0 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
1b2b0 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53   0);.#endif /* S
1b2c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
1b2d0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   */.  return TCL
1b2e0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1b2f0 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65  age: sqlite3_ope
1b300 6e 20 66 69 6c 65 6e 61 6d 65 20 3f 6f 70 74 69  n filename ?opti
1b310 6f 6e 73 2d 6c 69 73 74 3f 0a 2a 2f 0a 73 74 61  ons-list?.*/.sta
1b320 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6f 70 65  tic int test_ope
1b330 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  n(.  void * clie
1b340 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1b350 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1b360 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1b370 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1b380 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ].){.  const cha
1b390 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  r *zFilename;.  
1b3a0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
1b3b0 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a  har zBuf[100];..
1b3c0 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26    if( objc!=3 &&
1b3d0 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63   objc!=2 && objc
1b3e0 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=1 ){.    Tcl_A
1b3f0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1b400 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1b410 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1b420 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1b430 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1b440 2c 20 22 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74  , " filename opt
1b450 69 6f 6e 73 2d 6c 69 73 74 22 2c 20 30 29 3b 0a  ions-list", 0);.
1b460 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1b470 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69  RROR;.  }..  zFi
1b480 6c 65 6e 61 6d 65 20 3d 20 6f 62 6a 63 3e 31 20  lename = objc>1 
1b490 3f 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  ? Tcl_GetString(
1b4a0 6f 62 6a 76 5b 31 5d 29 20 3a 20 30 3b 0a 20 20  objv[1]) : 0;.  
1b4b0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 46 69  sqlite3_open(zFi
1b4c0 6c 65 6e 61 6d 65 2c 20 26 64 62 29 3b 0a 20 20  lename, &db);.  
1b4d0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
1b4e0 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  stMakePointerStr
1b4f0 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 64  (interp, zBuf, d
1b500 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1b510 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70 70  ERROR;.  Tcl_App
1b520 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1b530 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65  , zBuf, 0);.  re
1b540 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1b550 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1b560 69 74 65 33 5f 6f 70 65 6e 5f 76 32 20 46 49 4c  ite3_open_v2 FIL
1b570 45 4e 41 4d 45 20 46 4c 41 47 53 20 56 46 53 0a  ENAME FLAGS VFS.
1b580 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1b590 73 74 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 76 6f  st_open_v2(.  vo
1b5a0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1b5b0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1b5c0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1b5d0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1b5e0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1b5f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1b600 65 6e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63  ename;.  const c
1b610 68 61 72 20 2a 7a 56 66 73 3b 0a 20 20 69 6e 74  har *zVfs;.  int
1b620 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 73 71   flags = 0;.  sq
1b630 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
1b640 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 42 75 66   rc;.  char zBuf
1b650 5b 31 30 30 5d 3b 0a 0a 20 20 69 6e 74 20 6e 46  [100];..  int nF
1b660 6c 61 67 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  lag;.  Tcl_Obj *
1b670 2a 61 70 46 6c 61 67 3b 0a 20 20 69 6e 74 20 69  *apFlag;.  int i
1b680 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  ;..  if( objc!=4
1b690 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
1b6a0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
1b6b0 20 31 2c 20 6f 62 6a 76 2c 20 22 46 49 4c 45 4e   1, objv, "FILEN
1b6c0 41 4d 45 20 46 4c 41 47 53 20 56 46 53 22 29 3b  AME FLAGS VFS");
1b6d0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1b6e0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 46 69  ERROR;.  }.  zFi
1b6f0 6c 65 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74  lename = Tcl_Get
1b700 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b  String(objv[1]);
1b710 0a 20 20 7a 56 66 73 20 3d 20 54 63 6c 5f 47 65  .  zVfs = Tcl_Ge
1b720 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29  tString(objv[3])
1b730 3b 0a 20 20 69 66 28 20 7a 56 66 73 5b 30 5d 3d  ;.  if( zVfs[0]=
1b740 3d 30 78 30 30 20 29 20 7a 56 66 73 20 3d 20 30  =0x00 ) zVfs = 0
1b750 3b 0a 0a 20 20 72 63 20 3d 20 54 63 6c 5f 4c 69  ;..  rc = Tcl_Li
1b760 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73  stObjGetElements
1b770 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
1b780 2c 20 26 6e 46 6c 61 67 2c 20 26 61 70 46 6c 61  , &nFlag, &apFla
1b790 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43  g);.  if( rc!=TC
1b7a0 4c 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  L_OK ) return rc
1b7b0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
1b7c0 46 6c 61 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Flag; i++){.    
1b7d0 69 6e 74 20 69 46 6c 61 67 3b 0a 20 20 20 20 73  int iFlag;.    s
1b7e0 74 72 75 63 74 20 4f 70 65 6e 46 6c 61 67 20 7b  truct OpenFlag {
1b7f0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
1b800 72 20 2a 7a 46 6c 61 67 3b 0a 20 20 20 20 20 20  r *zFlag;.      
1b810 69 6e 74 20 66 6c 61 67 3b 0a 20 20 20 20 7d 20  int flag;.    } 
1b820 61 46 6c 61 67 5b 5d 20 3d 20 7b 0a 20 20 20 20  aFlag[] = {.    
1b830 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1b840 5f 52 45 41 44 4f 4e 4c 59 22 2c 20 53 51 4c 49  _READONLY", SQLI
1b850 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
1b860 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1b870 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
1b880 54 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE", SQLITE_OPEN
1b890 5f 52 45 41 44 57 52 49 54 45 20 7d 2c 0a 20 20  _READWRITE },.  
1b8a0 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
1b8b0 45 4e 5f 43 52 45 41 54 45 22 2c 20 53 51 4c 49  EN_CREATE", SQLI
1b8c0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7d  TE_OPEN_CREATE }
1b8d0 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  ,.      { "SQLIT
1b8e0 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
1b8f0 4c 4f 53 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50  LOSE", SQLITE_OP
1b900 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
1b910 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1b920 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
1b930 56 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  VE", SQLITE_OPEN
1b940 5f 45 58 43 4c 55 53 49 56 45 20 7d 2c 0a 20 20  _EXCLUSIVE },.  
1b950 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
1b960 45 4e 5f 41 55 54 4f 50 52 4f 58 59 22 2c 20 53  EN_AUTOPROXY", S
1b970 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50  QLITE_OPEN_AUTOP
1b980 52 4f 58 59 20 7d 2c 0a 20 20 20 20 20 20 7b 20  ROXY },.      { 
1b990 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  "SQLITE_OPEN_MAI
1b9a0 4e 5f 44 42 22 2c 20 53 51 4c 49 54 45 5f 4f 50  N_DB", SQLITE_OP
1b9b0 45 4e 5f 4d 41 49 4e 5f 44 42 20 7d 2c 0a 20 20  EN_MAIN_DB },.  
1b9c0 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
1b9d0 45 4e 5f 54 45 4d 50 5f 44 42 22 2c 20 53 51 4c  EN_TEMP_DB", SQL
1b9e0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
1b9f0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1ba00 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45  ITE_OPEN_TRANSIE
1ba10 4e 54 5f 44 42 22 2c 20 53 51 4c 49 54 45 5f 4f  NT_DB", SQLITE_O
1ba20 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42  PEN_TRANSIENT_DB
1ba30 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1ba40 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
1ba50 55 52 4e 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f  URNAL", SQLITE_O
1ba60 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
1ba70 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1ba80 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
1ba90 55 52 4e 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f  URNAL", SQLITE_O
1baa0 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
1bab0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1bac0 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
1bad0 4e 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  NAL", SQLITE_OPE
1bae0 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7d 2c 0a  N_SUBJOURNAL },.
1baf0 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
1bb00 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
1bb10 4e 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  NAL", SQLITE_OPE
1bb20 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
1bb30 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1bb40 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58  ITE_OPEN_NOMUTEX
1bb50 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e  ", SQLITE_OPEN_N
1bb60 4f 4d 55 54 45 58 20 7d 2c 0a 20 20 20 20 20 20  OMUTEX },.      
1bb70 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46  { "SQLITE_OPEN_F
1bb80 55 4c 4c 4d 55 54 45 58 22 2c 20 53 51 4c 49 54  ULLMUTEX", SQLIT
1bb90 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
1bba0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1bbb0 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
1bbc0 41 43 48 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50  ACHE", SQLITE_OP
1bbd0 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 7d  EN_SHAREDCACHE }
1bbe0 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  ,.      { "SQLIT
1bbf0 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41  E_OPEN_PRIVATECA
1bc00 43 48 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  CHE", SQLITE_OPE
1bc10 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 20 7d  N_PRIVATECACHE }
1bc20 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  ,.      { "SQLIT
1bc30 45 5f 4f 50 45 4e 5f 57 41 4c 22 2c 20 53 51 4c  E_OPEN_WAL", SQL
1bc40 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7d 2c 0a  ITE_OPEN_WAL },.
1bc50 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
1bc60 4f 50 45 4e 5f 55 52 49 22 2c 20 53 51 4c 49 54  OPEN_URI", SQLIT
1bc70 45 5f 4f 50 45 4e 5f 55 52 49 20 7d 2c 0a 20 20  E_OPEN_URI },.  
1bc80 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20      { 0, 0 }.   
1bc90 20 7d 3b 0a 20 20 20 20 72 63 20 3d 20 54 63 6c   };.    rc = Tcl
1bca0 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a  _GetIndexFromObj
1bcb0 53 74 72 75 63 74 28 69 6e 74 65 72 70 2c 20 61  Struct(interp, a
1bcc0 70 46 6c 61 67 5b 69 5d 2c 20 61 46 6c 61 67 2c  pFlag[i], aFlag,
1bcd0 20 73 69 7a 65 6f 66 28 61 46 6c 61 67 5b 30 5d   sizeof(aFlag[0]
1bce0 29 2c 20 0a 20 20 20 20 20 20 20 20 22 66 6c 61  ), .        "fla
1bcf0 67 22 2c 20 30 2c 20 26 69 46 6c 61 67 0a 20 20  g", 0, &iFlag.  
1bd00 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21    );.    if( rc!
1bd10 3d 54 43 4c 5f 4f 4b 20 29 20 72 65 74 75 72 6e  =TCL_OK ) return
1bd20 20 72 63 3b 0a 20 20 20 20 66 6c 61 67 73 20 7c   rc;.    flags |
1bd30 3d 20 61 46 6c 61 67 5b 69 46 6c 61 67 5d 2e 66  = aFlag[iFlag].f
1bd40 6c 61 67 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  lag;.  }..  rc =
1bd50 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
1bd60 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 64 62 2c  (zFilename, &db,
1bd70 20 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a 20   flags, zVfs);. 
1bd80 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
1bd90 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69  MakePointerStr(i
1bda0 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 64 62 29  nterp, zBuf, db)
1bdb0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1bdc0 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  ROR;.  Tcl_Appen
1bdd0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1bde0 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75  zBuf, 0);.  retu
1bdf0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1be00 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1be10 65 33 5f 6f 70 65 6e 31 36 20 66 69 6c 65 6e 61  e3_open16 filena
1be20 6d 65 20 6f 70 74 69 6f 6e 73 0a 2a 2f 0a 73 74  me options.*/.st
1be30 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6f 70  atic int test_op
1be40 65 6e 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63  en16(.  void * c
1be50 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1be60 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1be70 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1be80 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1be90 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20  jv[].){.#ifndef 
1bea0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
1beb0 36 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  6.  const void *
1bec0 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 73 71 6c  zFilename;.  sql
1bed0 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72  ite3 *db;.  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 73 71 6c 69 74 65 33 5f 6f   0);.  sqlite3_o
1bfd0 70 65 6e 31 36 28 7a 46 69 6c 65 6e 61 6d 65 2c  pen16(zFilename,
1bfe0 20 26 64 62 29 3b 0a 20 20 0a 20 20 69 66 28 20   &db);.  .  if( 
1bff0 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50  sqlite3TestMakeP
1c000 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70  ointerStr(interp
1c010 2c 20 7a 42 75 66 2c 20 64 62 29 20 29 20 72 65  , zBuf, db) ) re
1c020 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1c030 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1c040 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
1c050 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53   0);.#endif /* S
1c060 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
1c070 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   */.  return TCL
1c080 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1c090 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6d  age: sqlite3_com
1c0a0 70 6c 65 74 65 31 36 20 3c 55 54 46 2d 31 36 20  plete16 <UTF-16 
1c0b0 73 74 72 69 6e 67 3e 0a 2a 2a 0a 2a 2a 20 52 65  string>.**.** Re
1c0c0 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 73 75  turn 1 if the su
1c0d0 70 70 6c 69 65 64 20 61 72 67 75 6d 65 6e 74 20  pplied argument 
1c0e0 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 53 51  is a complete SQ
1c0f0 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20 6f 72 20  L statement, or 
1c100 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73  zero.** otherwis
1c110 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1c120 20 74 65 73 74 5f 63 6f 6d 70 6c 65 74 65 31 36   test_complete16
1c130 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1c140 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1c150 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1c160 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1c170 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1c180 0a 29 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .){.#if !defined
1c190 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d  (SQLITE_OMIT_COM
1c1a0 50 4c 45 54 45 29 20 26 26 20 21 64 65 66 69 6e  PLETE) && !defin
1c1b0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ed(SQLITE_OMIT_U
1c1c0 54 46 31 36 29 0a 20 20 63 68 61 72 20 2a 7a 42  TF16).  char *zB
1c1d0 75 66 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  uf;..  if( objc!
1c1e0 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
1c1f0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
1c200 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3c 75 74  p, 1, objv, "<ut
1c210 66 2d 31 36 20 73 71 6c 3e 22 29 3b 0a 20 20 20  f-16 sql>");.   
1c220 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1c230 52 3b 0a 20 20 7d 0a 0a 20 20 7a 42 75 66 20 3d  R;.  }..  zBuf =
1c240 20 28 63 68 61 72 2a 29 54 63 6c 5f 47 65 74 42   (char*)Tcl_GetB
1c250 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
1c260 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 54  objv[1], 0);.  T
1c270 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1c280 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
1c290 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f  ntObj(sqlite3_co
1c2a0 6d 70 6c 65 74 65 31 36 28 7a 42 75 66 29 29 29  mplete16(zBuf)))
1c2b0 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
1c2c0 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54 45  TE_OMIT_COMPLETE
1c2d0 20 26 26 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   && SQLITE_OMIT_
1c2e0 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72  UTF16 */.  retur
1c2f0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1c300 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1c310 33 5f 73 74 65 70 20 53 54 4d 54 0a 2a 2a 0a 2a  3_step STMT.**.*
1c320 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 73 74  * Advance the st
1c330 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 6e  atement to the n
1c340 65 78 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74  ext row..*/.stat
1c350 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74 65 70  ic int test_step
1c360 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1c370 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1c380 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1c390 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1c3a0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1c3b0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
1c3c0 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
1c3d0 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
1c3e0 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
1c3f0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1c400 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1c410 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1c420 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1c430 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1c440 2c 20 22 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20  , " STMT", 0);. 
1c450 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1c460 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
1c470 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
1c480 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1c490 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1c4a0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
1c4b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
1c4c0 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
1c4d0 53 74 6d 74 29 3b 0a 0a 20 20 2f 2a 20 69 66 28  Stmt);..  /* if(
1c4e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
1c4f0 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 52   && rc!=SQLITE_R
1c500 4f 57 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  OW ) return TCL_
1c510 45 52 52 4f 52 3b 20 2a 2f 0a 20 20 54 63 6c 5f  ERROR; */.  Tcl_
1c520 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
1c530 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
1c540 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
1c550 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1c560 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  }..static int te
1c570 73 74 5f 73 71 6c 28 0a 20 20 76 6f 69 64 20 2a  st_sql(.  void *
1c580 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1c590 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1c5a0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1c5b0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1c5c0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
1c5d0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
1c5e0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
1c5f0 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
1c600 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
1c610 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29  1, objv, "STMT")
1c620 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1c630 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
1c640 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
1c650 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1c660 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1c670 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
1c680 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1c690 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
1c6a0 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
1c6b0 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29  lite3_sql(pStmt)
1c6c0 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
1c6d0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1c6e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1c6f0 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
1c700 5f 63 6f 75 6e 74 20 53 54 4d 54 20 0a 2a 2a 0a  _count STMT .**.
1c710 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
1c720 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
1c730 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
1c740 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 20 53 54  sql statement ST
1c750 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  MT..*/.static in
1c760 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 63 6f  t test_column_co
1c770 75 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  unt(.  void * cl
1c780 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1c790 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1c7a0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1c7b0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1c7c0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
1c7d0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20  _stmt *pStmt;.. 
1c7e0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
1c7f0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1c800 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1c810 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1c820 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
1c830 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
1c840 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
1c850 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20  T column", 0);. 
1c860 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1c870 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
1c880 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
1c890 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1c8a0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1c8b0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
1c8c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54 63  TCL_ERROR;..  Tc
1c8d0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1c8e0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
1c8f0 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c  tObj(sqlite3_col
1c900 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  umn_count(pStmt)
1c910 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
1c920 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1c930 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
1c940 75 6d 6e 5f 74 79 70 65 20 53 54 4d 54 20 63 6f  umn_type STMT co
1c950 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  lumn.**.** Retur
1c960 6e 20 74 68 65 20 74 79 70 65 20 6f 66 20 74 68  n the type of th
1c970 65 20 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d 6e  e data in column
1c980 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68 65   'column' of the
1c990 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 0a 2a 2f   current row..*/
1c9a0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1c9b0 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 0a 20 20  _column_type(.  
1c9c0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1c9d0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1c9e0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1c9f0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1ca00 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1ca10 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1ca20 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c  pStmt;.  int col
1ca30 3b 0a 20 20 69 6e 74 20 74 70 3b 0a 0a 20 20 69  ;.  int tp;..  i
1ca40 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
1ca50 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1ca60 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1ca70 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1ca80 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
1ca90 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1caa0 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20  bjv[0]), " STMT 
1cab0 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20  column", 0);.   
1cac0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1cad0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
1cae0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
1caf0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1cb00 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
1cb10 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
1cb20 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
1cb30 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
1cb40 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
1cb50 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e  , &col) ) return
1cb60 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 74   TCL_ERROR;..  t
1cb70 70 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  p = sqlite3_colu
1cb80 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 63  mn_type(pStmt, c
1cb90 6f 6c 29 3b 0a 20 20 73 77 69 74 63 68 28 20 74  ol);.  switch( t
1cba0 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  p ){.    case SQ
1cbb0 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 0a 20  LITE_INTEGER: . 
1cbc0 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75       Tcl_SetResu
1cbd0 6c 74 28 69 6e 74 65 72 70 2c 20 22 49 4e 54 45  lt(interp, "INTE
1cbe0 47 45 52 22 2c 20 54 43 4c 5f 53 54 41 54 49 43  GER", TCL_STATIC
1cbf0 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ); .      break;
1cc00 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1cc10 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 54 63 6c  _NULL:.      Tcl
1cc20 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
1cc30 70 2c 20 22 4e 55 4c 4c 22 2c 20 54 43 4c 5f 53  p, "NULL", TCL_S
1cc40 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62  TATIC); .      b
1cc50 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
1cc60 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 0a 20 20 20  QLITE_FLOAT:.   
1cc70 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
1cc80 28 69 6e 74 65 72 70 2c 20 22 46 4c 4f 41 54 22  (interp, "FLOAT"
1cc90 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a  , TCL_STATIC); .
1cca0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ccb0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58   case SQLITE_TEX
1ccc0 54 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  T:.      Tcl_Set
1ccd0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1cce0 54 45 58 54 22 2c 20 54 43 4c 5f 53 54 41 54 49  TEXT", TCL_STATI
1ccf0 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b  C); .      break
1cd00 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1cd10 45 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 54 63  E_BLOB:.      Tc
1cd20 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
1cd30 72 70 2c 20 22 42 4c 4f 42 22 2c 20 54 43 4c 5f  rp, "BLOB", TCL_
1cd40 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20  STATIC); .      
1cd50 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
1cd60 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  lt:.      assert
1cd70 28 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  (0);.  }..  retu
1cd80 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1cd90 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1cda0 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20  e3_column_int64 
1cdb0 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a  STMT column.**.*
1cdc0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74  * Return the dat
1cdd0 61 20 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c  a in column 'col
1cde0 75 6d 6e 27 20 6f 66 20 74 68 65 20 63 75 72 72  umn' of the curr
1cdf0 65 6e 74 20 72 6f 77 20 63 61 73 74 20 61 73 20  ent row cast as 
1ce00 61 6e 0a 2a 2a 20 77 69 64 65 20 28 36 34 2d 62  an.** wide (64-b
1ce10 69 74 29 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a  it) integer..*/.
1ce20 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1ce30 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 0a 20 20  column_int64(.  
1ce40 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1ce50 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1ce60 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1ce70 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1ce80 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1ce90 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1cea0 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c  pStmt;.  int col
1ceb0 3b 0a 20 20 69 36 34 20 69 56 61 6c 3b 0a 0a 20  ;.  i64 iVal;.. 
1cec0 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
1ced0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1cee0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1cef0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1cf00 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
1cf10 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
1cf20 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
1cf30 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20  T column", 0);. 
1cf40 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1cf50 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
1cf60 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
1cf70 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1cf80 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1cf90 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
1cfa0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
1cfb0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1cfc0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
1cfd0 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75  2], &col) ) retu
1cfe0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
1cff0 20 69 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f   iVal = sqlite3_
1d000 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74  column_int64(pSt
1d010 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f  mt, col);.  Tcl_
1d020 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
1d030 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65  erp, Tcl_NewWide
1d040 49 6e 74 4f 62 6a 28 69 56 61 6c 29 29 3b 0a 20  IntObj(iVal));. 
1d050 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1d060 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1d070 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
1d080 6c 6f 62 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a  lob STMT column.
1d090 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1d0a0 73 74 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 0a  st_column_blob(.
1d0b0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1d0c0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1d0d0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1d0e0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1d0f0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1d100 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
1d110 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63   *pStmt;.  int c
1d120 6f 6c 3b 0a 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a  ol;..  int len;.
1d130 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42    const void *pB
1d140 6c 6f 62 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  lob;..  if( objc
1d150 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
1d160 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1d170 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1d180 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1d190 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1d1a0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1d1b0 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22  , " STMT column"
1d1c0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1d1d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1d1e0 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
1d1f0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1d200 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1d210 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
1d220 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1d230 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
1d240 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
1d250 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29  , objv[2], &col)
1d260 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1d270 52 4f 52 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 71  ROR;..  len = sq
1d280 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
1d290 65 73 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a  es(pStmt, col);.
1d2a0 20 20 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65    pBlob = sqlite
1d2b0 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53  3_column_blob(pS
1d2c0 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c  tmt, col);.  Tcl
1d2d0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
1d2e0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74  terp, Tcl_NewByt
1d2f0 65 41 72 72 61 79 4f 62 6a 28 70 42 6c 6f 62 2c  eArrayObj(pBlob,
1d300 20 6c 65 6e 29 29 3b 0a 20 20 72 65 74 75 72 6e   len));.  return
1d310 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1d320 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1d330 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 20 53  _column_double S
1d340 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a  TMT column.**.**
1d350 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61   Return the data
1d360 20 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75   in column 'colu
1d370 6d 6e 27 20 6f 66 20 74 68 65 20 63 75 72 72 65  mn' of the curre
1d380 6e 74 20 72 6f 77 20 63 61 73 74 20 61 73 20 61  nt row cast as a
1d390 20 64 6f 75 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74   double..*/.stat
1d3a0 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75  ic int test_colu
1d3b0 6d 6e 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69  mn_double(.  voi
1d3c0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1d3d0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1d3e0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1d3f0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1d400 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
1d410 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1d420 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20  mt;.  int col;. 
1d430 20 64 6f 75 62 6c 65 20 72 56 61 6c 3b 0a 0a 20   double rVal;.. 
1d440 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
1d450 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1d460 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1d470 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1d480 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
1d490 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
1d4a0 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
1d4b0 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20  T column", 0);. 
1d4c0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1d4d0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
1d4e0 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
1d4f0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1d500 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1d510 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
1d520 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
1d530 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1d540 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
1d550 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75  2], &col) ) retu
1d560 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
1d570 20 72 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f   rVal = sqlite3_
1d580 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53  column_double(pS
1d590 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c  tmt, col);.  Tcl
1d5a0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
1d5b0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 44 6f 75  terp, Tcl_NewDou
1d5c0 62 6c 65 4f 62 6a 28 72 56 61 6c 29 29 3b 0a 20  bleObj(rVal));. 
1d5d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1d5e0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1d5f0 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f 75  sqlite3_data_cou
1d600 6e 74 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52  nt STMT .**.** R
1d610 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
1d620 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75   of columns retu
1d630 72 6e 65 64 20 62 79 20 74 68 65 20 73 71 6c 20  rned by the sql 
1d640 73 74 61 74 65 6d 65 6e 74 20 53 54 4d 54 2e 0a  statement STMT..
1d650 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1d660 73 74 5f 64 61 74 61 5f 63 6f 75 6e 74 28 0a 20  st_data_count(. 
1d670 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1d680 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1d690 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1d6a0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1d6b0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1d6c0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1d6d0 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f  *pStmt;..  if( o
1d6e0 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
1d6f0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1d700 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1d710 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1d720 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
1d730 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1d740 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75  0]), " STMT colu
1d750 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  mn", 0);.    ret
1d760 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1d770 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
1d780 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
1d790 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1d7a0 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
1d7b0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1d7c0 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f  ROR;..  Tcl_SetO
1d7d0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
1d7e0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
1d7f0 71 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e  qlite3_data_coun
1d800 74 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 72 65  t(pStmt)));.  re
1d810 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1d820 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1d830 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
1d840 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a   STMT column.**.
1d850 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1d860 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70  3_column_decltyp
1d870 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a  e STMT column.**
1d880 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1d890 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 53  e3_column_name S
1d8a0 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74  TMT column.*/.st
1d8b0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74  atic int test_st
1d8c0 6d 74 5f 75 74 66 38 28 0a 20 20 76 6f 69 64 20  mt_utf8(.  void 
1d8d0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 20 20  * clientData,   
1d8e0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1d8f0 74 6f 20 53 51 4c 69 74 65 20 41 50 49 20 66 75  to SQLite API fu
1d900 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76  nction to be inv
1d910 6f 6b 65 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  oke */.  Tcl_Int
1d920 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1d930 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1d940 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1d950 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
1d960 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
1d970 20 63 6f 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68   col;.  const ch
1d980 61 72 20 2a 28 2a 78 46 75 6e 63 29 28 73 71 6c  ar *(*xFunc)(sql
1d990 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29  ite3_stmt*, int)
1d9a0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1d9b0 7a 52 65 74 3b 0a 0a 20 20 78 46 75 6e 63 20 3d  zRet;..  xFunc =
1d9c0 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 28 2a   (const char *(*
1d9d0 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c  )(sqlite3_stmt*,
1d9e0 20 69 6e 74 29 29 63 6c 69 65 6e 74 44 61 74 61   int))clientData
1d9f0 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ;.  if( objc!=3 
1da00 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1da10 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1da20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1da30 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
1da40 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
1da50 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
1da60 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29  STMT column", 0)
1da70 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1da80 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
1da90 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
1daa0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1dab0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1dac0 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
1dad0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1dae0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
1daf0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
1db00 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72  jv[2], &col) ) r
1db10 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1db20 0a 20 20 7a 52 65 74 20 3d 20 78 46 75 6e 63 28  .  zRet = xFunc(
1db30 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 69  pStmt, col);.  i
1db40 66 28 20 7a 52 65 74 20 29 7b 0a 20 20 20 20 54  f( zRet ){.    T
1db50 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
1db60 65 72 70 2c 20 28 63 68 61 72 20 2a 29 7a 52 65  erp, (char *)zRe
1db70 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  t, 0);.  }.  ret
1db80 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73  urn TCL_OK;.}..s
1db90 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 67  tatic int test_g
1dba0 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28 0a 20  lobal_recover(. 
1dbb0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1dbc0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1dbd0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1dbe0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1dbf0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1dc00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1dc10 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a  OMIT_DEPRECATED.
1dc20 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
1dc30 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54  objc!=1 ){.    T
1dc40 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
1dc50 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
1dc60 20 22 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   "");.    return
1dc70 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1dc80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 67    rc = sqlite3_g
1dc90 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28 29 3b  lobal_recover();
1dca0 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
1dcb0 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
1dcc0 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
1dcd0 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 23  , TCL_STATIC);.#
1dce0 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54  endif.  return T
1dcf0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1dd00 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
1dd10 6f 6c 75 6d 6e 5f 74 65 78 74 20 53 54 4d 54 20  olumn_text STMT 
1dd20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61  column.**.** Usa
1dd30 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
1dd40 6d 6e 5f 64 65 63 6c 74 79 70 65 20 53 54 4d 54  mn_decltype STMT
1dd50 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73   column.**.** Us
1dd60 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
1dd70 75 6d 6e 5f 6e 61 6d 65 20 53 54 4d 54 20 63 6f  umn_name STMT co
1dd80 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lumn.*/.static i
1dd90 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66  nt test_stmt_utf
1dda0 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  16(.  void * cli
1ddb0 65 6e 74 44 61 74 61 2c 20 20 20 20 20 2f 2a 20  entData,     /* 
1ddc0 50 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c 69 74  Pointer to SQLit
1ddd0 65 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 74  e API function t
1dde0 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a  o be invoked */.
1ddf0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1de00 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1de10 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1de20 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
1de30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1de40 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33  _UTF16.  sqlite3
1de50 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
1de60 69 6e 74 20 63 6f 6c 3b 0a 20 20 54 63 6c 5f 4f  int col;.  Tcl_O
1de70 62 6a 20 2a 70 52 65 74 3b 0a 20 20 63 6f 6e 73  bj *pRet;.  cons
1de80 74 20 76 6f 69 64 20 2a 7a 4e 61 6d 65 31 36 3b  t void *zName16;
1de90 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 28  .  const void *(
1dea0 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  *xFunc)(sqlite3_
1deb0 73 74 6d 74 2a 2c 20 69 6e 74 29 3b 0a 0a 20 20  stmt*, int);..  
1dec0 78 46 75 6e 63 20 3d 20 28 63 6f 6e 73 74 20 76  xFunc = (const v
1ded0 6f 69 64 20 2a 28 2a 29 28 73 71 6c 69 74 65 33  oid *(*)(sqlite3
1dee0 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 29 63 6c 69  _stmt*, int))cli
1def0 65 6e 74 44 61 74 61 3b 0a 20 20 69 66 28 20 6f  entData;.  if( o
1df00 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
1df10 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1df20 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1df30 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1df40 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
1df50 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1df60 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75  0]), " STMT colu
1df70 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  mn", 0);.    ret
1df80 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1df90 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
1dfa0 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
1dfb0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1dfc0 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
1dfd0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1dfe0 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
1dff0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
1e000 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63  erp, objv[2], &c
1e010 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ol) ) return TCL
1e020 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 4e 61 6d 65  _ERROR;..  zName
1e030 31 36 20 3d 20 78 46 75 6e 63 28 70 53 74 6d 74  16 = xFunc(pStmt
1e040 2c 20 63 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 4e  , col);.  if( zN
1e050 61 6d 65 31 36 20 29 7b 0a 20 20 20 20 69 6e 74  ame16 ){.    int
1e060 20 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   n;.    const ch
1e070 61 72 20 2a 7a 20 3d 20 7a 4e 61 6d 65 31 36 3b  ar *z = zName16;
1e080 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 7a 5b  .    for(n=0; z[
1e090 6e 5d 20 7c 7c 20 7a 5b 6e 2b 31 5d 3b 20 6e 2b  n] || z[n+1]; n+
1e0a0 3d 32 29 7b 7d 0a 20 20 20 20 70 52 65 74 20 3d  =2){}.    pRet =
1e0b0 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
1e0c0 79 4f 62 6a 28 7a 4e 61 6d 65 31 36 2c 20 6e 2b  yObj(zName16, n+
1e0d0 32 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  2);.    Tcl_SetO
1e0e0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
1e0f0 20 70 52 65 74 29 3b 0a 20 20 7d 0a 23 65 6e 64   pRet);.  }.#end
1e100 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1e110 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 20 20 72 65  T_UTF16 */..  re
1e120 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1e130 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1e140 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 20  ite3_column_int 
1e150 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a  STMT column.**.*
1e160 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1e170 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 20 53 54  _column_bytes ST
1e180 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
1e190 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
1e1a0 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36 20 53 54  olumn_bytes16 ST
1e1b0 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2f 0a  MT column.**.*/.
1e1c0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1e1d0 73 74 6d 74 5f 69 6e 74 28 0a 20 20 76 6f 69 64  stmt_int(.  void
1e1e0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 20   * clientData,  
1e1f0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1e200 53 51 4c 69 74 65 20 41 50 49 20 66 75 6e 63 74  SQLite API funct
1e210 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ion to be invoke
1e220 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  d */.  Tcl_Inter
1e230 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1e240 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1e250 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1e260 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
1e270 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63   *pStmt;.  int c
1e280 6f 6c 3b 0a 20 20 69 6e 74 20 28 2a 78 46 75 6e  ol;.  int (*xFun
1e290 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  c)(sqlite3_stmt*
1e2a0 2c 20 69 6e 74 29 3b 0a 0a 20 20 78 46 75 6e 63  , int);..  xFunc
1e2b0 20 3d 20 28 69 6e 74 20 28 2a 29 28 73 71 6c 69   = (int (*)(sqli
1e2c0 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 29  te3_stmt*, int))
1e2d0 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 69 66  clientData;.  if
1e2e0 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
1e2f0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1e300 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1e310 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1e320 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1e330 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1e340 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63  jv[0]), " STMT c
1e350 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20  olumn", 0);.    
1e360 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1e370 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
1e380 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
1e390 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1e3a0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
1e3b0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
1e3c0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
1e3d0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
1e3e0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
1e3f0 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20   &col) ) return 
1e400 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54 63  TCL_ERROR;..  Tc
1e410 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1e420 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
1e430 74 4f 62 6a 28 78 46 75 6e 63 28 70 53 74 6d 74  tObj(xFunc(pStmt
1e440 2c 20 63 6f 6c 29 29 29 3b 0a 20 20 72 65 74 75  , col)));.  retu
1e450 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1e460 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
1e470 74 65 5f 73 65 74 5f 6d 61 67 69 63 20 20 44 42  te_set_magic  DB
1e480 20 20 4d 41 47 49 43 2d 4e 55 4d 42 45 52 0a 2a    MAGIC-NUMBER.*
1e490 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 62 2d  *.** Set the db-
1e4a0 3e 6d 61 67 69 63 20 76 61 6c 75 65 2e 20 20 54  >magic value.  T
1e4b0 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74  his is used to t
1e4c0 65 73 74 20 65 72 72 6f 72 20 72 65 63 6f 76 65  est error recove
1e4d0 72 79 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 73 74 61  ry logic..*/.sta
1e4e0 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f 73  tic int sqlite_s
1e4f0 65 74 5f 6d 61 67 69 63 28 0a 20 20 76 6f 69 64  et_magic(.  void
1e500 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1e510 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1e520 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  erp,.  int argc,
1e530 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29  .  char **argv.)
1e540 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1e550 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29  .  if( argc!=3 )
1e560 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1e570 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1e580 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1e590 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
1e5a0 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 22  v[0],.         "
1e5b0 20 44 42 20 4d 41 47 49 43 22 2c 20 30 29 3b 0a   DB MAGIC", 0);.
1e5c0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1e5d0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1e5e0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1e5f0 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
1e600 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1e610 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 73 74 72  ERROR;.  if( str
1e620 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51  cmp(argv[2], "SQ
1e630 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 22  LITE_MAGIC_OPEN"
1e640 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  )==0 ){.    db->
1e650 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
1e660 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c  AGIC_OPEN;.  }el
1e670 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72  se if( strcmp(ar
1e680 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d  gv[2], "SQLITE_M
1e690 41 47 49 43 5f 43 4c 4f 53 45 44 22 29 3d 3d 30  AGIC_CLOSED")==0
1e6a0 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69   ){.    db->magi
1e6b0 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
1e6c0 5f 43 4c 4f 53 45 44 3b 0a 20 20 7d 65 6c 73 65  _CLOSED;.  }else
1e6d0 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
1e6e0 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47  [2], "SQLITE_MAG
1e6f0 49 43 5f 42 55 53 59 22 29 3d 3d 30 20 29 7b 0a  IC_BUSY")==0 ){.
1e700 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20      db->magic = 
1e710 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53  SQLITE_MAGIC_BUS
1e720 59 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  Y;.  }else if( s
1e730 74 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22  trcmp(argv[2], "
1e740 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52  SQLITE_MAGIC_ERR
1e750 4f 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64  OR")==0 ){.    d
1e760 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
1e770 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a 20  E_MAGIC_ERROR;. 
1e780 20 7d 65 6c 73 65 20 69 66 28 20 54 63 6c 5f 47   }else if( Tcl_G
1e790 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72  etInt(interp, ar
1e7a0 67 76 5b 32 5d 2c 20 28 69 6e 74 2a 29 26 64 62  gv[2], (int*)&db
1e7b0 2d 3e 6d 61 67 69 63 29 20 29 7b 0a 20 20 20 20  ->magic) ){.    
1e7c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1e7d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
1e7e0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1e7f0 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
1e800 69 6e 74 65 72 72 75 70 74 20 20 44 42 20 0a 2a  interrupt  DB .*
1e810 2a 0a 2a 2a 20 54 72 69 67 67 65 72 20 61 6e 20  *.** Trigger an 
1e820 69 6e 74 65 72 72 75 70 74 20 6f 6e 20 44 42 0a  interrupt on DB.
1e830 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1e840 73 74 5f 69 6e 74 65 72 72 75 70 74 28 0a 20 20  st_interrupt(.  
1e850 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1e860 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1e870 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61  *interp,.  int a
1e880 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72  rgc,.  char **ar
1e890 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  gv.){.  sqlite3 
1e8a0 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21  *db;.  if( argc!
1e8b0 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
1e8c0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1e8d0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1e8e0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1e8f0 20 61 72 67 76 5b 30 5d 2c 20 22 20 44 42 22 2c   argv[0], " DB",
1e900 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1e910 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1e920 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
1e930 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
1e940 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
1e950 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71   TCL_ERROR;.  sq
1e960 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28  lite3_interrupt(
1e970 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  db);.  return TC
1e980 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  L_OK;.}..static 
1e990 75 38 20 2a 73 71 6c 69 74 65 33 5f 73 74 61 63  u8 *sqlite3_stac
1e9a0 6b 5f 62 61 73 65 6c 69 6e 65 20 3d 20 30 3b 0a  k_baseline = 0;.
1e9b0 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20  ./*.** Fill the 
1e9c0 73 74 61 63 6b 20 77 69 74 68 20 61 20 6b 6e 6f  stack with a kno
1e9d0 77 6e 20 62 69 74 70 61 74 74 65 72 6e 2e 0a 2a  wn bitpattern..*
1e9e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72  /.static void pr
1e9f0 65 70 53 74 61 63 6b 28 76 6f 69 64 29 7b 0a 20  epStack(void){. 
1ea00 20 69 6e 74 20 69 3b 0a 20 20 75 33 32 20 62 69   int i;.  u32 bi
1ea10 67 42 75 66 5b 36 35 35 33 36 5d 3b 0a 20 20 66  gBuf[65536];.  f
1ea20 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
1ea30 28 62 69 67 42 75 66 29 2f 73 69 7a 65 6f 66 28  (bigBuf)/sizeof(
1ea40 62 69 67 42 75 66 5b 30 5d 29 3b 20 69 2b 2b 29  bigBuf[0]); i++)
1ea50 20 62 69 67 42 75 66 5b 69 5d 20 3d 20 30 78 64   bigBuf[i] = 0xd
1ea60 65 61 64 62 65 65 66 3b 0a 20 20 73 71 6c 69 74  eadbeef;.  sqlit
1ea70 65 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e  e3_stack_baselin
1ea80 65 20 3d 20 28 75 38 2a 29 26 62 69 67 42 75 66  e = (u8*)&bigBuf
1ea90 5b 36 35 35 33 36 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  [65536];.}../*.*
1eaa0 2a 20 47 65 74 20 74 68 65 20 63 75 72 72 65 6e  * Get the curren
1eab0 74 20 73 74 61 63 6b 20 64 65 70 74 68 2e 20 20  t stack depth.  
1eac0 55 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69  Used for debuggi
1ead0 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 75 36 34 20  ng only..*/.u64 
1eae0 73 71 6c 69 74 65 33 53 74 61 63 6b 44 65 70 74  sqlite3StackDept
1eaf0 68 28 76 6f 69 64 29 7b 0a 20 20 75 38 20 78 3b  h(void){.  u8 x;
1eb00 0a 20 20 72 65 74 75 72 6e 20 28 75 36 34 29 28  .  return (u64)(
1eb10 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62 61  sqlite3_stack_ba
1eb20 73 65 6c 69 6e 65 20 2d 20 26 78 29 3b 0a 7d 0a  seline - &x);.}.
1eb30 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
1eb40 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 75 73 65  qlite3_stack_use
1eb50 64 20 44 42 20 53 51 4c 0a 2a 2a 0a 2a 2a 20 54  d DB SQL.**.** T
1eb60 72 79 20 74 6f 20 6d 65 61 73 75 72 65 20 74 68  ry to measure th
1eb70 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 74 61 63  e amount of stac
1eb80 6b 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20  k space used by 
1eb90 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
1eba0 33 5f 65 78 65 63 0a 2a 2f 0a 73 74 61 74 69 63  3_exec.*/.static
1ebb0 20 69 6e 74 20 74 65 73 74 5f 73 74 61 63 6b 5f   int test_stack_
1ebc0 75 73 65 64 28 0a 20 20 76 6f 69 64 20 2a 20 63  used(.  void * c
1ebd0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1ebe0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1ebf0 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63  .  int argc,.  c
1ec00 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  har **argv.){.  
1ec10 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
1ec20 6e 74 20 69 3b 0a 20 20 69 66 28 20 61 72 67 63  nt i;.  if( argc
1ec30 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
1ec40 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1ec50 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1ec60 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1ec70 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
1ec80 20 20 20 20 22 20 44 42 20 53 51 4c 22 2c 20 30      " DB SQL", 0
1ec90 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1eca0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1ecb0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
1ecc0 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
1ecd0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
1ece0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 70 72 65 70  CL_ERROR;.  prep
1ecf0 53 74 61 63 6b 28 29 3b 0a 20 20 28 76 6f 69 64  Stack();.  (void
1ed00 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62  )sqlite3_exec(db
1ed10 2c 20 61 72 67 76 5b 32 5d 2c 20 30 2c 20 30 2c  , argv[2], 0, 0,
1ed20 20 30 29 3b 0a 20 20 66 6f 72 28 69 3d 36 35 35   0);.  for(i=655
1ed30 33 35 3b 20 69 3e 3d 30 20 26 26 20 28 28 75 33  35; i>=0 && ((u3
1ed40 32 2a 29 73 71 6c 69 74 65 33 5f 73 74 61 63 6b  2*)sqlite3_stack
1ed50 5f 62 61 73 65 6c 69 6e 65 29 5b 2d 69 5d 3d 3d  _baseline)[-i]==
1ed60 30 78 64 65 61 64 62 65 65 66 3b 20 69 2d 2d 29  0xdeadbeef; i--)
1ed70 7b 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  {}.  Tcl_SetObjR
1ed80 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
1ed90 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 69 2a 34 29  l_NewIntObj(i*4)
1eda0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1edb0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1edc0 67 65 3a 20 73 71 6c 69 74 65 5f 64 65 6c 65 74  ge: sqlite_delet
1edd0 65 5f 66 75 6e 63 74 69 6f 6e 20 44 42 20 66 75  e_function DB fu
1ede0 6e 63 74 69 6f 6e 2d 6e 61 6d 65 0a 2a 2a 0a 2a  nction-name.**.*
1edf0 2a 20 44 65 6c 65 74 65 20 74 68 65 20 75 73 65  * Delete the use
1ee00 72 20 66 75 6e 63 74 69 6f 6e 20 27 66 75 6e 63  r function 'func
1ee10 74 69 6f 6e 2d 6e 61 6d 65 27 20 66 72 6f 6d 20  tion-name' from 
1ee20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
1ee30 44 42 2e 20 49 74 0a 2a 2a 20 69 73 20 61 73 73  DB. It.** is ass
1ee40 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 75 73  umed that the us
1ee50 65 72 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  er function was 
1ee60 63 72 65 61 74 65 64 20 61 73 20 55 54 46 38 2c  created as UTF8,
1ee70 20 61 6e 79 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   any number of.*
1ee80 2a 20 61 72 67 75 6d 65 6e 74 73 20 28 74 68 65  * arguments (the
1ee90 20 77 61 79 20 74 68 65 20 54 43 4c 20 69 6e 74   way the TCL int
1eea0 65 72 66 61 63 65 20 64 6f 65 73 20 69 74 29 2e  erface does it).
1eeb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
1eec0 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a  elete_function(.
1eed0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1eee0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1eef0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1ef00 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a   argc,.  char **
1ef10 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63  argv.){.  int rc
1ef20 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
1ef30 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29  .  if( argc!=3 )
1ef40 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1ef50 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1ef60 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1ef70 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
1ef80 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22  v[0], .        "
1ef90 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d   DB function-nam
1efa0 65 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  e", 0);.    retu
1efb0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1efc0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
1efd0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
1efe0 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
1eff0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1f000 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
1f010 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
1f020 2c 20 61 72 67 76 5b 32 5d 2c 20 2d 31 2c 20 53  , argv[2], -1, S
1f030 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30  QLITE_UTF8, 0, 0
1f040 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53  , 0, 0);.  Tcl_S
1f050 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
1f060 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
1f070 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54  Name(rc), TCL_ST
1f080 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20  ATIC);.  return 
1f090 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1f0a0 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 5f 64   Usage: sqlite_d
1f0b0 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 20  elete_collation 
1f0c0 44 42 20 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 61 6d  DB collation-nam
1f0d0 65 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  e.**.** Delete t
1f0e0 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
1f0f0 75 65 6e 63 65 20 27 63 6f 6c 6c 61 74 69 6f 6e  uence 'collation
1f100 2d 6e 61 6d 65 27 20 66 72 6f 6d 20 64 61 74 61  -name' from data
1f110 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20  base handle .** 
1f120 44 42 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65  DB. It is assume
1f130 64 20 74 68 61 74 20 74 68 65 20 63 6f 6c 6c 61  d that the colla
1f140 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 61  tion sequence wa
1f150 73 20 63 72 65 61 74 65 64 20 61 73 20 55 54 46  s created as UTF
1f160 38 20 28 74 68 65 20 0a 2a 2a 20 77 61 79 20 74  8 (the .** way t
1f170 68 65 20 54 43 4c 20 69 6e 74 65 72 66 61 63 65  he TCL interface
1f180 20 64 6f 65 73 20 69 74 29 2e 0a 2a 2f 0a 73 74   does it)..*/.st
1f190 61 74 69 63 20 69 6e 74 20 64 65 6c 65 74 65 5f  atic int delete_
1f1a0 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 76 6f 69  collation(.  voi
1f1b0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1f1c0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1f1d0 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63  terp,.  int argc
1f1e0 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a  ,.  char **argv.
1f1f0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
1f200 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66  qlite3 *db;.  if
1f210 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20  ( argc!=3 ){.   
1f220 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1f230 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1f240 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1f250 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
1f260 20 0a 20 20 20 20 20 20 20 20 22 20 44 42 20 66   .        " DB f
1f270 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 22 2c 20 30  unction-name", 0
1f280 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1f290 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1f2a0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
1f2b0 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
1f2c0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
1f2d0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
1f2e0 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
1f2f0 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 61 72  collation(db, ar
1f300 67 76 5b 32 5d 2c 20 53 51 4c 49 54 45 5f 55 54  gv[2], SQLITE_UT
1f310 46 38 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c  F8, 0, 0);.  Tcl
1f320 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
1f330 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
1f340 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  orName(rc), TCL_
1f350 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72  STATIC);.  retur
1f360 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1f370 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1f380 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74  3_get_autocommit
1f390 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e   DB.**.** Return
1f3a0 20 74 72 75 65 20 69 66 20 74 68 65 20 64 61 74   true if the dat
1f3b0 61 62 61 73 65 20 44 42 20 69 73 20 63 75 72 72  abase DB is curr
1f3c0 65 6e 74 6c 79 20 69 6e 20 61 75 74 6f 2d 63 6f  ently in auto-co
1f3d0 6d 6d 69 74 20 6d 6f 64 65 2e 0a 2a 2a 20 52 65  mmit mode..** Re
1f3e0 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 6e 6f  turn false if no
1f3f0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
1f400 20 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28   get_autocommit(
1f410 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1f420 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1f430 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1f440 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a  t argc,.  char *
1f450 2a 61 72 67 76 0a 29 7b 0a 20 20 63 68 61 72 20  *argv.){.  char 
1f460 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 73 71 6c 69  zBuf[30];.  sqli
1f470 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61  te3 *db;.  if( a
1f480 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  rgc!=2 ){.    Tc
1f490 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1f4a0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1f4b0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1f4c0 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
1f4d0 20 20 20 20 20 20 20 22 20 44 42 22 2c 20 30 29         " DB", 0)
1f4e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1f4f0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
1f500 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
1f510 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
1f520 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
1f530 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 70 72 69 6e  L_ERROR;.  sprin
1f540 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 73  tf(zBuf, "%d", s
1f550 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63  qlite3_get_autoc
1f560 6f 6d 6d 69 74 28 64 62 29 29 3b 0a 20 20 54 63  ommit(db));.  Tc
1f570 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1f580 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b  nterp, zBuf, 0);
1f590 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1f5a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1f5b0 3a 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74  : sqlite3_busy_t
1f5c0 69 6d 65 6f 75 74 20 44 42 20 4d 53 0a 2a 2a 0a  imeout DB MS.**.
1f5d0 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20  ** Set the busy 
1f5e0 74 69 6d 65 6f 75 74 2e 20 20 54 68 69 73 20 69  timeout.  This i
1f5f0 73 20 6d 6f 72 65 20 65 61 73 69 6c 79 20 64 6f  s more easily do
1f600 6e 65 20 75 73 69 6e 67 20 74 68 65 20 74 69 6d  ne using the tim
1f610 65 6f 75 74 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f  eout.** method o
1f620 66 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 66  f the TCL interf
1f630 61 63 65 2e 20 20 42 75 74 20 77 65 20 6e 65 65  ace.  But we nee
1f640 64 20 61 20 77 61 79 20 74 6f 20 74 65 73 74 20  d a way to test 
1f650 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 72  the case.** wher
1f660 65 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  e it returns SQL
1f670 49 54 45 5f 4d 49 53 55 53 45 2e 0a 2a 2f 0a 73  ITE_MISUSE..*/.s
1f680 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
1f690 75 73 79 5f 74 69 6d 65 6f 75 74 28 0a 20 20 76  usy_timeout(.  v
1f6a0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1f6b0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1f6c0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72  interp,.  int ar
1f6d0 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67  gc,.  char **arg
1f6e0 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6d  v.){.  int rc, m
1f6f0 73 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  s;.  sqlite3 *db
1f700 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
1f710 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1f720 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1f730 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1f740 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
1f750 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20  gv[0], .        
1f760 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72  " DB", 0);.    r
1f770 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1f780 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
1f790 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1f7a0 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
1f7b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1f7c0 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
1f7d0 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
1f7e0 32 5d 2c 20 26 6d 73 29 20 29 20 72 65 74 75 72  2], &ms) ) retur
1f7f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
1f800 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 75 73 79  c = sqlite3_busy
1f810 5f 74 69 6d 65 6f 75 74 28 64 62 2c 20 6d 73 29  _timeout(db, ms)
1f820 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
1f830 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c  sult(interp, sql
1f840 69 74 65 33 54 65 73 74 45 72 72 6f 72 4e 61 6d  ite3TestErrorNam
1f850 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74  e(rc), 0);.  ret
1f860 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1f870 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 74 63 6c  *.** Usage:  tcl
1f880 5f 76 61 72 69 61 62 6c 65 5f 74 79 70 65 20 56  _variable_type V
1f890 41 52 49 41 42 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a  ARIABLENAME.**.*
1f8a0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d  * Return the nam
1f8b0 65 20 6f 66 20 74 68 65 20 69 6e 74 65 72 6e 61  e of the interna
1f8c0 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  l representation
1f8d0 20 66 6f 72 20 74 68 65 0a 2a 2a 20 76 61 6c 75   for the.** valu
1f8e0 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 76  e of the given v
1f8f0 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ariable..*/.stat
1f900 69 63 20 69 6e 74 20 74 63 6c 5f 76 61 72 69 61  ic int tcl_varia
1f910 62 6c 65 5f 74 79 70 65 28 0a 20 20 76 6f 69 64  ble_type(.  void
1f920 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1f930 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1f940 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1f950 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1f960 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 54 63  T objv[].){.  Tc
1f970 6c 5f 4f 62 6a 20 2a 70 56 61 72 3b 0a 20 20 69  l_Obj *pVar;.  i
1f980 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
1f990 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
1f9a0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
1f9b0 6a 76 2c 20 22 56 41 52 49 41 42 4c 45 22 29 3b  jv, "VARIABLE");
1f9c0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1f9d0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 56 61  ERROR;.  }.  pVa
1f9e0 72 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 32 45  r = Tcl_GetVar2E
1f9f0 78 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  x(interp, Tcl_Ge
1fa00 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1fa10 2c 20 30 2c 20 54 43 4c 5f 4c 45 41 56 45 5f 45  , 0, TCL_LEAVE_E
1fa20 52 52 5f 4d 53 47 29 3b 0a 20 20 69 66 28 20 70  RR_MSG);.  if( p
1fa30 56 61 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Var==0 ) return 
1fa40 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
1fa50 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72 20 29   pVar->typePtr )
1fa60 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  {.    Tcl_SetObj
1fa70 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1fa80 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1fa90 70 56 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e  pVar->typePtr->n
1faa0 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a 20  ame, -1));.  }. 
1fab0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1fac0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1fad0 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65   sqlite3_release
1fae0 5f 6d 65 6d 6f 72 79 20 3f 4e 3f 0a 2a 2a 0a 2a  _memory ?N?.**.*
1faf0 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 72 65 6c  * Attempt to rel
1fb00 65 61 73 65 20 6d 65 6d 6f 72 79 20 63 75 72 72  ease memory curr
1fb10 65 6e 74 6c 79 20 68 65 6c 64 20 62 75 74 20 6e  ently held but n
1fb20 6f 74 20 61 63 74 75 61 6c 6c 79 20 72 65 71 75  ot actually requ
1fb30 69 72 65 64 2e 0a 2a 2a 20 54 68 65 20 69 6e 74  ired..** The int
1fb40 65 67 65 72 20 4e 20 69 73 20 74 68 65 20 6e 75  eger N is the nu
1fb50 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 65  mber of bytes we
1fb60 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 72   are trying to r
1fb70 65 6c 65 61 73 65 2e 20 20 54 68 65 20 0a 2a 2a  elease.  The .**
1fb80 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
1fb90 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d   the amount of m
1fba0 65 6d 6f 72 79 20 61 63 74 75 61 6c 6c 79 20 72  emory actually r
1fbb0 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 73 74 61 74  eleased..*/.stat
1fbc0 69 63 20 69 6e 74 20 74 65 73 74 5f 72 65 6c 65  ic int test_rele
1fbd0 61 73 65 5f 6d 65 6d 6f 72 79 28 0a 20 20 76 6f  ase_memory(.  vo
1fbe0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1fbf0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1fc00 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1fc10 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1fc20 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69  NST objv[].){.#i
1fc30 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1fc40 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
1fc50 41 4e 41 47 45 4d 45 4e 54 29 20 26 26 20 21 64  ANAGEMENT) && !d
1fc60 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1fc70 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 69 6e 74  IT_DISKIO).  int
1fc80 20 4e 3b 0a 20 20 69 6e 74 20 61 6d 74 3b 0a 20   N;.  int amt;. 
1fc90 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 26 26 20   if( objc!=1 && 
1fca0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1fcb0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
1fcc0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
1fcd0 20 22 3f 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74   "?N?");.    ret
1fce0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1fcf0 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32   }.  if( objc==2
1fd00 20 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f   ){.    if( Tcl_
1fd10 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
1fd20 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26  terp, objv[1], &
1fd30 4e 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  N) ) return TCL_
1fd40 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ERROR;.  }else{.
1fd50 20 20 20 20 4e 20 3d 20 2d 31 3b 0a 20 20 7d 0a      N = -1;.  }.
1fd60 20 20 61 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f    amt = sqlite3_
1fd70 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 4e  release_memory(N
1fd80 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
1fd90 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
1fda0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 6d 74 29  l_NewIntObj(amt)
1fdb0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
1fdc0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
1fdd0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
1fde0 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f  ite3_db_release_
1fdf0 6d 65 6d 6f 72 79 20 44 42 0a 2a 2a 0a 2a 2a 20  memory DB.**.** 
1fe00 41 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 65 61  Attempt to relea
1fe10 73 65 20 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e  se memory curren
1fe20 74 6c 79 20 68 65 6c 64 20 62 79 20 64 61 74 61  tly held by data
1fe30 62 61 73 65 20 44 42 2e 20 20 52 65 74 75 72 6e  base DB.  Return
1fe40 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63   the.** result c
1fe50 6f 64 65 20 28 77 68 69 63 68 20 69 6e 20 74 68  ode (which in th
1fe60 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d  e current implem
1fe70 65 6e 74 61 74 69 6f 6e 20 69 73 20 61 6c 77 61  entation is alwa
1fe80 79 73 20 7a 65 72 6f 29 2e 0a 2a 2f 0a 73 74 61  ys zero)..*/.sta
1fe90 74 69 63 20 69 6e 74 20 74 65 73 74 5f 64 62 5f  tic int test_db_
1fea0 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 0a  release_memory(.
1feb0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1fec0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1fed0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1fee0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1fef0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1ff00 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1ff10 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
1ff20 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
1ff30 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
1ff40 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
1ff50 2c 20 22 44 42 22 29 3b 0a 20 20 20 20 72 65 74  , "DB");.    ret
1ff60 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1ff70 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
1ff80 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1ff90 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1ffa0 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
1ffb0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1ffc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 62   rc = sqlite3_db
1ffd0 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
1ffe0 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  db);.  Tcl_SetOb
1fff0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
20000 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63  Tcl_NewIntObj(rc
20010 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
20020 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
20030 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 64 62  age:  sqlite3_db
20040 5f 66 69 6c 65 6e 61 6d 65 20 44 42 20 44 42 4e  _filename DB DBN
20050 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  AME.**.** Return
20060 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 66   the name of a f
20070 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ile associated w
20080 69 74 68 20 61 20 64 61 74 61 62 61 73 65 2e 0a  ith a database..
20090 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
200a0 73 74 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 0a  st_db_filename(.
200b0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
200c0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
200d0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
200e0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
200f0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
20100 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
20110 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
20120 44 62 4e 61 6d 65 3b 0a 20 20 69 66 28 20 6f 62  DbName;.  if( ob
20130 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
20140 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
20150 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
20160 44 42 20 44 42 4e 41 4d 45 22 29 3b 0a 20 20 20  DB DBNAME");.   
20170 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
20180 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
20190 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
201a0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
201b0 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
201c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
201d0 52 3b 0a 20 20 7a 44 62 4e 61 6d 65 20 3d 20 54  R;.  zDbName = T
201e0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
201f0 76 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70  v[2]);.  Tcl_App
20200 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
20210 2c 20 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c  , sqlite3_db_fil
20220 65 6e 61 6d 65 28 64 62 2c 20 7a 44 62 4e 61 6d  ename(db, zDbNam
20230 65 29 2c 20 28 76 6f 69 64 2a 29 30 29 3b 0a 20  e), (void*)0);. 
20240 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
20250 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
20260 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 61 64   sqlite3_db_read
20270 6f 6e 6c 79 20 44 42 20 44 42 4e 41 4d 45 0a 2a  only DB DBNAME.*
20280 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 6f 72  *.** Return 1 or
20290 20 30 20 69 66 20 44 42 4e 41 4d 45 20 69 73 20   0 if DBNAME is 
202a0 72 65 61 64 6f 6e 6c 79 20 6f 72 20 6e 6f 74 2e  readonly or not.
202b0 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 44    Return -1 if D
202c0 42 4e 41 4d 45 20 64 6f 65 73 0a 2a 2a 20 6e 6f  BNAME does.** no
202d0 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  t exist..*/.stat
202e0 69 63 20 69 6e 74 20 74 65 73 74 5f 64 62 5f 72  ic int test_db_r
202f0 65 61 64 6f 6e 6c 79 28 0a 20 20 76 6f 69 64 20  eadonly(.  void 
20300 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
20310 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
20320 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
20330 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
20340 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
20350 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
20360 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 3b  t char *zDbName;
20370 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
20380 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
20390 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
203a0 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44 42 4e 41  , objv, "DB DBNA
203b0 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ME");.    return
203c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
203d0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
203e0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
203f0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
20400 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
20410 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 44   TCL_ERROR;.  zD
20420 62 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  bName = Tcl_GetS
20430 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
20440 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
20450 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
20460 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  ewIntObj(sqlite3
20470 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 28 64 62 2c  _db_readonly(db,
20480 20 7a 44 62 4e 61 6d 65 29 29 29 3b 0a 20 20 72   zDbName)));.  r
20490 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
204a0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
204b0 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70  qlite3_soft_heap
204c0 5f 6c 69 6d 69 74 20 3f 4e 3f 0a 2a 2a 0a 2a 2a  _limit ?N?.**.**
204d0 20 51 75 65 72 79 20 6f 72 20 73 65 74 20 74 68   Query or set th
204e0 65 20 73 6f 66 74 20 68 65 61 70 20 6c 69 6d 69  e soft heap limi
204f0 74 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  t for the curren
20500 74 20 74 68 72 65 61 64 2e 20 20 54 68 65 0a 2a  t thread.  The.*
20510 2a 20 6c 69 6d 69 74 20 69 73 20 6f 6e 6c 79 20  * limit is only 
20520 63 68 61 6e 67 65 64 20 69 66 20 74 68 65 20 4e  changed if the N
20530 20 69 73 20 70 72 65 73 65 6e 74 2e 20 20 54 68   is present.  Th
20540 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6d 69 74  e previous limit
20550 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
20560 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
20570 65 73 74 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69  est_soft_heap_li
20580 6d 69 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  mit(.  void * cl
20590 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
205a0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
205b0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
205c0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
205d0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
205e0 5f 69 6e 74 36 34 20 61 6d 74 3b 0a 20 20 73 71  _int64 amt;.  sq
205f0 6c 69 74 65 33 5f 69 6e 74 36 34 20 4e 20 3d 20  lite3_int64 N = 
20600 2d 31 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  -1;.  if( objc!=
20610 31 20 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b 0a  1 && objc!=2 ){.
20620 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
20630 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
20640 6f 62 6a 76 2c 20 22 3f 4e 3f 22 29 3b 0a 20 20  objv, "?N?");.  
20650 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
20660 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62  OR;.  }.  if( ob
20670 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66 28  jc==2 ){.    if(
20680 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46   Tcl_GetWideIntF
20690 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
206a0 62 6a 76 5b 31 5d 2c 20 26 4e 29 20 29 20 72 65  bjv[1], &N) ) re
206b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
206c0 20 20 7d 0a 20 20 61 6d 74 20 3d 20 73 71 6c 69    }.  amt = sqli
206d0 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69  te3_soft_heap_li
206e0 6d 69 74 36 34 28 4e 29 3b 0a 20 20 54 63 6c 5f  mit64(N);.  Tcl_
206f0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
20700 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65  erp, Tcl_NewWide
20710 49 6e 74 4f 62 6a 28 61 6d 74 29 29 3b 0a 20 20  IntObj(amt));.  
20720 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
20730 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
20740 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f   sqlite3_thread_
20750 63 6c 65 61 6e 75 70 0a 2a 2a 0a 2a 2a 20 43 61  cleanup.**.** Ca
20760 6c 6c 20 74 68 65 20 73 71 6c 69 74 65 33 5f 74  ll the sqlite3_t
20770 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 20 41 50  hread_cleanup AP
20780 49 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  I..*/.static int
20790 20 74 65 73 74 5f 74 68 72 65 61 64 5f 63 6c 65   test_thread_cle
207a0 61 6e 75 70 28 0a 20 20 76 6f 69 64 20 2a 20 63  anup(.  void * c
207b0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
207c0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
207d0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
207e0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
207f0 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20  jv[].){.#ifndef 
20800 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
20810 45 43 41 54 45 44 0a 20 20 73 71 6c 69 74 65 33  ECATED.  sqlite3
20820 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28  _thread_cleanup(
20830 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
20840 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
20850 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
20860 69 74 65 33 5f 70 61 67 65 72 5f 72 65 66 63 6f  ite3_pager_refco
20870 75 6e 74 73 20 20 44 42 0a 2a 2a 0a 2a 2a 20 52  unts  DB.**.** R
20880 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20  eturn a list of 
20890 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20 61 72  numbers which ar
208a0 65 20 74 68 65 20 50 61 67 65 72 52 65 66 63 6f  e the PagerRefco
208b0 75 6e 74 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 70  unt for all.** p
208c0 61 67 65 72 73 20 6f 6e 20 65 61 63 68 20 64 61  agers on each da
208d0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
208e0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
208f0 20 74 65 73 74 5f 70 61 67 65 72 5f 72 65 66 63   test_pager_refc
20900 6f 75 6e 74 73 28 0a 20 20 76 6f 69 64 20 2a 20  ounts(.  void * 
20910 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
20920 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
20930 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
20940 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
20950 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
20960 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 69 3b  e3 *db;.  int i;
20970 0a 20 20 69 6e 74 20 76 2c 20 2a 61 3b 0a 20 20  .  int v, *a;.  
20980 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74  Tcl_Obj *pResult
20990 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
209a0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
209b0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
209c0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
209d0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
209e0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
209f0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
20a00 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 22 2c 20  [0], 0), " DB", 
20a10 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
20a20 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
20a30 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
20a40 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
20a50 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
20a60 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
20a70 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 70 52 65 73  CL_ERROR;.  pRes
20a80 75 6c 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  ult = Tcl_NewObj
20a90 28 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ();.  for(i=0; i
20aa0 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
20ab0 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b      if( db->aDb[
20ac0 69 5d 2e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  i].pBt==0 ){.   
20ad0 20 20 20 76 20 3d 20 2d 31 3b 0a 20 20 20 20 7d     v = -1;.    }
20ae0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
20af0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
20b00 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
20b10 20 20 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67    a = sqlite3Pag
20b20 65 72 53 74 61 74 73 28 73 71 6c 69 74 65 33 42  erStats(sqlite3B
20b30 74 72 65 65 50 61 67 65 72 28 64 62 2d 3e 61 44  treePager(db->aD
20b40 62 5b 69 5d 2e 70 42 74 29 29 3b 0a 20 20 20 20  b[i].pBt));.    
20b50 20 20 76 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20    v = a[0];.    
20b60 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
20b70 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
20b80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  ;.    }.    Tcl_
20b90 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
20ba0 6d 65 6e 74 28 30 2c 20 70 52 65 73 75 6c 74 2c  ment(0, pResult,
20bb0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76   Tcl_NewIntObj(v
20bc0 29 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65  ));.  }.  Tcl_Se
20bd0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
20be0 70 2c 20 70 52 65 73 75 6c 74 29 3b 0a 20 20 72  p, pResult);.  r
20bf0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
20c00 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
20c10 20 20 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f    working_64bit_
20c20 69 6e 74 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 54  int.**.** Some T
20c30 43 4c 20 62 75 69 6c 64 73 20 28 65 78 3a 20 63  CL builds (ex: c
20c40 79 67 77 69 6e 29 20 64 6f 20 6e 6f 74 20 73 75  ygwin) do not su
20c50 70 70 6f 72 74 20 36 34 2d 62 69 74 20 69 6e 74  pport 64-bit int
20c60 65 67 65 72 73 2e 20 20 54 68 69 73 0a 2a 2a 20  egers.  This.** 
20c70 6c 65 61 64 73 20 74 6f 20 61 20 6e 75 6d 62 65  leads to a numbe
20c80 72 20 6f 66 20 74 65 73 74 20 66 61 69 6c 75 72  r of test failur
20c90 65 73 2e 20 20 54 68 65 20 70 72 65 73 65 6e 74  es.  The present
20ca0 20 63 6f 6d 6d 61 6e 64 20 63 68 65 63 6b 73 20   command checks 
20cb0 74 68 65 0a 2a 2a 20 54 43 4c 20 62 75 69 6c 64  the.** TCL build
20cc0 20 74 6f 20 73 65 65 20 77 68 65 74 68 65 72 20   to see whether 
20cd0 6f 72 20 6e 6f 74 20 69 74 20 73 75 70 70 6f 72  or not it suppor
20ce0 74 73 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65  ts 64-bit intege
20cf0 72 73 2e 20 20 49 74 0a 2a 2a 20 72 65 74 75 72  rs.  It.** retur
20d00 6e 73 20 54 52 55 45 20 69 66 20 69 74 20 64 6f  ns TRUE if it do
20d10 65 73 20 61 6e 64 20 46 41 4c 53 45 20 69 66 20  es and FALSE if 
20d20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  not..**.** This 
20d30 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20  command is used 
20d40 74 6f 20 77 61 72 6e 20 75 73 65 72 73 20 74 68  to warn users th
20d50 61 74 20 74 68 65 69 72 20 54 43 4c 20 62 75 69  at their TCL bui
20d60 6c 64 20 69 73 20 64 65 66 65 63 74 69 76 65 0a  ld is defective.
20d70 2a 2a 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  ** and that the 
20d80 65 72 72 6f 72 73 20 74 68 65 79 20 61 72 65 20  errors they are 
20d90 73 65 65 69 6e 67 20 69 6e 20 74 68 65 20 74 65  seeing in the te
20da0 73 74 20 73 63 72 69 70 74 73 20 6d 69 67 68 74  st scripts might
20db0 20 62 65 0a 2a 2a 20 61 20 72 65 73 75 6c 74 20   be.** a result 
20dc0 6f 66 20 74 68 65 69 72 20 64 65 66 65 63 74 69  of their defecti
20dd0 76 65 20 54 43 4c 20 72 61 74 68 65 72 20 74 68  ve TCL rather th
20de0 61 6e 20 70 72 6f 62 6c 65 6d 73 20 69 6e 20 53  an problems in S
20df0 51 4c 69 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  QLite..*/.static
20e00 20 69 6e 74 20 77 6f 72 6b 69 6e 67 5f 36 34 62   int working_64b
20e10 69 74 5f 69 6e 74 28 0a 20 20 43 6c 69 65 6e 74  it_int(.  Client
20e20 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
20e30 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
20e40 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
20e50 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
20e60 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
20e70 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
20e80 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
20e90 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
20ea0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
20eb0 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
20ec0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
20ed0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
20ee0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
20ef0 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
20f00 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
20f10 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 54 65  {.  Tcl_Obj *pTe
20f20 73 74 4f 62 6a 3b 0a 20 20 69 6e 74 20 77 6f 72  stObj;.  int wor
20f30 6b 69 6e 67 20 3d 20 30 3b 0a 0a 20 20 70 54 65  king = 0;..  pTe
20f40 73 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 57  stObj = Tcl_NewW
20f50 69 64 65 49 6e 74 4f 62 6a 28 31 30 30 30 30 30  ideIntObj(100000
20f60 30 2a 28 69 36 34 29 31 32 33 34 35 36 37 38 39  0*(i64)123456789
20f70 30 29 3b 0a 20 20 77 6f 72 6b 69 6e 67 20 3d 20  0);.  working = 
20f80 73 74 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 74  strcmp(Tcl_GetSt
20f90 72 69 6e 67 28 70 54 65 73 74 4f 62 6a 29 2c 20  ring(pTestObj), 
20fa0 22 31 32 33 34 35 36 37 38 39 30 30 30 30 30 30  "123456789000000
20fb0 30 22 29 3d 3d 30 3b 0a 20 20 54 63 6c 5f 44 65  0")==0;.  Tcl_De
20fc0 63 72 52 65 66 43 6f 75 6e 74 28 70 54 65 73 74  crRefCount(pTest
20fd0 4f 62 6a 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  Obj);.  Tcl_SetO
20fe0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
20ff0 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f   Tcl_NewBooleanO
21000 62 6a 28 77 6f 72 6b 69 6e 67 29 29 3b 0a 20 20  bj(working));.  
21010 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
21020 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  .../*.** tclcmd:
21030 20 20 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65     vfs_unlink_te
21040 73 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43  st.**.** This TC
21050 4c 20 63 6f 6d 6d 61 6e 64 20 75 6e 72 65 67 69  L command unregi
21060 73 74 65 72 73 20 74 68 65 20 70 72 69 6d 61 72  sters the primar
21070 79 20 56 46 53 20 61 6e 64 20 74 68 65 6e 20 72  y VFS and then r
21080 65 67 69 73 74 65 72 73 0a 2a 2a 20 69 74 20 62  egisters.** it b
21090 61 63 6b 20 61 67 61 69 6e 2e 20 20 54 68 69 73  ack again.  This
210a0 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
210b0 20 74 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20   the ability to 
210c0 72 65 67 69 73 74 65 72 20 61 0a 2a 2a 20 56 46  register a.** VF
210d0 53 20 77 68 65 6e 20 6e 6f 6e 65 20 61 72 65 20  S when none are 
210e0 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73  previously regis
210f0 74 65 72 65 64 2c 20 61 6e 64 20 74 68 65 20 61  tered, and the a
21100 62 69 6c 69 74 79 20 74 6f 20 0a 2a 2a 20 75 6e  bility to .** un
21110 72 65 67 69 73 74 65 72 20 74 68 65 20 6f 6e 6c  register the onl
21120 79 20 61 76 61 69 6c 61 62 6c 65 20 56 46 53 2e  y available VFS.
21130 20 20 54 69 63 6b 65 74 20 23 32 37 33 38 0a 2a    Ticket #2738.*
21140 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73  /.static int vfs
21150 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74 28 0a 20 20  _unlink_test(.  
21160 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
21170 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
21180 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
21190 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
211a0 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
211b0 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
211c0 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
211d0 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
211e0 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
211f0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
21200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
21210 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
21220 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
21230 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
21240 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
21250 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
21260 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
21270 70 4d 61 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33  pMain;.  sqlite3
21280 5f 76 66 73 20 2a 61 70 56 66 73 5b 32 30 5d 3b  _vfs *apVfs[20];
21290 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f  .  sqlite3_vfs o
212a0 6e 65 2c 20 74 77 6f 3b 0a 0a 20 20 73 71 6c 69  ne, two;..  sqli
212b0 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74  te3_vfs_unregist
212c0 65 72 28 30 29 3b 20 20 20 2f 2a 20 55 6e 72 65  er(0);   /* Unre
212d0 67 69 73 74 65 72 20 6f 66 20 4e 55 4c 4c 20 69  gister of NULL i
212e0 73 20 68 61 72 6d 6c 65 73 73 20 2a 2f 0a 20 20  s harmless */.  
212f0 6f 6e 65 2e 7a 4e 61 6d 65 20 3d 20 22 5f 5f 6f  one.zName = "__o
21300 6e 65 22 3b 0a 20 20 74 77 6f 2e 7a 4e 61 6d 65  ne";.  two.zName
21310 20 3d 20 22 5f 5f 74 77 6f 22 3b 0a 0a 20 20 2f   = "__two";..  /
21320 2a 20 43 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  * Calling sqlite
21330 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 20 77  3_vfs_register w
21340 69 74 68 20 32 6e 64 20 61 72 67 75 6d 65 6e 74  ith 2nd argument
21350 20 6f 66 20 30 20 64 6f 65 73 20 6e 6f 74 0a 20   of 0 does not. 
21360 20 2a 2a 20 63 68 61 6e 67 65 20 74 68 65 20 64   ** change the d
21370 65 66 61 75 6c 74 20 56 46 53 0a 20 20 2a 2f 0a  efault VFS.  */.
21380 20 20 70 4d 61 69 6e 20 3d 20 73 71 6c 69 74 65    pMain = sqlite
21390 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20  3_vfs_find(0);. 
213a0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
213b0 69 73 74 65 72 28 26 6f 6e 65 2c 20 30 29 3b 0a  ister(&one, 0);.
213c0 20 20 61 73 73 65 72 74 28 20 70 4d 61 69 6e 3d    assert( pMain=
213d0 3d 30 20 7c 7c 20 70 4d 61 69 6e 3d 3d 73 71 6c  =0 || pMain==sql
213e0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
213f0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   );.  sqlite3_vf
21400 73 5f 72 65 67 69 73 74 65 72 28 26 74 77 6f 2c  s_register(&two,
21410 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70   0);.  assert( p
21420 4d 61 69 6e 3d 3d 30 20 7c 7c 20 70 4d 61 69 6e  Main==0 || pMain
21430 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ==sqlite3_vfs_fi
21440 6e 64 28 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 57  nd(0) );..  /* W
21450 65 20 63 61 6e 20 66 69 6e 64 20 61 20 56 46 53  e can find a VFS
21460 20 62 79 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a   by its name */.
21470 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
21480 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e  3_vfs_find("__on
21490 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 61  e")==&one );.  a
214a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
214b0 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29  fs_find("__two")
214c0 3d 3d 26 74 77 6f 20 29 3b 0a 0a 20 20 2f 2a 20  ==&two );..  /* 
214d0 43 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 5f 76  Calling sqlite_v
214e0 66 73 5f 72 65 67 69 73 74 65 72 20 77 69 74 68  fs_register with
214f0 20 6e 6f 6e 2d 7a 65 72 6f 20 73 65 63 6f 6e 64   non-zero second
21500 20 70 61 72 61 6d 65 74 65 72 20 63 68 61 6e 67   parameter chang
21510 65 73 20 74 68 65 0a 20 20 2a 2a 20 64 65 66 61  es the.  ** defa
21520 75 6c 74 20 56 46 53 2c 20 65 76 65 6e 20 69 66  ult VFS, even if
21530 20 74 68 65 20 31 73 74 20 70 61 72 61 6d 65 74   the 1st paramet
21540 65 72 20 69 73 20 61 6e 20 65 78 69 73 74 69 67  er is an existig
21550 20 56 46 53 20 74 68 61 74 20 69 73 0a 20 20 2a   VFS that is.  *
21560 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67  * previously reg
21570 69 73 74 65 72 65 64 20 61 73 20 74 68 65 20 6e  istered as the n
21580 6f 6e 2d 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f  on-default..  */
21590 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  .  sqlite3_vfs_r
215a0 65 67 69 73 74 65 72 28 26 6f 6e 65 2c 20 31 29  egister(&one, 1)
215b0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
215c0 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f  te3_vfs_find("__
215d0 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20  one")==&one );. 
215e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
215f0 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f  _vfs_find("__two
21600 22 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 61 73  ")==&two );.  as
21610 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66  sert( sqlite3_vf
21620 73 5f 66 69 6e 64 28 30 29 3d 3d 26 6f 6e 65 20  s_find(0)==&one 
21630 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  );.  sqlite3_vfs
21640 5f 72 65 67 69 73 74 65 72 28 26 74 77 6f 2c 20  _register(&two, 
21650 31 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  1);.  assert( sq
21660 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22  lite3_vfs_find("
21670 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20 29 3b  __one")==&one );
21680 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
21690 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74  e3_vfs_find("__t
216a0 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20  wo")==&two );.  
216b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
216c0 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d 26 74 77  vfs_find(0)==&tw
216d0 6f 20 29 3b 0a 20 20 69 66 28 20 70 4d 61 69 6e  o );.  if( pMain
216e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
216f0 76 66 73 5f 72 65 67 69 73 74 65 72 28 70 4d 61  vfs_register(pMa
21700 69 6e 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65  in, 1);.    asse
21710 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
21720 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26  find("__one")==&
21730 6f 6e 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  one );.    asser
21740 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
21750 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74  ind("__two")==&t
21760 77 6f 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  wo );.    assert
21770 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
21780 6e 64 28 30 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a  nd(0)==pMain );.
21790 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 55 6e 6c 69    }.  .  /* Unli
217a0 6e 6b 20 74 68 65 20 64 65 66 61 75 6c 74 20 56  nk the default V
217b0 46 53 2e 20 20 52 65 70 65 61 74 20 75 6e 74 69  FS.  Repeat unti
217c0 6c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  l there are no m
217d0 6f 72 65 20 56 46 53 65 73 0a 20 20 2a 2a 20 72  ore VFSes.  ** r
217e0 65 67 69 73 74 65 72 65 64 2e 0a 20 20 2a 2f 0a  egistered..  */.
217f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
21800 65 6f 66 28 61 70 56 66 73 29 2f 73 69 7a 65 6f  eof(apVfs)/sizeo
21810 66 28 61 70 56 66 73 5b 30 5d 29 3b 20 69 2b 2b  f(apVfs[0]); i++
21820 29 7b 0a 20 20 20 20 61 70 56 66 73 5b 69 5d 20  ){.    apVfs[i] 
21830 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
21840 6e 64 28 30 29 3b 0a 20 20 20 20 69 66 28 20 61  nd(0);.    if( a
21850 70 56 66 73 5b 69 5d 20 29 7b 0a 20 20 20 20 20  pVfs[i] ){.     
21860 20 61 73 73 65 72 74 28 20 61 70 56 66 73 5b 69   assert( apVfs[i
21870 5d 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  ]==sqlite3_vfs_f
21880 69 6e 64 28 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e  ind(apVfs[i]->zN
21890 61 6d 65 29 20 29 3b 0a 20 20 20 20 20 20 73 71  ame) );.      sq
218a0 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69  lite3_vfs_unregi
218b0 73 74 65 72 28 61 70 56 66 73 5b 69 5d 29 3b 0a  ster(apVfs[i]);.
218c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30 3d        assert( 0=
218d0 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e  =sqlite3_vfs_fin
218e0 64 28 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d  d(apVfs[i]->zNam
218f0 65 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  e) );.    }.  }.
21900 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c    assert( 0==sql
21910 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
21920 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 52 65 67 69   );.  .  /* Regi
21930 73 74 65 72 20 74 68 65 20 6d 61 69 6e 20 56 46  ster the main VF
21940 53 20 61 73 20 6e 6f 6e 2d 64 65 66 61 75 6c 74  S as non-default
21950 20 28 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 64   (will be made d
21960 65 66 61 75 6c 74 2c 20 73 69 6e 63 65 0a 20 20  efault, since.  
21970 2a 2a 20 69 74 27 6c 6c 20 62 65 20 74 68 65 20  ** it'll be the 
21980 6f 6e 6c 79 20 6f 6e 65 20 69 6e 20 65 78 69 73  only one in exis
21990 74 65 6e 63 65 29 2e 0a 20 20 2a 2f 0a 20 20 73  tence)..  */.  s
219a0 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
219b0 74 65 72 28 70 4d 61 69 6e 2c 20 30 29 3b 0a 20  ter(pMain, 0);. 
219c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
219d0 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d 70 4d  _vfs_find(0)==pM
219e0 61 69 6e 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 55  ain );.  .  /* U
219f0 6e 2d 72 65 67 69 73 74 65 72 20 74 68 65 20 6d  n-register the m
21a00 61 69 6e 20 56 46 53 20 61 67 61 69 6e 20 74 6f  ain VFS again to
21a10 20 72 65 73 74 6f 72 65 20 61 6e 20 65 6d 70 74   restore an empt
21a20 79 20 56 46 53 20 6c 69 73 74 20 2a 2f 0a 20 20  y VFS list */.  
21a30 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65  sqlite3_vfs_unre
21a40 67 69 73 74 65 72 28 70 4d 61 69 6e 29 3b 0a 20  gister(pMain);. 
21a50 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69   assert( 0==sqli
21a60 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20  te3_vfs_find(0) 
21a70 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 69 6e 6b 20  );..  /* Relink 
21a80 61 6c 6c 20 56 46 53 65 73 20 69 6e 20 72 65 76  all VFSes in rev
21a90 65 72 73 65 20 6f 72 64 65 72 2e 20 2a 2f 20 20  erse order. */  
21aa0 0a 20 20 66 6f 72 28 69 3d 73 69 7a 65 6f 66 28  .  for(i=sizeof(
21ab0 61 70 56 66 73 29 2f 73 69 7a 65 6f 66 28 61 70  apVfs)/sizeof(ap
21ac0 56 66 73 5b 30 5d 29 2d 31 3b 20 69 3e 3d 30 3b  Vfs[0])-1; i>=0;
21ad0 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61   i--){.    if( a
21ae0 70 56 66 73 5b 69 5d 20 29 7b 0a 20 20 20 20 20  pVfs[i] ){.     
21af0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
21b00 69 73 74 65 72 28 61 70 56 66 73 5b 69 5d 2c 20  ister(apVfs[i], 
21b10 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  1);.      assert
21b20 28 20 61 70 56 66 73 5b 69 5d 3d 3d 73 71 6c 69  ( apVfs[i]==sqli
21b30 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20  te3_vfs_find(0) 
21b40 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
21b50 20 61 70 56 66 73 5b 69 5d 3d 3d 73 71 6c 69 74   apVfs[i]==sqlit
21b60 65 33 5f 76 66 73 5f 66 69 6e 64 28 61 70 56 66  e3_vfs_find(apVf
21b70 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a  s[i]->zName) );.
21b80 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
21b90 55 6e 72 65 67 69 73 74 65 72 20 6f 75 74 20 73  Unregister out s
21ba0 61 6d 70 6c 65 20 56 46 53 65 73 2e 20 2a 2f 0a  ample VFSes. */.
21bb0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e    sqlite3_vfs_un
21bc0 72 65 67 69 73 74 65 72 28 26 6f 6e 65 29 3b 0a  register(&one);.
21bd0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e    sqlite3_vfs_un
21be0 72 65 67 69 73 74 65 72 28 26 74 77 6f 29 3b 0a  register(&two);.
21bf0 0a 20 20 2f 2a 20 55 6e 72 65 67 69 73 74 65 72  .  /* Unregister
21c00 69 6e 67 20 61 20 56 46 53 20 74 68 61 74 20 69  ing a VFS that i
21c10 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  s not currently 
21c20 72 65 67 69 73 74 65 72 65 64 20 69 73 20 68 61  registered is ha
21c30 72 6d 6c 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69  rmless */.  sqli
21c40 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74  te3_vfs_unregist
21c50 65 72 28 26 6f 6e 65 29 3b 0a 20 20 73 71 6c 69  er(&one);.  sqli
21c60 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74  te3_vfs_unregist
21c70 65 72 28 26 74 77 6f 29 3b 0a 20 20 61 73 73 65  er(&two);.  asse
21c80 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
21c90 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 30  find("__one")==0
21ca0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
21cb0 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22  lite3_vfs_find("
21cc0 5f 5f 74 77 6f 22 29 3d 3d 30 20 29 3b 0a 0a 20  __two")==0 );.. 
21cd0 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 62 65   /* We should be
21ce0 20 6c 65 66 74 20 77 69 74 68 20 74 68 65 20 6f   left with the o
21cf0 72 69 67 69 6e 61 6c 20 64 65 66 61 75 6c 74 20  riginal default 
21d00 56 46 53 20 62 61 63 6b 20 61 73 20 74 68 65 0a  VFS back as the.
21d10 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 2a 2f    ** original */
21d20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
21d30 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d  e3_vfs_find(0)==
21d40 70 4d 61 69 6e 20 29 3b 0a 0a 20 20 72 65 74 75  pMain );..  retu
21d50 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
21d60 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76 66  .** tclcmd:   vf
21d70 73 5f 69 6e 69 74 66 61 69 6c 5f 74 65 73 74 0a  s_initfail_test.
21d80 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63  **.** This TCL c
21d90 6f 6d 6d 61 6e 64 20 61 74 74 65 6d 70 74 73 20  ommand attempts 
21da0 74 6f 20 76 66 73 5f 66 69 6e 64 20 61 6e 64 20  to vfs_find and 
21db0 76 66 73 5f 72 65 67 69 73 74 65 72 20 77 68 65  vfs_register whe
21dc0 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  n the.** sqlite3
21dd0 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 69 6e  _initialize() in
21de0 74 65 72 66 61 63 65 20 69 73 20 66 61 69 6c 69  terface is faili
21df0 6e 67 2e 20 20 41 6c 6c 20 63 61 6c 6c 73 20 73  ng.  All calls s
21e00 68 6f 75 6c 64 20 66 61 69 6c 2e 0a 2a 2f 0a 73  hould fail..*/.s
21e10 74 61 74 69 63 20 69 6e 74 20 76 66 73 5f 69 6e  tatic int vfs_in
21e20 69 74 66 61 69 6c 5f 74 65 73 74 28 0a 20 20 43  itfail_test(.  C
21e30 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
21e40 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
21e50 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
21e60 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
21e70 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
21e80 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
21e90 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
21ea0 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
21eb0 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
21ec0 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
21ed0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
21ee0 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
21ef0 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
21f00 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
21f10 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
21f20 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
21f30 5f 76 66 73 20 6f 6e 65 3b 0a 20 20 6f 6e 65 2e  _vfs one;.  one.
21f40 7a 4e 61 6d 65 20 3d 20 22 5f 5f 6f 6e 65 22 3b  zName = "__one";
21f50 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ..  if( sqlite3_
21f60 76 66 73 5f 66 69 6e 64 28 30 29 20 29 20 72 65  vfs_find(0) ) re
21f70 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
21f80 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65    sqlite3_vfs_re
21f90 67 69 73 74 65 72 28 26 6f 6e 65 2c 20 30 29 3b  gister(&one, 0);
21fa0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76  .  if( sqlite3_v
21fb0 66 73 5f 66 69 6e 64 28 30 29 20 29 20 72 65 74  fs_find(0) ) ret
21fc0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
21fd0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
21fe0 69 73 74 65 72 28 26 6f 6e 65 2c 20 31 29 3b 0a  ister(&one, 1);.
21ff0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 66    if( sqlite3_vf
22000 73 5f 66 69 6e 64 28 30 29 20 29 20 72 65 74 75  s_find(0) ) retu
22010 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
22020 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
22030 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 64 20 56 46  ../*.** Saved VF
22040 53 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  Ses.*/.static sq
22050 6c 69 74 65 33 5f 76 66 73 20 2a 61 70 56 66 73  lite3_vfs *apVfs
22060 5b 32 30 5d 3b 0a 73 74 61 74 69 63 20 69 6e 74  [20];.static int
22070 20 6e 56 66 73 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a   nVfs = 0;../*.*
22080 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f  * tclcmd:   vfs_
22090 75 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c 0a 2a  unregister_all.*
220a0 2a 0a 2a 2a 20 55 6e 72 65 67 69 73 74 65 72 20  *.** Unregister 
220b0 61 6c 6c 20 56 46 53 65 73 2e 0a 2a 2f 0a 73 74  all VFSes..*/.st
220c0 61 74 69 63 20 69 6e 74 20 76 66 73 5f 75 6e 72  atic int vfs_unr
220d0 65 67 69 73 74 65 72 5f 61 6c 6c 28 0a 20 20 43  egister_all(.  C
220e0 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
220f0 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
22100 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
22110 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
22120 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
22130 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
22140 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
22150 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
22160 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
22170 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
22180 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
22190 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
221a0 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
221b0 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
221c0 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
221d0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
221e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
221f0 61 79 53 69 7a 65 28 61 70 56 66 73 29 3b 20 69  aySize(apVfs); i
22200 2b 2b 29 7b 0a 20 20 20 20 61 70 56 66 73 5b 69  ++){.    apVfs[i
22210 5d 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  ] = sqlite3_vfs_
22220 66 69 6e 64 28 30 29 3b 0a 20 20 20 20 69 66 28  find(0);.    if(
22230 20 61 70 56 66 73 5b 69 5d 3d 3d 30 20 29 20 62   apVfs[i]==0 ) b
22240 72 65 61 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65  reak;.    sqlite
22250 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72  3_vfs_unregister
22260 28 61 70 56 66 73 5b 69 5d 29 3b 0a 20 20 7d 0a  (apVfs[i]);.  }.
22270 20 20 6e 56 66 73 20 3d 20 69 3b 0a 20 20 72 65    nVfs = i;.  re
22280 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f  turn TCL_OK;.}./
22290 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76  *.** tclcmd:   v
222a0 66 73 5f 72 65 72 65 67 69 73 74 65 72 5f 61 6c  fs_reregister_al
222b0 6c 0a 2a 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20  l.**.** Restore 
222c0 61 6c 6c 20 56 46 53 65 73 20 74 68 61 74 20 77  all VFSes that w
222d0 65 72 65 20 72 65 6d 6f 76 65 64 20 75 73 69 6e  ere removed usin
222e0 67 20 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72  g vfs_unregister
222f0 5f 61 6c 6c 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _all.*/.static i
22300 6e 74 20 76 66 73 5f 72 65 72 65 67 69 73 74 65  nt vfs_reregiste
22310 72 5f 61 6c 6c 28 0a 20 20 43 6c 69 65 6e 74 44  r_all(.  ClientD
22320 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
22330 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
22340 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
22350 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
22360 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
22370 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
22380 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
22390 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
223a0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
223b0 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
223c0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
223d0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
223e0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
223f0 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
22400 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
22410 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
22420 69 3d 30 3b 20 69 3c 6e 56 66 73 3b 20 69 2b 2b  i=0; i<nVfs; i++
22430 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
22440 66 73 5f 72 65 67 69 73 74 65 72 28 61 70 56 66  fs_register(apVf
22450 73 5b 69 5d 2c 20 69 3d 3d 30 29 3b 0a 20 20 7d  s[i], i==0);.  }
22460 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
22470 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  ;.}.../*.** tclc
22480 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72  md:   file_contr
22490 6f 6c 5f 74 65 73 74 20 44 42 0a 2a 2a 0a 2a 2a  ol_test DB.**.**
224a0 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e   This TCL comman
224b0 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74  d runs the sqlit
224c0 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20  e3_file_control 
224d0 69 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a  interface and.**
224e0 20 76 65 72 69 66 69 65 73 20 63 6f 72 72 65 63   verifies correc
224f0 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74  t operation of t
22500 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  he same..*/.stat
22510 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74  ic int file_cont
22520 72 6f 6c 5f 74 65 73 74 28 0a 20 20 43 6c 69 65  rol_test(.  Clie
22530 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
22540 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
22550 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
22560 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
22570 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
22580 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
22590 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
225a0 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
225b0 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
225c0 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
225d0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
225e0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
225f0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
22600 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
22610 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
22620 0a 29 7b 0a 20 20 69 6e 74 20 69 41 72 67 20 3d  .){.  int iArg =
22630 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   0;.  sqlite3 *d
22640 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  b;.  int rc;..  
22650 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
22660 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
22670 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
22680 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
22690 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
226a0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
226b0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
226c0 30 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20  0), " DB", 0);. 
226d0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
226e0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
226f0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
22700 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
22710 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
22720 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
22730 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
22740 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
22750 28 64 62 2c 20 30 2c 20 30 2c 20 26 69 41 72 67  (db, 0, 0, &iArg
22760 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
22770 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
22780 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
22790 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
227a0 64 62 2c 20 22 6e 6f 74 61 64 61 74 61 62 61 73  db, "notadatabas
227b0 65 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  e", SQLITE_FCNTL
227c0 5f 4c 4f 43 4b 53 54 41 54 45 2c 20 26 69 41 72  _LOCKSTATE, &iAr
227d0 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  g);.  assert( rc
227e0 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  ==SQLITE_ERROR )
227f0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
22800 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
22810 2c 20 22 6d 61 69 6e 22 2c 20 2d 31 2c 20 26 69  , "main", -1, &i
22820 41 72 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Arg);.  assert( 
22830 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  rc==SQLITE_NOTFO
22840 55 4e 44 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  UND );.  rc = sq
22850 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
22860 6f 6c 28 64 62 2c 20 22 74 65 6d 70 22 2c 20 2d  ol(db, "temp", -
22870 31 2c 20 26 69 41 72 67 29 3b 0a 20 20 61 73 73  1, &iArg);.  ass
22880 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
22890 4e 4f 54 46 4f 55 4e 44 20 7c 7c 20 72 63 3d 3d  NOTFOUND || rc==
228a0 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
228b0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
228c0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  ;.}.../*.** tclc
228d0 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72  md:   file_contr
228e0 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f 5f 74 65 73  ol_lasterrno_tes
228f0 74 20 44 42 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  t DB.**.** This 
22900 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73  TCL command runs
22910 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
22920 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66  e_control interf
22930 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66  ace and.** verif
22940 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72  ies correct oper
22950 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c  ation of the SQL
22960 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 20 76  ITE_LAST_ERRNO v
22970 65 72 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  erb..*/.static i
22980 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  nt file_control_
22990 6c 61 73 74 65 72 72 6e 6f 5f 74 65 73 74 28 0a  lasterrno_test(.
229a0 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
229b0 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
229c0 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
229d0 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
229e0 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
229f0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
22a00 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
22a10 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
22a20 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
22a30 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
22a40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
22a50 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
22a60 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
22a70 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
22a80 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
22a90 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nts */.){.  int 
22aa0 69 41 72 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69  iArg = 0;.  sqli
22ab0 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
22ac0 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
22ad0 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
22ae0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
22af0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
22b00 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
22b10 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
22b20 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
22b30 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 22 2c  v[0], 0), " DB",
22b40 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
22b50 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
22b60 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
22b70 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
22b80 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
22b90 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65  , &db) ){.    re
22ba0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
22bb0 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
22bc0 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
22bd0 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45  db, NULL, SQLITE
22be0 5f 4c 41 53 54 5f 45 52 52 4e 4f 2c 20 26 69 41  _LAST_ERRNO, &iA
22bf0 72 67 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  rg);.  if( rc ){
22c00 20 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a   .    Tcl_SetObj
22c10 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
22c20 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29  cl_NewIntObj(rc)
22c30 29 3b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ); .    return T
22c40 43 4c 5f 45 52 52 4f 52 3b 20 0a 20 20 7d 0a 20  CL_ERROR; .  }. 
22c50 20 69 66 28 20 69 41 72 67 21 3d 30 20 29 20 7b   if( iArg!=0 ) {
22c60 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
22c70 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 55  esult(interp, "U
22c80 6e 65 78 70 65 63 74 65 64 20 6e 6f 6e 2d 7a 65  nexpected non-ze
22c90 72 6f 20 65 72 72 6e 6f 3a 20 22 2c 0a 20 20 20  ro errno: ",.   
22ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cb0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
22cc0 72 6f 6d 4f 62 6a 28 54 63 6c 5f 4e 65 77 49 6e  romObj(Tcl_NewIn
22cd0 74 4f 62 6a 28 69 41 72 67 29 2c 20 30 29 2c 20  tObj(iArg), 0), 
22ce0 22 20 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  " ", 0);.    ret
22cf0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
22d00 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
22d10 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  OK;  .}../*.** t
22d20 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f  clcmd:   file_co
22d30 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f  ntrol_chunksize_
22d40 74 65 73 74 20 44 42 20 44 42 4e 41 4d 45 20 53  test DB DBNAME S
22d50 49 5a 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54  IZE.**.** This T
22d60 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20  CL command runs 
22d70 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
22d80 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61  _control interfa
22d90 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69  ce and.** verifi
22da0 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61  es correct opera
22db0 74 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 49  tion of the SQLI
22dc0 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_GET_LOCKPROXY
22dd0 46 49 4c 45 20 61 6e 64 0a 2a 2a 20 53 51 4c 49  FILE and.** SQLI
22de0 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_SET_LOCKPROXY
22df0 46 49 4c 45 20 76 65 72 62 73 2e 0a 2a 2f 0a 73  FILE verbs..*/.s
22e00 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63  tatic int file_c
22e10 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65  ontrol_chunksize
22e20 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44  _test(.  ClientD
22e30 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
22e40 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
22e50 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
22e60 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
22e70 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
22e80 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
22e90 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
22ea0 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
22eb0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
22ec0 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
22ed0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
22ee0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
22ef0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
22f00 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
22f10 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
22f20 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20  .  int nSize;   
22f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f40 20 20 20 2f 2a 20 4e 65 77 20 63 68 75 6e 6b 20     /* New chunk 
22f50 73 69 7a 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  size */.  char *
22f60 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  zDb;            
22f70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 62 20            /* Db 
22f80 6e 61 6d 65 20 28 22 6d 61 69 6e 22 2c 20 22 74  name ("main", "t
22f90 65 6d 70 22 20 65 74 63 2e 29 20 2a 2f 0a 20 20  emp" etc.) */.  
22fa0 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
22fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fc0 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
22fd0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  le */.  int rc; 
22fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ff0 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 5f          /* file_
23000 63 6f 6e 74 72 6f 6c 28 29 20 72 65 74 75 72 6e  control() return
23010 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20   code */..  if( 
23020 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
23030 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
23040 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
23050 20 22 44 42 20 44 42 4e 41 4d 45 20 53 49 5a 45   "DB DBNAME SIZE
23060 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
23070 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
23080 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
23090 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
230a0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
230b0 20 26 64 62 29 20 0a 20 20 20 7c 7c 20 54 63 6c   &db) .   || Tcl
230c0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
230d0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
230e0 26 6e 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20  &nSize).  ){.   
230f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
23100 3b 0a 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54 63  ;.  }.  zDb = Tc
23110 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
23120 5b 32 5d 29 3b 0a 20 20 69 66 28 20 7a 44 62 5b  [2]);.  if( zDb[
23130 30 5d 3d 3d 27 5c 30 27 20 29 20 7a 44 62 20 3d  0]=='\0' ) zDb =
23140 20 4e 55 4c 4c 3b 0a 0a 20 20 72 63 20 3d 20 73   NULL;..  rc = s
23150 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
23160 72 6f 6c 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c  rol(db, zDb, SQL
23170 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f  ITE_FCNTL_CHUNK_
23180 53 49 5a 45 2c 20 28 76 6f 69 64 20 2a 29 26 6e  SIZE, (void *)&n
23190 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Size);.  if( rc 
231a0 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
231b0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
231c0 61 72 20 2a 29 73 71 6c 69 74 65 33 54 65 73 74  ar *)sqlite3Test
231d0 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
231e0 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  CL_STATIC);.    
231f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
23200 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
23210 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
23220 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63  tclcmd:   file_c
23230 6f 6e 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f  ontrol_sizehint_
23240 74 65 73 74 20 44 42 20 44 42 4e 41 4d 45 20 53  test DB DBNAME S
23250 49 5a 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54  IZE.**.** This T
23260 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20  CL command runs 
23270 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
23280 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61  _control interfa
23290 63 65 20 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49  ce .** with SQLI
232a0 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  TE_FCNTL_SIZE_HI
232b0 4e 54 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  NT.*/.static int
232c0 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69   file_control_si
232d0 7a 65 68 69 6e 74 5f 74 65 73 74 28 0a 20 20 43  zehint_test(.  C
232e0 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
232f0 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
23300 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
23310 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
23320 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
23330 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
23340 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
23350 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
23360 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
23370 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
23380 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
23390 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
233a0 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
233b0 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
233c0 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
233d0 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
233e0 5f 69 6e 74 36 34 20 6e 53 69 7a 65 3b 20 20 20  _int64 nSize;   
233f0 20 20 20 20 20 20 20 20 20 2f 2a 20 48 69 6e 74           /* Hint
23400 65 64 20 73 69 7a 65 20 2a 2f 0a 20 20 63 68 61  ed size */.  cha
23410 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20  r *zDb;         
23420 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23430 44 62 20 6e 61 6d 65 20 28 22 6d 61 69 6e 22 2c  Db name ("main",
23440 20 22 74 65 6d 70 22 20 65 74 63 2e 29 20 2a 2f   "temp" etc.) */
23450 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
23460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23470 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
23480 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72  andle */.  int r
23490 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
234a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69             /* fi
234b0 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29 20 72 65 74  le_control() ret
234c0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69  urn code */..  i
234d0 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
234e0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
234f0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
23500 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d 45 20 53  jv, "DB DBNAME S
23510 49 5a 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72  IZE");.    retur
23520 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
23530 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
23540 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
23550 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
23560 5d 29 2c 20 26 64 62 29 20 0a 20 20 20 7c 7c 20  ]), &db) .   || 
23570 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72  Tcl_GetWideIntFr
23580 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
23590 6a 76 5b 33 5d 2c 20 26 6e 53 69 7a 65 29 0a 20  jv[3], &nSize). 
235a0 20 29 7b 0a 20 20 20 72 65 74 75 72 6e 20 54 43   ){.   return TC
235b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
235c0 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  Db = Tcl_GetStri
235d0 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69  ng(objv[2]);.  i
235e0 66 28 20 7a 44 62 5b 30 5d 3d 3d 27 5c 30 27 20  f( zDb[0]=='\0' 
235f0 29 20 7a 44 62 20 3d 20 4e 55 4c 4c 3b 0a 0a 20  ) zDb = NULL;.. 
23600 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
23610 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a  le_control(db, z
23620 44 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  Db, SQLITE_FCNTL
23630 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 28 76 6f 69  _SIZE_HINT, (voi
23640 64 20 2a 29 26 6e 53 69 7a 65 29 3b 0a 20 20 69  d *)&nSize);.  i
23650 66 28 20 72 63 20 29 7b 0a 20 20 20 20 54 63 6c  f( rc ){.    Tcl
23660 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
23670 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
23680 65 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65 28  e3TestErrorName(
23690 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  rc), TCL_STATIC)
236a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
236b0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
236c0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
236d0 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
236e0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f 63  file_control_loc
236f0 6b 70 72 6f 78 79 5f 74 65 73 74 20 44 42 20 50  kproxy_test DB P
23700 57 44 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43  WD.**.** This TC
23710 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74  L command runs t
23720 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  he sqlite3_file_
23730 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63  control interfac
23740 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65  e and.** verifie
23750 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74  s correct operat
23760 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 49 54  ion of the SQLIT
23770 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_GET_LOCKPROXYF
23780 49 4c 45 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54  ILE and.** SQLIT
23790 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_SET_LOCKPROXYF
237a0 49 4c 45 20 76 65 72 62 73 2e 0a 2a 2f 0a 73 74  ILE verbs..*/.st
237b0 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f  atic int file_co
237c0 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f  ntrol_lockproxy_
237d0 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  test(.  ClientDa
237e0 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
237f0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
23800 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
23810 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
23820 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
23830 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
23840 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
23850 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
23860 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
23870 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
23880 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
23890 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
238a0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
238b0 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
238c0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
238d0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
238e0 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20   .  if( objc!=3 
238f0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
23900 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
23910 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
23920 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
23930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23940 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
23950 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
23960 20 30 29 2c 20 22 20 44 42 20 50 57 44 22 2c 20   0), " DB PWD", 
23970 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
23980 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
23990 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
239a0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
239b0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
239c0 20 26 64 62 29 20 29 7b 0a 20 20 20 72 65 74 75   &db) ){.   retu
239d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
239e0 7d 0a 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65  }.  .#if !define
239f0 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
23a00 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23  LOCKING_STYLE).#
23a10 20 20 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41    if defined(__A
23a20 50 50 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66  PPLE__).#    def
23a30 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
23a40 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
23a50 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
23a60 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41  efine SQLITE_ENA
23a70 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
23a80 45 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e  E 0.#  endif.#en
23a90 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
23aa0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
23ab0 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
23ac0 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 7b 0a 20 20  _APPLE__).  {.  
23ad0 20 20 63 68 61 72 20 2a 74 65 73 74 50 61 74 68    char *testPath
23ae0 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  ;.    int rc;.  
23af0 20 20 69 6e 74 20 6e 50 77 64 3b 0a 20 20 20 20    int nPwd;.    
23b00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 77 64  const char *zPwd
23b10 3b 0a 20 20 20 20 63 68 61 72 20 70 72 6f 78 79  ;.    char proxy
23b20 50 61 74 68 5b 34 30 30 5d 3b 0a 20 20 20 20 0a  Path[400];.    .
23b30 20 20 20 20 7a 50 77 64 20 3d 20 54 63 6c 5f 47      zPwd = Tcl_G
23b40 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
23b50 6f 62 6a 76 5b 32 5d 2c 20 26 6e 50 77 64 29 3b  objv[2], &nPwd);
23b60 0a 20 20 20 20 69 66 28 20 73 69 7a 65 6f 66 28  .    if( sizeof(
23b70 70 72 6f 78 79 50 61 74 68 29 3c 6e 50 77 64 2b  proxyPath)<nPwd+
23b80 32 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  20 ){.      Tcl_
23b90 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
23ba0 65 72 70 2c 20 22 50 57 44 20 74 6f 6f 20 62 69  erp, "PWD too bi
23bb0 67 22 2c 20 28 76 6f 69 64 2a 29 30 29 3b 0a 20  g", (void*)0);. 
23bc0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
23bd0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
23be0 20 73 70 72 69 6e 74 66 28 70 72 6f 78 79 50 61   sprintf(proxyPa
23bf0 74 68 2c 20 22 25 73 2f 74 65 73 74 2e 70 72 6f  th, "%s/test.pro
23c00 78 79 22 2c 20 7a 50 77 64 29 3b 0a 20 20 20 20  xy", zPwd);.    
23c10 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
23c20 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55  e_control(db, NU
23c30 4c 4c 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  LL, SQLITE_SET_L
23c40 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 70 72  OCKPROXYFILE, pr
23c50 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 69 66  oxyPath);.    if
23c60 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63  ( rc ){.      Tc
23c70 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
23c80 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
23c90 74 4f 62 6a 28 72 63 29 29 3b 20 0a 20 20 20 20  tObj(rc)); .    
23ca0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
23cb0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  OR;.    }.    rc
23cc0 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
23cd0 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c  control(db, NULL
23ce0 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43  , SQLITE_GET_LOC
23cf0 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26 74 65 73  KPROXYFILE, &tes
23d00 74 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20  tPath);.    if( 
23d10 73 74 72 6e 63 6d 70 28 70 72 6f 78 79 50 61 74  strncmp(proxyPat
23d20 68 2c 74 65 73 74 50 61 74 68 2c 31 31 29 20 29  h,testPath,11) )
23d30 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
23d40 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
23d50 20 22 4c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c   "Lock proxy fil
23d60 65 20 64 69 64 20 6e 6f 74 20 6d 61 74 63 68 20  e did not match 
23d70 74 68 65 20 22 0a 20 20 20 20 20 20 20 20 20 20  the ".          
23d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d90 20 20 20 20 20 22 70 72 65 76 69 6f 75 73 6c 79       "previously
23da0 20 61 73 73 69 67 6e 65 64 20 76 61 6c 75 65 22   assigned value"
23db0 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
23dc0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
23dd0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29    }.    if( rc )
23de0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f  {.      Tcl_SetO
23df0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
23e00 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72   Tcl_NewIntObj(r
23e10 63 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  c));.      retur
23e20 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
23e30 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
23e40 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
23e50 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54  (db, NULL, SQLIT
23e60 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_SET_LOCKPROXYF
23e70 49 4c 45 2c 20 70 72 6f 78 79 50 61 74 68 29 3b  ILE, proxyPath);
23e80 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
23e90 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
23ea0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
23eb0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29  l_NewIntObj(rc))
23ec0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
23ed0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
23ee0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
23ef0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a  urn TCL_OK;  .}.
23f00 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
23f10 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69   file_control_wi
23f20 6e 33 32 5f 61 76 5f 72 65 74 72 79 20 44 42 20  n32_av_retry DB 
23f30 20 4e 52 45 54 52 59 20 20 44 45 4c 41 59 0a 2a   NRETRY  DELAY.*
23f40 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f  *.** This TCL co
23f50 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73  mmand runs the s
23f60 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
23f70 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 77 69  rol interface wi
23f80 74 68 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  th.** the SQLITE
23f90 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 41 56 5f  _FCNTL_WIN32_AV_
23fa0 52 45 54 52 59 20 6f 70 63 6f 64 65 2e 0a 2a 2f  RETRY opcode..*/
23fb0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65  .static int file
23fc0 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 61  _control_win32_a
23fd0 76 5f 72 65 74 72 79 28 0a 20 20 43 6c 69 65 6e  v_retry(.  Clien
23fe0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
23ff0 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
24000 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
24010 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
24020 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
24030 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
24040 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
24050 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
24060 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
24070 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
24080 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
24090 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
240a0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
240b0 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
240c0 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
240d0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
240e0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
240f0 74 20 61 5b 32 5d 3b 0a 20 20 63 68 61 72 20 7a  t a[2];.  char z
24100 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62  [100];..  if( ob
24110 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
24120 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
24130 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
24140 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
24150 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
24160 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
24170 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
24180 44 42 20 4e 52 45 54 52 59 20 44 45 4c 41 59 22  DB NRETRY DELAY"
24190 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
241a0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
241b0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
241c0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
241d0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
241e0 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72  ), &db) ){.    r
241f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
24200 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
24210 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
24220 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 61  erp, objv[2], &a
24230 5b 30 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43  [0]) ) return TC
24240 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
24250 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
24260 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
24270 2c 20 26 61 5b 31 5d 29 20 29 20 72 65 74 75 72  , &a[1]) ) retur
24280 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
24290 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
242a0 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c  _control(db, NUL
242b0 4c 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  L, SQLITE_FCNTL_
242c0 57 49 4e 33 32 5f 41 56 5f 52 45 54 52 59 2c 20  WIN32_AV_RETRY, 
242d0 28 76 6f 69 64 2a 29 61 29 3b 0a 20 20 73 71 6c  (void*)a);.  sql
242e0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
242f0 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 64 20  zeof(z), z, "%d 
24300 25 64 20 25 64 22 2c 20 72 63 2c 20 61 5b 30 5d  %d %d", rc, a[0]
24310 2c 20 61 5b 31 5d 29 3b 0a 20 20 54 63 6c 5f 41  , a[1]);.  Tcl_A
24320 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
24330 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30 29  rp, z, (char*)0)
24340 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
24350 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63  K;  .}../*.** tc
24360 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e  lcmd:   file_con
24370 74 72 6f 6c 5f 70 65 72 73 69 73 74 5f 77 61 6c  trol_persist_wal
24380 20 44 42 20 50 45 52 53 49 53 54 2d 46 4c 41 47   DB PERSIST-FLAG
24390 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20  .**.** This TCL 
243a0 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65  command runs the
243b0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
243c0 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20  ntrol interface 
243d0 77 69 74 68 0a 2a 2a 20 74 68 65 20 53 51 4c 49  with.** the SQLI
243e0 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54  TE_FCNTL_PERSIST
243f0 5f 57 41 4c 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a  _WAL opcode..*/.
24400 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f  static int file_
24410 63 6f 6e 74 72 6f 6c 5f 70 65 72 73 69 73 74 5f  control_persist_
24420 77 61 6c 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  wal(.  ClientDat
24430 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
24440 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
24450 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
24460 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
24470 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
24480 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
24490 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
244a0 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
244b0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
244c0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
244d0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
244e0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
244f0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
24500 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
24510 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
24520 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
24530 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 50  int rc;.  int bP
24540 65 72 73 69 73 74 3b 0a 20 20 63 68 61 72 20 7a  ersist;.  char z
24550 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62  [100];..  if( ob
24560 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
24570 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
24580 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
24590 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
245a0 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
245b0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
245c0 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
245d0 44 42 20 46 4c 41 47 22 2c 20 30 29 3b 0a 20 20  DB FLAG", 0);.  
245e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
245f0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
24600 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
24610 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
24620 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
24630 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
24640 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
24650 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
24660 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
24670 76 5b 32 5d 2c 20 26 62 50 65 72 73 69 73 74 29  v[2], &bPersist)
24680 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
24690 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
246a0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
246b0 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54  (db, NULL, SQLIT
246c0 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f  E_FCNTL_PERSIST_
246d0 57 41 4c 2c 20 28 76 6f 69 64 2a 29 26 62 50 65  WAL, (void*)&bPe
246e0 72 73 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  rsist);.  sqlite
246f0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
24700 66 28 7a 29 2c 20 7a 2c 20 22 25 64 20 25 64 22  f(z), z, "%d %d"
24710 2c 20 72 63 2c 20 62 50 65 72 73 69 73 74 29 3b  , rc, bPersist);
24720 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
24730 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 28  ult(interp, z, (
24740 63 68 61 72 2a 29 30 29 3b 0a 20 20 72 65 74 75  char*)0);.  retu
24750 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a  rn TCL_OK;  .}..
24760 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
24770 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 6f 77  file_control_pow
24780 65 72 73 61 66 65 5f 6f 76 65 72 77 72 69 74 65  ersafe_overwrite
24790 20 44 42 20 50 53 4f 57 2d 46 4c 41 47 0a 2a 2a   DB PSOW-FLAG.**
247a0 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d  .** This TCL com
247b0 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71  mand runs the sq
247c0 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
247d0 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 77 69 74  ol interface wit
247e0 68 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f  h.** the SQLITE_
247f0 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f  FCNTL_POWERSAFE_
24800 4f 56 45 52 57 52 49 54 45 20 6f 70 63 6f 64 65  OVERWRITE opcode
24810 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24820 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 6f 77  file_control_pow
24830 65 72 73 61 66 65 5f 6f 76 65 72 77 72 69 74 65  ersafe_overwrite
24840 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
24850 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
24860 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
24870 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
24880 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
24890 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
248a0 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
248b0 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
248c0 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
248d0 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
248e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
248f0 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
24900 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
24910 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
24920 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
24930 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
24940 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
24950 20 72 63 3b 0a 20 20 69 6e 74 20 62 3b 0a 20 20   rc;.  int b;.  
24960 63 68 61 72 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20  char z[100];..  
24970 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
24980 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
24990 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
249a0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
249b0 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
249c0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
249d0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
249e0 30 29 2c 20 22 20 44 42 20 46 4c 41 47 22 2c 20  0), " DB FLAG", 
249f0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
24a00 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
24a10 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
24a20 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
24a30 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
24a40 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74   &db) ){.    ret
24a50 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
24a60 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
24a70 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
24a80 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 62 29 20  p, objv[2], &b) 
24a90 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
24aa0 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
24ab0 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
24ac0 64 62 2c 4e 55 4c 4c 2c 53 51 4c 49 54 45 5f 46  db,NULL,SQLITE_F
24ad0 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f  CNTL_POWERSAFE_O
24ae0 56 45 52 57 52 49 54 45 2c 28 76 6f 69 64 2a 29  VERWRITE,(void*)
24af0 26 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  &b);.  sqlite3_s
24b00 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
24b10 29 2c 20 7a 2c 20 22 25 64 20 25 64 22 2c 20 72  ), z, "%d %d", r
24b20 63 2c 20 62 29 3b 0a 20 20 54 63 6c 5f 41 70 70  c, b);.  Tcl_App
24b30 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
24b40 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  , z, (char*)0);.
24b50 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
24b60 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c    .}.../*.** tcl
24b70 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74  cmd:   file_cont
24b80 72 6f 6c 5f 76 66 73 6e 61 6d 65 20 44 42 20 3f  rol_vfsname DB ?
24b90 41 55 58 44 42 3f 0a 2a 2a 0a 2a 2a 20 52 65 74  AUXDB?.**.** Ret
24ba0 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61  urn a string tha
24bb0 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
24bc0 73 74 61 63 6b 20 6f 66 20 56 46 53 65 73 2e 0a  stack of VFSes..
24bd0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
24be0 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61  le_control_vfsna
24bf0 6d 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  me(.  ClientData
24c00 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
24c10 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
24c20 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
24c30 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
24c40 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
24c50 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
24c60 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
24c70 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
24c80 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
24c90 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
24ca0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
24cb0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
24cc0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
24cd0 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
24ce0 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
24cf0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
24d00 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
24d10 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 63  me = "main";.  c
24d20 68 61 72 20 2a 7a 56 66 73 4e 61 6d 65 20 3d 20  har *zVfsName = 
24d30 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  0;..  if( objc!=
24d40 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a  2 && objc!=3 ){.
24d50 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
24d60 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
24d70 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
24d80 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
24d90 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
24da0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
24db0 20 30 29 2c 20 22 20 44 42 20 3f 41 55 58 44 42   0), " DB ?AUXDB
24dc0 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  ?", 0);.    retu
24dd0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
24de0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
24df0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
24e00 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
24e10 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20  1]), &db) ){.   
24e20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
24e30 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a  R;.  }.  if( obj
24e40 63 3d 3d 33 20 29 7b 0a 20 20 20 20 7a 44 62 4e  c==3 ){.    zDbN
24e50 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
24e60 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
24e70 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  }.  sqlite3_file
24e80 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62  _control(db, zDb
24e90 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e  Name, SQLITE_FCN
24ea0 54 4c 5f 56 46 53 4e 41 4d 45 2c 28 76 6f 69 64  TL_VFSNAME,(void
24eb0 2a 29 26 7a 56 66 73 4e 61 6d 65 29 3b 0a 20 20  *)&zVfsName);.  
24ec0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
24ed0 28 69 6e 74 65 72 70 2c 20 7a 56 66 73 4e 61 6d  (interp, zVfsNam
24ee0 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  e, (char*)0);.  
24ef0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 56 66  sqlite3_free(zVf
24f00 73 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  sName);.  return
24f10 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 0a 2f   TCL_OK;  .}.../
24f20 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 73  *.** tclcmd:   s
24f30 71 6c 69 74 65 33 5f 76 66 73 5f 6c 69 73 74 0a  qlite3_vfs_list.
24f40 2a 2a 0a 2a 2a 20 20 20 52 65 74 75 72 6e 20 61  **.**   Return a
24f50 20 74 63 6c 20 6c 69 73 74 20 63 6f 6e 74 61 69   tcl list contai
24f60 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f  ning the names o
24f70 66 20 61 6c 6c 20 72 65 67 69 73 74 65 72 65 64  f all registered
24f80 20 76 66 73 27 73 2e 0a 2a 2f 0a 73 74 61 74 69   vfs's..*/.stati
24f90 63 20 69 6e 74 20 76 66 73 5f 6c 69 73 74 28 0a  c int vfs_list(.
24fa0 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
24fb0 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
24fc0 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
24fd0 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
24fe0 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
24ff0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
25000 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
25010 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
25020 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
25030 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
25040 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
25050 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
25060 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
25070 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
25080 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
25090 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
250a0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20  te3_vfs *pVfs;. 
250b0 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 20 3d   Tcl_Obj *pRet =
250c0 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20   Tcl_NewObj();. 
250d0 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a   if( objc!=1 ){.
250e0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
250f0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
25100 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 72  objv, "");.    r
25110 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
25120 0a 20 20 7d 0a 20 20 66 6f 72 28 70 56 66 73 3d  .  }.  for(pVfs=
25130 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
25140 28 30 29 3b 20 70 56 66 73 3b 20 70 56 66 73 3d  (0); pVfs; pVfs=
25150 70 56 66 73 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pVfs->pNext){.  
25160 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
25170 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
25180 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
25190 53 74 72 69 6e 67 4f 62 6a 28 70 56 66 73 2d 3e  StringObj(pVfs->
251a0 7a 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 7d  zName, -1));.  }
251b0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
251c0 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ult(interp, pRet
251d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
251e0 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  OK;  .}../*.** t
251f0 63 6c 63 6d 64 3a 20 20 20 73 71 6c 69 74 65 33  clcmd:   sqlite3
25200 5f 6c 69 6d 69 74 20 44 42 20 49 44 20 56 41 4c  _limit DB ID VAL
25210 55 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43  UE.**.** This TC
25220 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74  L command runs t
25230 68 65 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74  he sqlite3_limit
25240 20 69 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a   interface and.*
25250 2a 20 76 65 72 69 66 69 65 73 20 63 6f 72 72 65  * verifies corre
25260 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  ct operation of 
25270 74 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61  the same..*/.sta
25280 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 69 6d  tic int test_lim
25290 69 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  it(.  ClientData
252a0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
252b0 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
252c0 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
252d0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
252e0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
252f0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
25300 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
25310 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
25320 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
25330 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
25340 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
25350 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
25360 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
25370 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
25380 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
25390 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
253a0 6e 74 20 72 63 3b 0a 20 20 73 74 61 74 69 63 20  nt rc;.  static 
253b0 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
253c0 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
253d0 0a 20 20 20 20 20 69 6e 74 20 69 64 3b 0a 20 20  .     int id;.  
253e0 7d 20 61 49 64 5b 5d 20 3d 20 7b 0a 20 20 20 20  } aId[] = {.    
253f0 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  { "SQLITE_LIMIT_
25400 4c 45 4e 47 54 48 22 2c 20 20 20 20 20 20 20 20  LENGTH",        
25410 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
25420 49 54 5f 4c 45 4e 47 54 48 20 20 20 20 20 20 20  IT_LENGTH       
25430 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
25440 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53   "SQLITE_LIMIT_S
25450 51 4c 5f 4c 45 4e 47 54 48 22 2c 20 20 20 20 20  QL_LENGTH",     
25460 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
25470 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 20 20 20  T_SQL_LENGTH    
25480 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
25490 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  "SQLITE_LIMIT_CO
254a0 4c 55 4d 4e 22 2c 20 20 20 20 20 20 20 20 20 20  LUMN",          
254b0 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
254c0 5f 43 4f 4c 55 4d 4e 20 20 20 20 20 20 20 20 20  _COLUMN         
254d0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
254e0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50  SQLITE_LIMIT_EXP
254f0 52 5f 44 45 50 54 48 22 2c 20 20 20 20 20 20 20  R_DEPTH",       
25500 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
25510 45 58 50 52 5f 44 45 50 54 48 20 20 20 20 20 20  EXPR_DEPTH      
25520 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53       },.    { "S
25530 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50  QLITE_LIMIT_COMP
25540 4f 55 4e 44 5f 53 45 4c 45 43 54 22 2c 20 20 20  OUND_SELECT",   
25550 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43    SQLITE_LIMIT_C
25560 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 20  OMPOUND_SELECT  
25570 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
25580 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f  LITE_LIMIT_VDBE_
25590 4f 50 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  OP",            
255a0 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44   SQLITE_LIMIT_VD
255b0 42 45 5f 4f 50 20 20 20 20 20 20 20 20 20 20 20  BE_OP           
255c0 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c     },.    { "SQL
255d0 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49  ITE_LIMIT_FUNCTI
255e0 4f 4e 5f 41 52 47 22 2c 20 20 20 20 20 20 20 20  ON_ARG",        
255f0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e  SQLITE_LIMIT_FUN
25600 43 54 49 4f 4e 5f 41 52 47 20 20 20 20 20 20 20  CTION_ARG       
25610 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
25620 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45  TE_LIMIT_ATTACHE
25630 44 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 53  D",            S
25640 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41  QLITE_LIMIT_ATTA
25650 43 48 45 44 20 20 20 20 20 20 20 20 20 20 20 20  CHED            
25660 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
25670 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54  E_LIMIT_LIKE_PAT
25680 54 45 52 4e 5f 4c 45 4e 47 54 48 22 2c 20 53 51  TERN_LENGTH", SQ
25690 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f  LITE_LIMIT_LIKE_
256a0 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 20  PATTERN_LENGTH  
256b0 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  },.    { "SQLITE
256c0 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
256d0 4e 55 4d 42 45 52 22 2c 20 20 20 20 20 53 51 4c  NUMBER",     SQL
256e0 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
256f0 4c 45 5f 4e 55 4d 42 45 52 20 20 20 20 20 20 7d  LE_NUMBER      }
25700 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f  ,.    { "SQLITE_
25710 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45  LIMIT_TRIGGER_DE
25720 50 54 48 22 2c 20 20 20 20 20 20 20 53 51 4c 49  PTH",       SQLI
25730 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52  TE_LIMIT_TRIGGER
25740 5f 44 45 50 54 48 20 20 20 20 20 20 20 20 7d 2c  _DEPTH        },
25750 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 4f 75 74  .    .    /* Out
25760 20 6f 66 20 72 61 6e 67 65 20 74 65 73 74 20 63   of range test c
25770 61 73 65 73 20 2a 2f 0a 20 20 20 20 7b 20 22 53  ases */.    { "S
25780 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 4f 4f 53  QLITE_LIMIT_TOOS
25790 4d 41 4c 4c 22 2c 20 20 20 20 20 20 20 20 20 20  MALL",          
257a0 20 20 2d 31 2c 20 20 20 20 20 20 20 20 20 20 20    -1,           
257b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257c0 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
257d0 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 4f 4f 42 49  LITE_LIMIT_TOOBI
257e0 47 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  G",             
257f0 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52   SQLITE_LIMIT_TR
25800 49 47 47 45 52 5f 44 45 50 54 48 2b 31 20 20 20  IGGER_DEPTH+1   
25810 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74     },.  };.  int
25820 20 69 2c 20 69 64 3b 0a 20 20 69 6e 74 20 76 61   i, id;.  int va
25830 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  l;.  const char 
25840 2a 7a 49 64 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  *zId;..  if( obj
25850 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
25860 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
25870 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
25880 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
25890 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
258a0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
258b0 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44  objv[0], 0), " D
258c0 42 20 49 44 20 56 41 4c 55 45 22 2c 20 30 29 3b  B ID VALUE", 0);
258d0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
258e0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
258f0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
25900 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
25910 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
25920 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
25930 45 52 52 4f 52 3b 0a 20 20 7a 49 64 20 3d 20 54  ERROR;.  zId = T
25940 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
25950 76 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30  v[2]);.  for(i=0
25960 3b 20 69 3c 73 69 7a 65 6f 66 28 61 49 64 29 2f  ; i<sizeof(aId)/
25970 73 69 7a 65 6f 66 28 61 49 64 5b 30 5d 29 3b 20  sizeof(aId[0]); 
25980 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74  i++){.    if( st
25990 72 63 6d 70 28 7a 49 64 2c 20 61 49 64 5b 69 5d  rcmp(zId, aId[i]
259a0 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
259b0 20 20 20 20 69 64 20 3d 20 61 49 64 5b 69 5d 2e      id = aId[i].
259c0 69 64 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  id;.      break;
259d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
259e0 20 69 3e 3d 73 69 7a 65 6f 66 28 61 49 64 29 2f   i>=sizeof(aId)/
259f0 73 69 7a 65 6f 66 28 61 49 64 5b 30 5d 29 20 29  sizeof(aId[0]) )
25a00 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
25a10 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
25a20 75 6e 6b 6e 6f 77 6e 20 6c 69 6d 69 74 20 74 79  unknown limit ty
25a30 70 65 3a 20 22 2c 20 7a 49 64 2c 20 28 63 68 61  pe: ", zId, (cha
25a40 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
25a50 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
25a60 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
25a70 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
25a80 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20   objv[3], &val) 
25a90 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
25aa0 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
25ab0 65 33 5f 6c 69 6d 69 74 28 64 62 2c 20 69 64 2c  e3_limit(db, id,
25ac0 20 76 61 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74   val);.  Tcl_Set
25ad0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
25ae0 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
25af0 72 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  rc));.  return T
25b00 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a  CL_OK;  .}../*.*
25b10 2a 20 74 63 6c 63 6d 64 3a 20 20 73 61 76 65 5f  * tclcmd:  save_
25b20 70 72 6e 67 5f 73 74 61 74 65 0a 2a 2a 0a 2a 2a  prng_state.**.**
25b30 20 53 61 76 65 20 74 68 65 20 73 74 61 74 65 20   Save the state 
25b40 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d 72 61  of the pseudo-ra
25b50 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65  ndom number gene
25b60 72 61 74 6f 72 2e 0a 2a 2a 20 41 74 20 74 68 65  rator..** At the
25b70 20 73 61 6d 65 20 74 69 6d 65 2c 20 76 65 72 69   same time, veri
25b80 66 79 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f  fy that sqlite3_
25b90 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 20 77 6f 72  test_control wor
25ba0 6b 73 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20  ks even when.** 
25bb0 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6e 20 6f  called with an o
25bc0 75 74 2d 6f 66 2d 72 61 6e 67 65 20 6f 70 63 6f  ut-of-range opco
25bd0 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
25be0 74 20 73 61 76 65 5f 70 72 6e 67 5f 73 74 61 74  t save_prng_stat
25bf0 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  e(.  ClientData 
25c00 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
25c10 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
25c20 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
25c30 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
25c40 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
25c50 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
25c60 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
25c70 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
25c80 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
25c90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
25ca0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
25cb0 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
25cc0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
25cd0 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
25ce0 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
25cf0 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
25d00 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 39 39 39  test_control(999
25d10 39 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  9);.  assert( rc
25d20 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ==0 );.  rc = sq
25d30 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
25d40 6f 6c 28 2d 31 29 3b 0a 20 20 61 73 73 65 72 74  ol(-1);.  assert
25d50 28 20 72 63 3d 3d 30 20 29 3b 0a 20 20 73 71 6c  ( rc==0 );.  sql
25d60 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
25d70 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
25d80 4c 5f 50 52 4e 47 5f 53 41 56 45 29 3b 0a 20 20  L_PRNG_SAVE);.  
25d90 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
25da0 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
25db0 72 65 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61  restore_prng_sta
25dc0 74 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  te.*/.static int
25dd0 20 72 65 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74   restore_prng_st
25de0 61 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  ate(.  ClientDat
25df0 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
25e00 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
25e10 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
25e20 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
25e30 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
25e40 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
25e50 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
25e60 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
25e70 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
25e80 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
25e90 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
25ea0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
25eb0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
25ec0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
25ed0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
25ee0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
25ef0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
25f00 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f  TCTRL_PRNG_RESTO
25f10 52 45 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  RE);.  return TC
25f20 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63  L_OK;.}./*.** tc
25f30 6c 63 6d 64 3a 20 20 72 65 73 65 74 5f 70 72 6e  lcmd:  reset_prn
25f40 67 5f 73 74 61 74 65 0a 2a 2f 0a 73 74 61 74 69  g_state.*/.stati
25f50 63 20 69 6e 74 20 72 65 73 65 74 5f 70 72 6e 67  c int reset_prng
25f60 5f 73 74 61 74 65 28 0a 20 20 43 6c 69 65 6e 74  _state(.  Client
25f70 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
25f80 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
25f90 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
25fa0 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
25fb0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
25fc0 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
25fd0 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
25fe0 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
25ff0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
26000 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
26010 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
26020 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
26030 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
26040 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
26050 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
26060 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  {.  sqlite3_test
26070 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
26080 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45  TESTCTRL_PRNG_RE
26090 53 45 54 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  SET);.  return T
260a0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
260b0 74 63 6c 63 6d 64 3a 20 20 70 63 61 63 68 65 5f  tclcmd:  pcache_
260c0 73 74 61 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20  stats.*/.static 
260d0 69 6e 74 20 74 65 73 74 5f 70 63 61 63 68 65 5f  int test_pcache_
260e0 73 74 61 74 73 28 0a 20 20 43 6c 69 65 6e 74 44  stats(.  ClientD
260f0 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
26100 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
26110 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
26120 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
26130 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
26140 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
26150 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
26160 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
26170 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
26180 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
26190 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
261a0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
261b0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
261c0 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
261d0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
261e0 0a 20 20 69 6e 74 20 6e 4d 69 6e 3b 0a 20 20 69  .  int nMin;.  i
261f0 6e 74 20 6e 4d 61 78 3b 0a 20 20 69 6e 74 20 6e  nt nMax;.  int n
26200 43 75 72 72 65 6e 74 3b 0a 20 20 69 6e 74 20 6e  Current;.  int n
26210 52 65 63 79 63 6c 61 62 6c 65 3b 0a 20 20 54 63  Recyclable;.  Tc
26220 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a 20 20  l_Obj *pRet;..  
26230 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 74 61  sqlite3PcacheSta
26240 74 73 28 26 6e 43 75 72 72 65 6e 74 2c 20 26 6e  ts(&nCurrent, &n
26250 4d 61 78 2c 20 26 6e 4d 69 6e 2c 20 26 6e 52 65  Max, &nMin, &nRe
26260 63 79 63 6c 61 62 6c 65 29 3b 0a 0a 20 20 70 52  cyclable);..  pR
26270 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  et = Tcl_NewObj(
26280 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
26290 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
262a0 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f  terp, pRet, Tcl_
262b0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 75  NewStringObj("cu
262c0 72 72 65 6e 74 22 2c 20 2d 31 29 29 3b 0a 20 20  rrent", -1));.  
262d0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
262e0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
262f0 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e   pRet, Tcl_NewIn
26300 74 4f 62 6a 28 6e 43 75 72 72 65 6e 74 29 29 3b  tObj(nCurrent));
26310 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
26320 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
26330 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  rp, pRet, Tcl_Ne
26340 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 61 78 22  wStringObj("max"
26350 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
26360 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
26370 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c  nt(interp, pRet,
26380 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e   Tcl_NewIntObj(n
26390 4d 61 78 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  Max));.  Tcl_Lis
263a0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
263b0 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
263c0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
263d0 28 22 6d 69 6e 22 2c 20 2d 31 29 29 3b 0a 20 20  ("min", -1));.  
263e0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
263f0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
26400 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e   pRet, Tcl_NewIn
26410 74 4f 62 6a 28 6e 4d 69 6e 29 29 3b 0a 20 20 54  tObj(nMin));.  T
26420 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
26430 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
26440 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pRet, Tcl_NewStr
26450 69 6e 67 4f 62 6a 28 22 72 65 63 79 63 6c 61 62  ingObj("recyclab
26460 6c 65 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  le", -1));.  Tcl
26470 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
26480 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
26490 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  et, Tcl_NewIntOb
264a0 6a 28 6e 52 65 63 79 63 6c 61 62 6c 65 29 29 3b  j(nRecyclable));
264b0 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ..  Tcl_SetObjRe
264c0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65  sult(interp, pRe
264d0 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43  t);..  return TC
264e0 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  L_OK;.}..#ifdef 
264f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e  SQLITE_ENABLE_UN
26500 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73 74 61 74  LOCK_NOTIFY.stat
26510 69 63 20 76 6f 69 64 20 74 65 73 74 5f 75 6e 6c  ic void test_unl
26520 6f 63 6b 5f 6e 6f 74 69 66 79 5f 63 62 28 76 6f  ock_notify_cb(vo
26530 69 64 20 2a 2a 61 41 72 67 2c 20 69 6e 74 20 6e  id **aArg, int n
26540 41 72 67 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a  Arg){.  int ii;.
26550 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
26560 41 72 67 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  Arg; ii++){.    
26570 54 63 6c 5f 45 76 61 6c 45 78 28 28 54 63 6c 5f  Tcl_EvalEx((Tcl_
26580 49 6e 74 65 72 70 20 2a 29 61 41 72 67 5b 69 69  Interp *)aArg[ii
26590 5d 2c 20 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66  ], "unlock_notif
265a0 79 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c  y", -1, TCL_EVAL
265b0 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 7d 0a 7d 0a  _GLOBAL);.  }.}.
265c0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
265d0 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e  _ENABLE_UNLOCK_N
265e0 4f 54 49 46 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  OTIFY */../*.** 
265f0 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65 33  tclcmd:  sqlite3
26600 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 20 64  _unlock_notify d
26610 62 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  b.*/.#ifdef SQLI
26620 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b  TE_ENABLE_UNLOCK
26630 5f 4e 4f 54 49 46 59 0a 73 74 61 74 69 63 20 69  _NOTIFY.static i
26640 6e 74 20 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e  nt test_unlock_n
26650 6f 74 69 66 79 28 0a 20 20 43 6c 69 65 6e 74 44  otify(.  ClientD
26660 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
26670 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54  /* Unused */.  T
26680 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
26690 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
266a0 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
266b0 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
266c0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
266d0 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
266e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
266f0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
26700 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
26710 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
26720 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
26730 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
26740 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
26750 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
26760 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
26770 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
26780 2c 20 22 44 42 22 29 3b 0a 20 20 20 20 72 65 74  , "DB");.    ret
26790 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
267a0 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 44 62 50   }..  if( getDbP
267b0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
267c0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
267d0 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20  v[1]), &db) ){. 
267e0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
267f0 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ROR;.  }.  rc = 
26800 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e  sqlite3_unlock_n
26810 6f 74 69 66 79 28 64 62 2c 20 74 65 73 74 5f 75  otify(db, test_u
26820 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f 63 62 2c  nlock_notify_cb,
26830 20 28 76 6f 69 64 20 2a 29 69 6e 74 65 72 70 29   (void *)interp)
26840 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ;.  Tcl_SetResul
26850 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
26860 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
26870 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
26880 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
26890 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
268a0 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65   tclcmd:  sqlite
268b0 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
268c0 20 64 62 20 3f 4e 41 4d 45 3f 0a 2a 2f 0a 73 74   db ?NAME?.*/.st
268d0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 77 61  atic int test_wa
268e0 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 0a 20 20  l_checkpoint(.  
268f0 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
26900 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64  tData, /* Unused
26910 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
26920 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
26930 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
26940 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
26950 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
26960 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
26970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
26980 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
26990 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
269a0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
269b0 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
269c0 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  s */.){.  char *
269d0 7a 44 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  zDb = 0;.  sqlit
269e0 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
269f0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
26a00 20 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20   && objc!=2 ){. 
26a10 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
26a20 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
26a30 62 6a 76 2c 20 22 44 42 20 3f 4e 41 4d 45 3f 22  bjv, "DB ?NAME?"
26a40 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
26a50 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
26a60 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
26a70 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
26a80 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
26a90 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74   &db) ){.    ret
26aa0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
26ab0 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33   }.  if( objc==3
26ac0 20 29 7b 0a 20 20 20 20 7a 44 62 20 3d 20 54 63   ){.    zDb = Tc
26ad0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
26ae0 5b 32 5d 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  [2]);.  }.  rc =
26af0 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
26b00 63 6b 70 6f 69 6e 74 28 64 62 2c 20 7a 44 62 29  ckpoint(db, zDb)
26b10 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ;.  Tcl_SetResul
26b20 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
26b30 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
26b40 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
26b50 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
26b60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
26b70 3a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  :  sqlite3_wal_c
26b80 68 65 63 6b 70 6f 69 6e 74 5f 76 32 20 64 62 20  heckpoint_v2 db 
26b90 4d 4f 44 45 20 3f 4e 41 4d 45 3f 0a 2a 2a 0a 2a  MODE ?NAME?.**.*
26ba0 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63  * This command c
26bb0 61 6c 6c 73 20 74 68 65 20 77 61 6c 5f 63 68 65  alls the wal_che
26bc0 63 6b 70 6f 69 6e 74 5f 76 32 28 29 20 66 75 6e  ckpoint_v2() fun
26bd0 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 73  ction with the s
26be0 70 65 63 69 66 69 65 64 0a 2a 2a 20 6d 6f 64 65  pecified.** mode
26bf0 20 61 72 67 75 6d 65 6e 74 20 28 70 61 73 73 69   argument (passi
26c00 76 65 2c 20 66 75 6c 6c 20 6f 72 20 72 65 73 74  ve, full or rest
26c10 61 72 74 29 2e 20 49 66 20 70 72 65 73 65 6e 74  art). If present
26c20 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  , the database n
26c30 61 6d 65 0a 2a 2a 20 4e 41 4d 45 20 69 73 20 70  ame.** NAME is p
26c40 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
26c50 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
26c60 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76  wal_checkpoint_v
26c70 32 28 29 2e 20 49 66 20 69 74 20 74 68 65 0a 2a  2(). If it the.*
26c80 2a 20 4e 41 4d 45 20 61 72 67 75 6d 65 6e 74 20  * NAME argument 
26c90 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20  is not present, 
26ca0 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 69  a NULL pointer i
26cb0 73 20 70 61 73 73 65 64 20 69 6e 73 74 65 61 64  s passed instead
26cc0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 61 6c 5f 63  ..**.** If wal_c
26cd0 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 29 20 72  heckpoint_v2() r
26ce0 65 74 75 72 6e 73 20 61 6e 79 20 76 61 6c 75 65  eturns any value
26cf0 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
26d00 54 45 5f 42 55 53 59 20 6f 72 0a 2a 2a 20 53 51  TE_BUSY or.** SQ
26d10 4c 49 54 45 5f 4f 4b 2c 20 74 68 65 6e 20 74 68  LITE_OK, then th
26d20 69 73 20 63 6f 6d 6d 61 6e 64 20 72 65 74 75 72  is command retur
26d30 6e 73 20 54 43 4c 5f 45 52 52 4f 52 2e 20 54 68  ns TCL_ERROR. Th
26d40 65 20 54 63 6c 20 72 65 73 75 6c 74 20 69 73 20  e Tcl result is 
26d50 73 65 74 0a 2a 2a 20 74 6f 20 74 68 65 20 65 72  set.** to the er
26d60 72 6f 72 20 6d 65 73 73 61 67 65 20 6f 62 74 61  ror message obta
26d70 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
26d80 33 5f 65 72 72 6d 73 67 28 29 2e 0a 2a 2a 0a 2a  3_errmsg()..**.*
26d90 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 69  * Otherwise, thi
26da0 73 20 63 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e  s command return
26db0 73 20 61 20 6c 69 73 74 20 6f 66 20 74 68 72 65  s a list of thre
26dc0 65 20 69 6e 74 65 67 65 72 73 2e 20 54 68 65 20  e integers. The 
26dd0 66 69 72 73 74 20 69 6e 74 65 67 65 72 0a 2a 2a  first integer.**
26de0 20 69 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f   is 1 if SQLITE_
26df0 42 55 53 59 20 77 61 73 20 72 65 74 75 72 6e 65  BUSY was returne
26e00 64 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69 73  d, or 0 otherwis
26e10 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e. The following
26e20 20 74 77 6f 20 69 6e 74 65 67 65 72 73 0a 2a 2a   two integers.**
26e30 20 61 72 65 20 74 68 65 20 76 61 6c 75 65 73 20   are the values 
26e40 72 65 74 75 72 6e 65 64 20 76 69 61 20 74 68 65  returned via the
26e50 20 6f 75 74 70 75 74 20 70 61 72 61 6d 61 74 65   output paramate
26e60 72 73 20 62 79 20 77 61 6c 5f 63 68 65 63 6b 70  rs by wal_checkp
26e70 6f 69 6e 74 5f 76 32 28 29 20 2d 0a 2a 2a 20 74  oint_v2() -.** t
26e80 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61  he number of fra
26e90 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 61  mes in the log a
26ea0 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
26eb0 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c   frames in the l
26ec0 6f 67 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20  og.** that have 
26ed0 62 65 65 6e 20 63 68 65 63 6b 70 6f 69 6e 74 65  been checkpointe
26ee0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
26ef0 20 74 65 73 74 5f 77 61 6c 5f 63 68 65 63 6b 70   test_wal_checkp
26f00 6f 69 6e 74 5f 76 32 28 0a 20 20 43 6c 69 65 6e  oint_v2(.  Clien
26f10 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
26f20 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20  , /* Unused */. 
26f30 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
26f40 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
26f50 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
26f60 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
26f70 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
26f80 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
26f90 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
26fa0 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
26fb0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
26fc0 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
26fd0 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
26fe0 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62 20 3d  ){.  char *zDb =
26ff0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   0;.  sqlite3 *d
27000 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  b;.  int rc;..  
27010 69 6e 74 20 65 4d 6f 64 65 3b 0a 20 20 69 6e 74  int eMode;.  int
27020 20 6e 4c 6f 67 20 3d 20 2d 35 35 35 3b 0a 20 20   nLog = -555;.  
27030 69 6e 74 20 6e 43 6b 70 74 20 3d 20 2d 35 35 35  int nCkpt = -555
27040 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65  ;.  Tcl_Obj *pRe
27050 74 3b 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  t;..  const char
27060 20 2a 20 61 4d 6f 64 65 5b 5d 20 3d 20 7b 20 22   * aMode[] = { "
27070 70 61 73 73 69 76 65 22 2c 20 22 66 75 6c 6c 22  passive", "full"
27080 2c 20 22 72 65 73 74 61 72 74 22 2c 20 30 20 7d  , "restart", 0 }
27090 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
270a0 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
270b0 53 53 49 56 45 3d 3d 30 20 29 3b 0a 20 20 61 73  SSIVE==0 );.  as
270c0 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45  sert( SQLITE_CHE
270d0 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3d 3d 31 20  CKPOINT_FULL==1 
270e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
270f0 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52  ITE_CHECKPOINT_R
27100 45 53 54 41 52 54 3d 3d 32 20 29 3b 0a 0a 20 20  ESTART==2 );..  
27110 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f  if( objc!=3 && o
27120 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
27130 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
27140 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
27150 22 44 42 20 4d 4f 44 45 20 3f 4e 41 4d 45 3f 22  "DB MODE ?NAME?"
27160 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
27170 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
27180 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20  if( objc==4 ){. 
27190 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74     zDb = Tcl_Get
271a0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b  String(objv[3]);
271b0 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
271c0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
271d0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
271e0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 0a 20 20 20  jv[1]), &db).   
271f0 7c 7c 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46  || Tcl_GetIndexF
27200 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
27210 62 6a 76 5b 32 5d 2c 20 61 4d 6f 64 65 2c 20 22  bjv[2], aMode, "
27220 6d 6f 64 65 22 2c 20 30 2c 20 26 65 4d 6f 64 65  mode", 0, &eMode
27230 29 20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  ) .  ){.    retu
27240 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
27250 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  }..  rc = sqlite
27260 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
27270 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 65 4d 6f  _v2(db, zDb, eMo
27280 64 65 2c 20 26 6e 4c 6f 67 2c 20 26 6e 43 6b 70  de, &nLog, &nCkp
27290 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  t);.  if( rc!=SQ
272a0 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
272b0 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
272c0 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
272d0 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
272e0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
272f0 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  b), TCL_VOLATILE
27300 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
27310 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
27320 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62  pRet = Tcl_NewOb
27330 6a 28 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  j();.  Tcl_ListO
27340 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
27350 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63  interp, pRet, Tc
27360 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 3d 3d  l_NewIntObj(rc==
27370 53 51 4c 49 54 45 5f 42 55 53 59 3f 31 3a 30 29  SQLITE_BUSY?1:0)
27380 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
27390 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
273a0 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f  terp, pRet, Tcl_
273b0 4e 65 77 49 6e 74 4f 62 6a 28 6e 4c 6f 67 29 29  NewIntObj(nLog))
273c0 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
273d0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
273e0 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  erp, pRet, Tcl_N
273f0 65 77 49 6e 74 4f 62 6a 28 6e 43 6b 70 74 29 29  ewIntObj(nCkpt))
27400 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
27410 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65  sult(interp, pRe
27420 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43  t);..  return TC
27430 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  L_OK;.}../*.** t
27440 63 6c 63 6d 64 3a 20 20 74 65 73 74 5f 73 71 6c  clcmd:  test_sql
27450 69 74 65 33 5f 6c 6f 67 20 3f 53 43 52 49 50 54  ite3_log ?SCRIPT
27460 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ?.*/.static stru
27470 63 74 20 4c 6f 67 43 61 6c 6c 62 61 63 6b 20 7b  ct LogCallback {
27480 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 70  .  Tcl_Interp *p
27490 49 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62  Interp;.  Tcl_Ob
274a0 6a 20 2a 70 4f 62 6a 3b 0a 7d 20 6c 6f 67 63 61  j *pObj;.} logca
274b0 6c 6c 62 61 63 6b 20 3d 20 7b 30 2c 20 30 7d 3b  llback = {0, 0};
274c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 78 4c 6f  .static void xLo
274d0 67 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a  gcallback(void *
274e0 75 6e 75 73 65 64 2c 20 69 6e 74 20 65 72 72 2c  unused, int err,
274f0 20 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0a 20 20   char *zMsg){.  
27500 54 63 6c 5f 4f 62 6a 20 2a 70 4e 65 77 20 3d 20  Tcl_Obj *pNew = 
27510 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
27520 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62  (logcallback.pOb
27530 6a 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  j);.  Tcl_IncrRe
27540 66 43 6f 75 6e 74 28 70 4e 65 77 29 3b 0a 20 20  fCount(pNew);.  
27550 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
27560 64 45 6c 65 6d 65 6e 74 28 0a 20 20 20 20 20 20  dElement(.      
27570 30 2c 20 70 4e 65 77 2c 20 54 63 6c 5f 4e 65 77  0, pNew, Tcl_New
27580 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65  StringObj(sqlite
27590 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65 28 65  3TestErrorName(e
275a0 72 72 29 2c 20 2d 31 29 0a 20 20 29 3b 0a 20 20  rr), -1).  );.  
275b0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
275c0 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 4e 65 77  dElement(0, pNew
275d0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
275e0 62 6a 28 7a 4d 73 67 2c 20 2d 31 29 29 3b 0a 20  bj(zMsg, -1));. 
275f0 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 6c   Tcl_EvalObjEx(l
27600 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 49 6e 74 65  ogcallback.pInte
27610 72 70 2c 20 70 4e 65 77 2c 20 54 43 4c 5f 45 56  rp, pNew, TCL_EV
27620 41 4c 5f 47 4c 4f 42 41 4c 7c 54 43 4c 5f 45 56  AL_GLOBAL|TCL_EV
27630 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 54 63  AL_DIRECT);.  Tc
27640 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
27650 4e 65 77 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69  New);.}.static i
27660 6e 74 20 74 65 73 74 5f 73 71 6c 69 74 65 33 5f  nt test_sqlite3_
27670 6c 6f 67 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  log(.  ClientDat
27680 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  a clientData,.  
27690 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
276a0 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
276b0 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
276c0 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
276d0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
276e0 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
276f0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
27700 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
27710 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
27720 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
27730 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
27740 7b 0a 20 20 69 66 28 20 6f 62 6a 63 3e 32 20 29  {.  if( objc>2 )
27750 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
27760 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
27770 2c 20 6f 62 6a 76 2c 20 22 53 43 52 49 50 54 22  , objv, "SCRIPT"
27780 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
27790 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
277a0 66 28 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70  f( logcallback.p
277b0 4f 62 6a 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44  Obj ){.    Tcl_D
277c0 65 63 72 52 65 66 43 6f 75 6e 74 28 6c 6f 67 63  ecrRefCount(logc
277d0 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 29 3b 0a 20  allback.pObj);. 
277e0 20 20 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70     logcallback.p
277f0 4f 62 6a 20 3d 20 30 3b 0a 20 20 20 20 6c 6f 67  Obj = 0;.    log
27800 63 61 6c 6c 62 61 63 6b 2e 70 49 6e 74 65 72 70  callback.pInterp
27810 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
27820 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
27830 43 4f 4e 46 49 47 5f 4c 4f 47 2c 20 30 2c 20 30  CONFIG_LOG, 0, 0
27840 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a  );.  }.  if( obj
27850 63 3e 31 20 29 7b 0a 20 20 20 20 6c 6f 67 63 61  c>1 ){.    logca
27860 6c 6c 62 61 63 6b 2e 70 4f 62 6a 20 3d 20 6f 62  llback.pObj = ob
27870 6a 76 5b 31 5d 3b 0a 20 20 20 20 54 63 6c 5f 49  jv[1];.    Tcl_I
27880 6e 63 72 52 65 66 43 6f 75 6e 74 28 6c 6f 67 63  ncrRefCount(logc
27890 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 29 3b 0a 20  allback.pObj);. 
278a0 20 20 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70     logcallback.p
278b0 49 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  Interp = interp;
278c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  .    sqlite3_con
278d0 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49  fig(SQLITE_CONFI
278e0 47 5f 4c 4f 47 2c 20 78 4c 6f 67 63 61 6c 6c 62  G_LOG, xLogcallb
278f0 61 63 6b 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  ack, 0);.  }.  r
27900 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
27910 0a 2f 2a 0a 2a 2a 20 20 20 20 20 74 63 6c 5f 6f  ./*.**     tcl_o
27920 62 6a 70 72 6f 63 20 43 4f 4d 4d 41 4e 44 4e 41  bjproc COMMANDNA
27930 4d 45 20 41 52 47 53 2e 2e 2e 0a 2a 2a 0a 2a 2a  ME ARGS....**.**
27940 20 52 75 6e 20 61 20 54 43 4c 20 63 6f 6d 6d 61   Run a TCL comma
27950 6e 64 20 75 73 69 6e 67 20 69 74 73 20 6f 62 6a  nd using its obj
27960 50 72 6f 63 20 69 6e 74 65 72 66 61 63 65 2e 20  Proc interface. 
27970 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20   Throw an error 
27980 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6d 6d 61 6e  if.** the comman
27990 64 20 68 61 73 20 6e 6f 20 6f 62 6a 50 72 6f 63  d has no objProc
279a0 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73   interface..*/.s
279b0 74 61 74 69 63 20 69 6e 74 20 72 75 6e 41 73 4f  tatic int runAsO
279c0 62 6a 50 72 6f 63 28 0a 20 20 76 6f 69 64 20 2a  bjProc(.  void *
279d0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
279e0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
279f0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
27a00 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
27a10 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 54 63 6c 5f  objv[].){.  Tcl_
27a20 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b  CmdInfo cmdInfo;
27a30 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b  .  if( objc<2 ){
27a40 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
27a50 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
27a60 20 6f 62 6a 76 2c 20 22 43 4f 4d 4d 41 4e 44 20   objv, "COMMAND 
27a70 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ...");.    retur
27a80 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
27a90 0a 20 20 69 66 28 20 21 54 63 6c 5f 47 65 74 43  .  if( !Tcl_GetC
27aa0 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72  ommandInfo(inter
27ab0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
27ac0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 63 6d 64 49  (objv[1]), &cmdI
27ad0 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f  nfo) ){.    Tcl_
27ae0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
27af0 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20 6e 6f  erp, "command no
27b00 74 20 66 6f 75 6e 64 3a 20 22 2c 0a 20 20 20 20  t found: ",.    
27b10 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
27b20 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 28  ring(objv[1]), (
27b30 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65  char*)0);.    re
27b40 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
27b50 20 20 7d 0a 20 20 69 66 28 20 63 6d 64 49 6e 66    }.  if( cmdInf
27b60 6f 2e 6f 62 6a 50 72 6f 63 3d 3d 30 20 29 7b 0a  o.objProc==0 ){.
27b70 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
27b80 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f  sult(interp, "co
27b90 6d 6d 61 6e 64 20 68 61 73 20 6e 6f 20 6f 62 6a  mmand has no obj
27ba0 50 72 6f 63 3a 20 22 2c 0a 20 20 20 20 20 20 20  Proc: ",.       
27bb0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
27bc0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61  g(objv[1]), (cha
27bd0 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
27be0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
27bf0 0a 20 20 72 65 74 75 72 6e 20 63 6d 64 49 6e 66  .  return cmdInf
27c00 6f 2e 6f 62 6a 50 72 6f 63 28 63 6d 64 49 6e 66  o.objProc(cmdInf
27c10 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61 2c  o.objClientData,
27c20 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2d 31 2c   interp, objc-1,
27c30 20 6f 62 6a 76 2b 31 29 3b 0a 7d 0a 0a 23 69 66   objv+1);.}..#if
27c40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
27c50 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 57  _EXPLAIN./*.** W
27c60 41 52 4e 49 4e 47 3a 20 54 68 65 20 66 6f 6c 6c  ARNING: The foll
27c70 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2c 20  owing function, 
27c80 70 72 69 6e 74 45 78 70 6c 61 69 6e 51 75 65 72  printExplainQuer
27c90 79 50 6c 61 6e 28 29 20 69 73 20 61 6e 20 65 78  yPlan() is an ex
27ca0 61 63 74 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 65  act.** copy of e
27cb0 78 61 6d 70 6c 65 20 63 6f 64 65 20 66 72 6f 6d  xample code from
27cc0 20 65 71 70 2e 69 6e 20 28 65 71 70 2e 68 74 6d   eqp.in (eqp.htm
27cd0 6c 29 2e 20 49 66 20 74 68 69 73 20 63 6f 64 65  l). If this code
27ce0 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a   is modified,.**
27cf0 20 74 68 65 6e 20 74 68 65 20 64 6f 63 75 6d 65   then the docume
27d00 6e 74 61 74 69 6f 6e 20 63 6f 70 79 20 6e 65 65  ntation copy nee
27d10 64 73 20 74 6f 20 62 65 20 6d 6f 64 69 66 69 65  ds to be modifie
27d20 64 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 2f 2a  d as well..*/./*
27d30 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 53 74  .** Argument pSt
27d40 6d 74 20 69 73 20 61 20 70 72 65 70 61 72 65 64  mt is a prepared
27d50 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
27d60 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
27d70 6d 70 69 6c 65 73 0a 2a 2a 20 61 6e 20 45 58 50  mpiles.** an EXP
27d80 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
27d90 63 6f 6d 6d 61 6e 64 20 74 6f 20 72 65 70 6f 72  command to repor
27da0 74 20 6f 6e 20 74 68 65 20 70 72 65 70 61 72 65  t on the prepare
27db0 64 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20  d statement,.** 
27dc0 61 6e 64 20 70 72 69 6e 74 73 20 74 68 65 20 72  and prints the r
27dd0 65 70 6f 72 74 20 74 6f 20 73 74 64 6f 75 74 20  eport to stdout 
27de0 75 73 69 6e 67 20 70 72 69 6e 74 66 28 29 2e 0a  using printf()..
27df0 2a 2f 0a 69 6e 74 20 70 72 69 6e 74 45 78 70 6c  */.int printExpl
27e00 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 73 71 6c  ainQueryPlan(sql
27e10 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
27e20 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
27e30 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20  *zSql;          
27e40 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 53 51       /* Input SQ
27e50 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 78  L */.  char *zEx
27e60 70 6c 61 69 6e 3b 20 20 20 20 20 20 20 20 20 20  plain;          
27e70 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 77 69         /* SQL wi
27e80 74 68 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  th EXPLAIN QUERY
27e90 20 50 4c 41 4e 20 70 72 65 70 65 6e 64 65 64 20   PLAN prepended 
27ea0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
27eb0 74 20 2a 70 45 78 70 6c 61 69 6e 3b 20 20 20 20  t *pExplain;    
27ec0 20 20 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 64       /* Compiled
27ed0 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
27ee0 4c 41 4e 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  LAN command */. 
27ef0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
27f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f10 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
27f20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 70 72 65  from sqlite3_pre
27f30 70 61 72 65 5f 76 32 28 29 20 2a 2f 0a 0a 20 20  pare_v2() */..  
27f40 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73  zSql = sqlite3_s
27f50 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28  ql(pStmt);.  if(
27f60 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72   zSql==0 ) retur
27f70 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
27f80 0a 20 20 7a 45 78 70 6c 61 69 6e 20 3d 20 73 71  .  zExplain = sq
27f90 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 45  lite3_mprintf("E
27fa0 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
27fb0 4e 20 25 73 22 2c 20 7a 53 71 6c 29 3b 0a 20 20  N %s", zSql);.  
27fc0 69 66 28 20 7a 45 78 70 6c 61 69 6e 3d 3d 30 20  if( zExplain==0 
27fd0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
27fe0 4e 4f 4d 45 4d 3b 0a 0a 20 20 72 63 20 3d 20 73  NOMEM;..  rc = s
27ff0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
28000 32 28 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e  2(sqlite3_db_han
28010 64 6c 65 28 70 53 74 6d 74 29 2c 20 7a 45 78 70  dle(pStmt), zExp
28020 6c 61 69 6e 2c 20 2d 31 2c 20 26 70 45 78 70 6c  lain, -1, &pExpl
28030 61 69 6e 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  ain, 0);.  sqlit
28040 65 33 5f 66 72 65 65 28 7a 45 78 70 6c 61 69 6e  e3_free(zExplain
28050 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
28060 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
28070 72 63 3b 0a 0a 20 20 77 68 69 6c 65 28 20 53 51  rc;..  while( SQ
28080 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
28090 33 5f 73 74 65 70 28 70 45 78 70 6c 61 69 6e 29  3_step(pExplain)
280a0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 6c   ){.    int iSel
280b0 65 63 74 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  ectid = sqlite3_
280c0 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c  column_int(pExpl
280d0 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20 69 6e 74  ain, 0);.    int
280e0 20 69 4f 72 64 65 72 20 3d 20 73 71 6c 69 74 65   iOrder = sqlite
280f0 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78  3_column_int(pEx
28100 70 6c 61 69 6e 2c 20 31 29 3b 0a 20 20 20 20 69  plain, 1);.    i
28110 6e 74 20 69 46 72 6f 6d 20 3d 20 73 71 6c 69 74  nt iFrom = sqlit
28120 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45  e3_column_int(pE
28130 78 70 6c 61 69 6e 2c 20 32 29 3b 0a 20 20 20 20  xplain, 2);.    
28140 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 74  const char *zDet
28150 61 69 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ail = (const cha
28160 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  r *)sqlite3_colu
28170 6d 6e 5f 74 65 78 74 28 70 45 78 70 6c 61 69 6e  mn_text(pExplain
28180 2c 20 33 29 3b 0a 0a 20 20 20 20 70 72 69 6e 74  , 3);..    print
28190 66 28 22 25 64 20 25 64 20 25 64 20 25 73 5c 6e  f("%d %d %d %s\n
281a0 22 2c 20 69 53 65 6c 65 63 74 69 64 2c 20 69 4f  ", iSelectid, iO
281b0 72 64 65 72 2c 20 69 46 72 6f 6d 2c 20 7a 44 65  rder, iFrom, zDe
281c0 74 61 69 6c 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  tail);.  }..  re
281d0 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 66 69 6e  turn sqlite3_fin
281e0 61 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b  alize(pExplain);
281f0 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .}..static int t
28200 65 73 74 5f 70 72 69 6e 74 5f 65 71 70 28 0a 20  est_print_eqp(. 
28210 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
28220 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
28230 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
28240 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
28250 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
28260 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
28270 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
28280 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
28290 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
282a0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
282b0 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22   1, objv, "STMT"
282c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
282d0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
282e0 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
282f0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
28300 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
28310 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
28320 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
28330 72 63 20 3d 20 70 72 69 6e 74 45 78 70 6c 61 69  rc = printExplai
28340 6e 51 75 65 72 79 50 6c 61 6e 28 70 53 74 6d 74  nQueryPlan(pStmt
28350 29 3b 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20  );.  /* This is 
28360 6e 65 65 64 65 64 20 6f 6e 20 57 69 6e 64 6f 77  needed on Window
28370 73 20 73 6f 20 74 68 61 74 20 61 20 74 65 73 74  s so that a test
28380 20 63 61 73 65 20 75 73 69 6e 67 20 74 68 69 73   case using this
28390 20 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20   .  ** function 
283a0 63 61 6e 20 6f 70 65 6e 20 61 20 72 65 61 64 20  can open a read 
283b0 70 69 70 65 20 61 6e 64 20 67 65 74 20 74 68 65  pipe and get the
283c0 20 6f 75 74 70 75 74 20 6f 66 0a 20 20 2a 2a 20   output of.  ** 
283d0 70 72 69 6e 74 45 78 70 6c 61 69 6e 51 75 65 72  printExplainQuer
283e0 79 50 6c 61 6e 28 29 20 69 6d 6d 65 64 69 61 74  yPlan() immediat
283f0 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 66 66 6c 75  ely..  */.  fflu
28400 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 54 63  sh(stdout);.  Tc
28410 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
28420 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72  rp, (char *)t1Er
28430 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b  rorName(rc), 0);
28440 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
28450 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
28460 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
28470 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69  N */../*.** sqli
28480 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
28490 20 56 45 52 42 20 41 52 47 53 2e 2e 2e 0a 2a 2f   VERB ARGS....*/
284a0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
284b0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 0a 20  _test_control(. 
284c0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
284d0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
284e0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
284f0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
28500 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
28510 0a 20 20 73 74 72 75 63 74 20 56 65 72 62 20 7b  .  struct Verb {
28520 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
28530 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20  *zName;.    int 
28540 69 3b 0a 20 20 7d 20 61 56 65 72 62 5b 5d 20 3d  i;.  } aVerb[] =
28550 20 7b 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45   {.    { "SQLITE
28560 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54  _TESTCTRL_LOCALT
28570 49 4d 45 5f 46 41 55 4c 54 22 2c 20 53 51 4c 49  IME_FAULT", SQLI
28580 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41  TE_TESTCTRL_LOCA
28590 4c 54 49 4d 45 5f 46 41 55 4c 54 20 7d 2c 20 0a  LTIME_FAULT }, .
285a0 20 20 7d 3b 0a 20 20 69 6e 74 20 69 56 65 72 62    };.  int iVerb
285b0 3b 0a 20 20 69 6e 74 20 69 46 6c 61 67 3b 0a 20  ;.  int iFlag;. 
285c0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
285d0 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54 63  objc<2 ){.    Tc
285e0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
285f0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
28600 22 56 45 52 42 20 41 52 47 53 2e 2e 2e 22 29 3b  "VERB ARGS...");
28610 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
28620 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 63  ERROR;.  }..  rc
28630 20 3d 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46   = Tcl_GetIndexF
28640 72 6f 6d 4f 62 6a 53 74 72 75 63 74 28 0a 20 20  romObjStruct(.  
28650 20 20 20 20 69 6e 74 65 72 70 2c 20 6f 62 6a 76      interp, objv
28660 5b 31 5d 2c 20 61 56 65 72 62 2c 20 73 69 7a 65  [1], aVerb, size
28670 6f 66 28 61 56 65 72 62 5b 30 5d 29 2c 20 22 56  of(aVerb[0]), "V
28680 45 52 42 22 2c 20 30 2c 20 26 69 56 65 72 62 0a  ERB", 0, &iVerb.
28690 20 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54    );.  if( rc!=T
286a0 43 4c 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  CL_OK ) return r
286b0 63 3b 0a 0a 20 20 69 46 6c 61 67 20 3d 20 61 56  c;..  iFlag = aV
286c0 65 72 62 5b 69 56 65 72 62 5d 2e 69 3b 0a 20 20  erb[iVerb].i;.  
286d0 73 77 69 74 63 68 28 20 69 46 6c 61 67 20 29 7b  switch( iFlag ){
286e0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
286f0 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54  _TESTCTRL_LOCALT
28700 49 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a 20 20 20  IME_FAULT: {.   
28710 20 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20 20 20     int val;.    
28720 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
28730 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  .        Tcl_Wro
28740 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
28750 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4f 4e 4f 46  , 2, objv, "ONOF
28760 46 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  F");.        ret
28770 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
28780 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
28790 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
287a0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
287b0 62 6a 76 5b 32 5d 2c 20 26 76 61 6c 29 20 29 20  bjv[2], &val) ) 
287c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
287d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
287e0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
287f0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43  ITE_TESTCTRL_LOC
28800 41 4c 54 49 4d 45 5f 46 41 55 4c 54 2c 20 76 61  ALTIME_FAULT, va
28810 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
28820 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 54 63  .    }.  }..  Tc
28830 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
28840 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  terp);.  return 
28850 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53  TCL_OK;.}..#if S
28860 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a  QLITE_OS_WIN./*.
28870 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 70  ** Information p
28880 61 73 73 65 64 20 66 72 6f 6d 20 74 68 65 20 6d  assed from the m
28890 61 69 6e 20 74 68 72 65 61 64 20 69 6e 74 6f 20  ain thread into 
288a0 74 68 65 20 77 69 6e 64 6f 77 73 20 66 69 6c 65  the windows file
288b0 20 6c 6f 63 6b 65 72 0a 2a 2a 20 62 61 63 6b 67   locker.** backg
288c0 72 6f 75 6e 64 20 74 68 72 65 61 64 2e 0a 2a 2f  round thread..*/
288d0 0a 73 74 72 75 63 74 20 77 69 6e 33 32 46 69 6c  .struct win32Fil
288e0 65 4c 6f 63 6b 65 72 20 7b 0a 20 20 63 68 61 72  eLocker {.  char
288f0 20 2a 65 76 4e 61 6d 65 3b 20 20 20 20 20 20 20   *evName;       
28900 2f 2a 20 4e 61 6d 65 20 6f 66 20 65 76 65 6e 74  /* Name of event
28910 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 72 65 61   to signal threa
28920 64 20 73 74 61 72 74 75 70 20 2a 2f 0a 20 20 48  d startup */.  H
28930 41 4e 44 4c 45 20 68 3b 20 20 20 20 20 20 20 20  ANDLE h;        
28940 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 66 20     /* Handle of 
28950 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 6c  the file to be l
28960 6f 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64  ocked */.  int d
28970 65 6c 61 79 31 3b 20 20 20 20 20 20 20 20 20 2f  elay1;         /
28980 2a 20 44 65 6c 61 79 20 62 65 66 6f 72 65 20 6c  * Delay before l
28990 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  ocking */.  int 
289a0 64 65 6c 61 79 32 3b 20 20 20 20 20 20 20 20 20  delay2;         
289b0 2f 2a 20 44 65 6c 61 79 20 62 65 66 6f 72 65 20  /* Delay before 
289c0 75 6e 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 69  unlocking */.  i
289d0 6e 74 20 6f 6b 3b 20 20 20 20 20 20 20 20 20 20  nt ok;          
289e0 20 20 20 2f 2a 20 46 69 6e 69 73 68 65 64 20 6f     /* Finished o
289f0 6b 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 3b 20  k */.  int err; 
28a00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
28a10 75 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  ue if an error o
28a20 63 63 75 72 73 20 2a 2f 0a 7d 3b 0a 23 65 6e 64  ccurs */.};.#end
28a30 69 66 0a 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  if...#if SQLITE_
28a40 4f 53 5f 57 49 4e 0a 23 69 6e 63 6c 75 64 65 20  OS_WIN.#include 
28a50 3c 70 72 6f 63 65 73 73 2e 68 3e 0a 2f 2a 0a 2a  <process.h>./*.*
28a60 2a 20 54 68 65 20 62 61 63 6b 67 72 6f 75 6e 64  * The background
28a70 20 74 68 72 65 61 64 20 74 68 61 74 20 64 6f 65   thread that doe
28a80 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a  s file locking..
28a90 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
28aa0 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b 65 72  in32_file_locker
28ab0 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29  (void *pAppData)
28ac0 7b 0a 20 20 73 74 72 75 63 74 20 77 69 6e 33 32  {.  struct win32
28ad0 46 69 6c 65 4c 6f 63 6b 65 72 20 2a 70 20 3d 20  FileLocker *p = 
28ae0 28 73 74 72 75 63 74 20 77 69 6e 33 32 46 69 6c  (struct win32Fil
28af0 65 4c 6f 63 6b 65 72 2a 29 70 41 70 70 44 61 74  eLocker*)pAppDat
28b00 61 3b 0a 20 20 69 66 28 20 70 2d 3e 65 76 4e 61  a;.  if( p->evNa
28b10 6d 65 20 29 7b 0a 20 20 20 20 48 41 4e 44 4c 45  me ){.    HANDLE
28b20 20 65 76 20 3d 20 4f 70 65 6e 45 76 65 6e 74 28   ev = OpenEvent(
28b30 45 56 45 4e 54 5f 4d 4f 44 49 46 59 5f 53 54 41  EVENT_MODIFY_STA
28b40 54 45 2c 20 46 41 4c 53 45 2c 20 70 2d 3e 65 76  TE, FALSE, p->ev
28b50 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 20 28 20  Name);.    if ( 
28b60 65 76 20 29 7b 0a 20 20 20 20 20 20 53 65 74 45  ev ){.      SetE
28b70 76 65 6e 74 28 65 76 29 3b 0a 20 20 20 20 20 20  vent(ev);.      
28b80 43 6c 6f 73 65 48 61 6e 64 6c 65 28 65 76 29 3b  CloseHandle(ev);
28b90 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
28ba0 20 70 2d 3e 64 65 6c 61 79 31 20 29 20 53 6c 65   p->delay1 ) Sle
28bb0 65 70 28 70 2d 3e 64 65 6c 61 79 31 29 3b 0a 20  ep(p->delay1);. 
28bc0 20 69 66 28 20 4c 6f 63 6b 46 69 6c 65 28 70 2d   if( LockFile(p-
28bd0 3e 68 2c 20 30 2c 20 30 2c 20 31 30 30 30 30 30  >h, 0, 0, 100000
28be0 30 30 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 53  000, 0) ){.    S
28bf0 6c 65 65 70 28 70 2d 3e 64 65 6c 61 79 32 29 3b  leep(p->delay2);
28c00 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28  .    UnlockFile(
28c10 70 2d 3e 68 2c 20 30 2c 20 30 2c 20 31 30 30 30  p->h, 0, 0, 1000
28c20 30 30 30 30 30 2c 20 30 29 3b 0a 20 20 20 20 70  00000, 0);.    p
28c30 2d 3e 6f 6b 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  ->ok = 1;.  }els
28c40 65 7b 0a 20 20 20 20 70 2d 3e 65 72 72 20 3d 20  e{.    p->err = 
28c50 31 3b 0a 20 20 7d 0a 20 20 43 6c 6f 73 65 48 61  1;.  }.  CloseHa
28c60 6e 64 6c 65 28 70 2d 3e 68 29 3b 0a 20 20 70 2d  ndle(p->h);.  p-
28c70 3e 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 64 65 6c  >h = 0;.  p->del
28c80 61 79 31 20 3d 20 30 3b 0a 20 20 70 2d 3e 64 65  ay1 = 0;.  p->de
28c90 6c 61 79 32 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64  lay2 = 0;.}.#end
28ca0 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  if..#if SQLITE_O
28cb0 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20 20 20 20 20  S_WIN./*.**     
28cc0 20 6c 6f 63 6b 5f 77 69 6e 33 32 5f 66 69 6c 65   lock_win32_file
28cd0 20 46 49 4c 45 4e 41 4d 45 20 44 45 4c 41 59 31   FILENAME DELAY1
28ce0 20 44 45 4c 41 59 32 0a 2a 2a 0a 2a 2a 20 47 65   DELAY2.**.** Ge
28cf0 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  t an exclusive m
28d00 61 6e 64 69 74 6f 72 79 20 6c 6f 63 6b 20 6f 6e  anditory lock on
28d10 20 66 69 6c 65 20 66 6f 72 20 44 45 4c 41 59 32   file for DELAY2
28d20 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2e 0a 2a   milliseconds..*
28d30 2a 20 57 61 69 74 20 44 45 4c 41 59 31 20 6d 69  * Wait DELAY1 mi
28d40 6c 6c 69 73 65 63 6f 6e 64 73 20 62 65 66 6f 72  lliseconds befor
28d50 65 20 61 63 71 75 69 72 69 6e 67 20 74 68 65 20  e acquiring the 
28d60 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lock..*/.static 
28d70 69 6e 74 20 77 69 6e 33 32 5f 66 69 6c 65 5f 6c  int win32_file_l
28d80 6f 63 6b 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ock(.  void * cl
28d90 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
28da0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
28db0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
28dc0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
28dd0 76 5b 5d 0a 29 7b 0a 20 20 73 74 61 74 69 63 20  v[].){.  static 
28de0 73 74 72 75 63 74 20 77 69 6e 33 32 46 69 6c 65  struct win32File
28df0 4c 6f 63 6b 65 72 20 78 20 3d 20 7b 20 22 77 69  Locker x = { "wi
28e00 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b 22 2c 20  n32_file_lock", 
28e10 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b  0, 0, 0, 0, 0 };
28e20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
28e30 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 63 68 61 72  Filename;.  char
28e40 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20 69 6e   zBuf[200];.  in
28e50 74 20 72 65 74 72 79 20 3d 20 30 3b 0a 20 20 48  t retry = 0;.  H
28e60 41 4e 44 4c 45 20 65 76 3b 0a 20 20 44 57 4f 52  ANDLE ev;.  DWOR
28e70 44 20 77 52 65 73 75 6c 74 3b 0a 20 20 0a 20 20  D wResult;.  .  
28e80 69 66 28 20 6f 62 6a 63 21 3d 34 20 26 26 20 6f  if( objc!=4 && o
28e90 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63  bjc!=1 ){.    Tc
28ea0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
28eb0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
28ec0 22 46 49 4c 45 4e 41 4d 45 20 44 45 4c 41 59 31  "FILENAME DELAY1
28ed0 20 44 45 4c 41 59 32 22 29 3b 0a 20 20 20 20 72   DELAY2");.    r
28ee0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
28ef0 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d  .  }.  if( objc=
28f00 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =1 ){.    sqlite
28f10 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
28f20 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22  f(zBuf), zBuf, "
28f30 25 64 20 25 64 20 25 64 20 25 64 20 25 64 22 2c  %d %d %d %d %d",
28f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28f50 20 20 20 20 20 20 78 2e 6f 6b 2c 20 78 2e 65 72        x.ok, x.er
28f60 72 2c 20 78 2e 64 65 6c 61 79 31 2c 20 78 2e 64  r, x.delay1, x.d
28f70 65 6c 61 79 32 2c 20 78 2e 68 29 3b 0a 20 20 20  elay2, x.h);.   
28f80 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
28f90 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
28fa0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72  (char*)0);.    r
28fb0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20  eturn TCL_OK;.  
28fc0 7d 0a 20 20 77 68 69 6c 65 28 20 78 2e 68 20 26  }.  while( x.h &
28fd0 26 20 72 65 74 72 79 3c 33 30 20 29 7b 0a 20 20  & retry<30 ){.  
28fe0 20 20 72 65 74 72 79 2b 2b 3b 0a 20 20 20 20 53    retry++;.    S
28ff0 6c 65 65 70 28 31 30 30 29 3b 0a 20 20 7d 0a 20  leep(100);.  }. 
29000 20 69 66 28 20 78 2e 68 20 29 7b 0a 20 20 20 20   if( x.h ){.    
29010 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
29020 28 69 6e 74 65 72 70 2c 20 22 62 75 73 79 22 2c  (interp, "busy",
29030 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
29040 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
29050 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
29060 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
29070 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
29080 78 2e 64 65 6c 61 79 31 29 20 29 20 72 65 74 75  x.delay1) ) retu
29090 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
290a0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
290b0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
290c0 6a 76 5b 33 5d 2c 20 26 78 2e 64 65 6c 61 79 32  jv[3], &x.delay2
290d0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
290e0 52 52 4f 52 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d  RROR;.  zFilenam
290f0 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
29100 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 78 2e  g(objv[1]);.  x.
29110 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 28 7a  h = CreateFile(z
29120 46 69 6c 65 6e 61 6d 65 2c 20 47 45 4e 45 52 49  Filename, GENERI
29130 43 5f 52 45 41 44 7c 47 45 4e 45 52 49 43 5f 57  C_READ|GENERIC_W
29140 52 49 54 45 2c 0a 20 20 20 20 20 20 20 20 20 20  RITE,.          
29150 20 20 20 20 46 49 4c 45 5f 53 48 41 52 45 5f 52      FILE_SHARE_R
29160 45 41 44 7c 46 49 4c 45 5f 53 48 41 52 45 5f 57  EAD|FILE_SHARE_W
29170 52 49 54 45 2c 20 30 2c 20 4f 50 45 4e 5f 41 4c  RITE, 0, OPEN_AL
29180 57 41 59 53 2c 0a 20 20 20 20 20 20 20 20 20 20  WAYS,.          
29190 20 20 20 20 46 49 4c 45 5f 41 54 54 52 49 42 55      FILE_ATTRIBU
291a0 54 45 5f 4e 4f 52 4d 41 4c 2c 20 30 29 3b 0a 20  TE_NORMAL, 0);. 
291b0 20 69 66 28 20 21 78 2e 68 20 29 7b 0a 20 20 20   if( !x.h ){.   
291c0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
291d0 74 28 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f  t(interp, "canno
291e0 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20 22 2c 20  t open file: ", 
291f0 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 63 68 61 72  zFilename, (char
29200 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  *)0);.    return
29210 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
29220 20 20 65 76 20 3d 20 43 72 65 61 74 65 45 76 65    ev = CreateEve
29230 6e 74 28 4e 55 4c 4c 2c 20 54 52 55 45 2c 20 46  nt(NULL, TRUE, F
29240 41 4c 53 45 2c 20 78 2e 65 76 4e 61 6d 65 29 3b  ALSE, x.evName);
29250 0a 20 20 69 66 20 28 20 21 65 76 20 29 7b 0a 20  .  if ( !ev ){. 
29260 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
29270 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 61 6e  ult(interp, "can
29280 6e 6f 74 20 63 72 65 61 74 65 20 65 76 65 6e 74  not create event
29290 3a 20 22 2c 20 78 2e 65 76 4e 61 6d 65 2c 20 28  : ", x.evName, (
292a0 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65  char*)0);.    re
292b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
292c0 20 20 7d 0a 20 20 5f 62 65 67 69 6e 74 68 72 65    }.  _beginthre
292d0 61 64 28 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f  ad(win32_file_lo
292e0 63 6b 65 72 2c 20 30 2c 20 28 76 6f 69 64 2a 29  cker, 0, (void*)
292f0 26 78 29 3b 0a 20 20 53 6c 65 65 70 28 30 29 3b  &x);.  Sleep(0);
29300 0a 20 20 69 66 20 28 20 28 77 52 65 73 75 6c 74  .  if ( (wResult
29310 20 3d 20 57 61 69 74 46 6f 72 53 69 6e 67 6c 65   = WaitForSingle
29320 4f 62 6a 65 63 74 28 65 76 2c 20 31 30 30 30 30  Object(ev, 10000
29330 29 29 21 3d 57 41 49 54 5f 4f 42 4a 45 43 54 5f  ))!=WAIT_OBJECT_
29340 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
29350 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
29360 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 30  (zBuf), zBuf, "0
29370 78 25 78 22 2c 20 77 52 65 73 75 6c 74 29 3b 0a  x%x", wResult);.
29380 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
29390 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 61  sult(interp, "wa
293a0 69 74 20 66 61 69 6c 65 64 3a 20 22 2c 20 7a 42  it failed: ", zB
293b0 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  uf, (char*)0);. 
293c0 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 65     CloseHandle(e
293d0 76 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  v);.    return T
293e0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
293f0 43 6c 6f 73 65 48 61 6e 64 6c 65 28 65 76 29 3b  CloseHandle(ev);
29400 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
29410 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
29420 2a 2a 20 20 20 20 20 20 6f 70 74 69 6d 69 7a 61  **      optimiza
29430 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 20 44 42 20  tion_control DB 
29440 4f 50 54 20 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a  OPT BOOLEAN.**.*
29450 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61  * Enable or disa
29460 62 6c 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69  ble query optimi
29470 7a 61 74 69 6f 6e 73 20 75 73 69 6e 67 20 74 68  zations using th
29480 65 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  e sqlite3_test_c
29490 6f 6e 74 72 6f 6c 28 29 0a 2a 2a 20 69 6e 74 65  ontrol().** inte
294a0 72 66 61 63 65 2e 20 20 44 69 73 61 62 6c 65 20  rface.  Disable 
294b0 69 66 20 42 4f 4f 4c 45 41 4e 20 69 73 20 66 61  if BOOLEAN is fa
294c0 6c 73 65 20 61 6e 64 20 65 6e 61 62 6c 65 20 69  lse and enable i
294d0 66 20 42 4f 4f 4c 45 41 4e 20 69 73 20 74 72 75  f BOOLEAN is tru
294e0 65 2e 0a 2a 2a 20 4f 50 54 20 69 73 20 74 68 65  e..** OPT is the
294f0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 74   name of the opt
29500 69 6d 69 7a 61 74 69 6f 6e 20 74 6f 20 62 65 20  imization to be 
29510 64 69 73 61 62 6c 65 64 2e 0a 2a 2f 0a 73 74 61  disabled..*/.sta
29520 74 69 63 20 69 6e 74 20 6f 70 74 69 6d 69 7a 61  tic int optimiza
29530 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 28 0a 20 20  tion_control(.  
29540 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
29550 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
29560 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
29570 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
29580 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
29590 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
295a0 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
295b0 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20 69 6e  char *zOpt;.  in
295c0 74 20 6f 6e 6f 66 66 3b 0a 20 20 69 6e 74 20 6d  t onoff;.  int m
295d0 61 73 6b 20 3d 20 30 3b 0a 20 20 73 74 61 74 69  ask = 0;.  stati
295e0 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b  c const struct {
295f0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
29600 2a 7a 4f 70 74 4e 61 6d 65 3b 0a 20 20 20 20 69  *zOptName;.    i
29610 6e 74 20 6d 61 73 6b 3b 0a 20 20 7d 20 61 4f 70  nt mask;.  } aOp
29620 74 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 61  t[] = {.    { "a
29630 6c 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ll",            
29640 20 20 53 51 4c 49 54 45 5f 4f 70 74 4d 61 73 6b    SQLITE_OptMask
29650 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
29660 20 22 71 75 65 72 79 2d 66 6c 61 74 74 65 6e 65   "query-flattene
29670 72 22 2c 20 20 53 51 4c 49 54 45 5f 51 75 65 72  r",  SQLITE_Quer
29680 79 46 6c 61 74 74 65 6e 65 72 20 7d 2c 0a 20 20  yFlattener },.  
29690 20 20 7b 20 22 63 6f 6c 75 6d 6e 2d 63 61 63 68    { "column-cach
296a0 65 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 43  e",     SQLITE_C
296b0 6f 6c 75 6d 6e 43 61 63 68 65 20 20 20 20 7d 2c  olumnCache    },
296c0 0a 20 20 20 20 7b 20 22 69 6e 64 65 78 2d 73 6f  .    { "index-so
296d0 72 74 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54  rt",       SQLIT
296e0 45 5f 49 6e 64 65 78 53 6f 72 74 20 20 20 20 20  E_IndexSort     
296f0 20 7d 2c 0a 20 20 20 20 7b 20 22 69 6e 64 65 78   },.    { "index
29700 2d 73 65 61 72 63 68 22 2c 20 20 20 20 20 53 51  -search",     SQ
29710 4c 49 54 45 5f 49 6e 64 65 78 53 65 61 72 63 68  LITE_IndexSearch
29720 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69 6e      },.    { "in
29730 64 65 78 2d 63 6f 76 65 72 22 2c 20 20 20 20 20  dex-cover",     
29740 20 53 51 4c 49 54 45 5f 49 6e 64 65 78 43 6f 76   SQLITE_IndexCov
29750 65 72 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20  er     },.    { 
29760 22 67 72 6f 75 70 62 79 2d 6f 72 64 65 72 22 2c  "groupby-order",
29770 20 20 20 20 53 51 4c 49 54 45 5f 47 72 6f 75 70      SQLITE_Group
29780 42 79 4f 72 64 65 72 20 20 20 7d 2c 0a 20 20 20  ByOrder   },.   
29790 20 7b 20 22 66 61 63 74 6f 72 2d 63 6f 6e 73 74   { "factor-const
297a0 61 6e 74 73 22 2c 20 53 51 4c 49 54 45 5f 46 61  ants", SQLITE_Fa
297b0 63 74 6f 72 4f 75 74 43 6f 6e 73 74 20 7d 2c 0a  ctorOutConst },.
297c0 20 20 20 20 7b 20 22 72 65 61 6c 2d 61 73 2d 69      { "real-as-i
297d0 6e 74 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45  nt",      SQLITE
297e0 5f 49 64 78 52 65 61 6c 41 73 49 6e 74 20 20 20  _IdxRealAsInt   
297f0 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f  },.  };..  if( o
29800 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
29810 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
29820 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
29830 22 44 42 20 4f 50 54 20 42 4f 4f 4c 45 41 4e 22  "DB OPT BOOLEAN"
29840 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
29850 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
29860 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
29870 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
29880 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
29890 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
298a0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
298b0 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
298c0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
298d0 76 5b 33 5d 2c 20 26 6f 6e 6f 66 66 29 20 29 20  v[3], &onoff) ) 
298e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
298f0 3b 0a 20 20 7a 4f 70 74 20 3d 20 54 63 6c 5f 47  ;.  zOpt = Tcl_G
29900 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
29910 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
29920 73 69 7a 65 6f 66 28 61 4f 70 74 29 2f 73 69 7a  sizeof(aOpt)/siz
29930 65 6f 66 28 61 4f 70 74 5b 30 5d 29 3b 20 69 2b  eof(aOpt[0]); i+
29940 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63  +){.    if( strc
29950 6d 70 28 7a 4f 70 74 2c 20 61 4f 70 74 5b 69 5d  mp(zOpt, aOpt[i]
29960 2e 7a 4f 70 74 4e 61 6d 65 29 3d 3d 30 20 29 7b  .zOptName)==0 ){
29970 0a 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 61 4f  .      mask = aO
29980 70 74 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20  pt[i].mask;.    
29990 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
299a0 20 7d 0a 20 20 69 66 28 20 6f 6e 6f 66 66 20 29   }.  if( onoff )
299b0 20 6d 61 73 6b 20 3d 20 7e 6d 61 73 6b 3b 0a 20   mask = ~mask;. 
299c0 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28 61   if( i>=sizeof(a
299d0 4f 70 74 29 2f 73 69 7a 65 6f 66 28 61 4f 70 74  Opt)/sizeof(aOpt
299e0 5b 30 5d 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f  [0]) ){.    Tcl_
299f0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
29a00 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70  erp, "unknown op
29a10 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 73 68 6f  timization - sho
29a20 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a 22 2c  uld be one of:",
29a30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29a40 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b        (char*)0);
29a50 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
29a60 73 69 7a 65 6f 66 28 61 4f 70 74 29 2f 73 69 7a  sizeof(aOpt)/siz
29a70 65 6f 66 28 61 4f 70 74 5b 30 5d 29 3b 20 69 2b  eof(aOpt[0]); i+
29a80 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  +){.      Tcl_Ap
29a90 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
29aa0 70 2c 20 22 20 22 2c 20 61 4f 70 74 5b 69 5d 2e  p, " ", aOpt[i].
29ab0 7a 4f 70 74 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  zOptName);.    }
29ac0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
29ad0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c  ERROR;.  }.  sql
29ae0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
29af0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
29b00 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c  L_OPTIMIZATIONS,
29b10 20 64 62 2c 20 6d 61 73 6b 29 3b 0a 20 20 72 65   db, mask);.  re
29b20 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
29b30 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 63  /*.** Register c
29b40 6f 6d 6d 61 6e 64 73 20 77 69 74 68 20 74 68 65  ommands with the
29b50 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
29b60 2e 0a 2a 2f 0a 69 6e 74 20 53 71 6c 69 74 65 74  ..*/.int Sqlitet
29b70 65 73 74 31 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est1_Init(Tcl_In
29b80 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20  terp *interp){. 
29b90 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
29ba0 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
29bb0 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
29bc0 71 6c 69 74 65 33 5f 66 6f 75 6e 64 5f 63 6f 75  qlite3_found_cou
29bd0 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  nt;.  extern int
29be0 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75   sqlite3_interru
29bf0 70 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  pt_count;.  exte
29c00 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  rn int sqlite3_o
29c10 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 3b 0a  pen_file_count;.
29c20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
29c30 69 74 65 33 5f 73 6f 72 74 5f 63 6f 75 6e 74 3b  ite3_sort_count;
29c40 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
29c50 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
29c60 6d 65 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  me;.#if SQLITE_O
29c70 53 5f 55 4e 49 58 20 26 26 20 64 65 66 69 6e 65  S_UNIX && define
29c80 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
29c90 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
29ca0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 65 78  CKING_STYLE.  ex
29cb0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
29cc0 5f 68 6f 73 74 69 64 5f 6e 75 6d 3b 0a 23 65 6e  _hostid_num;.#en
29cd0 64 69 66 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  dif.  extern int
29ce0 20 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f   sqlite3_max_blo
29cf0 62 73 69 7a 65 3b 0a 20 20 65 78 74 65 72 6e 20  bsize;.  extern 
29d00 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
29d10 53 68 61 72 65 64 43 61 63 68 65 52 65 70 6f 72  SharedCacheRepor
29d20 74 28 76 6f 69 64 2a 2c 0a 20 20 20 20 20 20 20  t(void*,.       
29d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d50 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 2a 2c 69     Tcl_Interp*,i
29d60 6e 74 2c 54 63 6c 5f 4f 62 6a 2a 43 4f 4e 53 54  nt,Tcl_Obj*CONST
29d70 2a 29 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72  *);.  static str
29d80 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20  uct {.     char 
29d90 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c  *zName;.     Tcl
29da0 5f 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b  _CmdProc *xProc;
29db0 0a 20 20 7d 20 61 43 6d 64 5b 5d 20 3d 20 7b 0a  .  } aCmd[] = {.
29dc0 20 20 20 20 20 7b 20 22 64 62 5f 65 6e 74 65 72       { "db_enter
29dd0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
29de0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
29df0 50 72 6f 63 2a 29 64 62 5f 65 6e 74 65 72 20 20  Proc*)db_enter  
29e00 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
29e10 20 20 20 20 20 7b 20 22 64 62 5f 6c 65 61 76 65       { "db_leave
29e20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
29e30 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
29e40 50 72 6f 63 2a 29 64 62 5f 6c 65 61 76 65 20 20  Proc*)db_leave  
29e50 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
29e60 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
29e70 6d 70 72 69 6e 74 66 5f 69 6e 74 22 2c 20 20 20  mprintf_int",   
29e80 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
29e90 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70  Proc*)sqlite3_mp
29ea0 72 69 6e 74 66 5f 69 6e 74 20 20 20 20 7d 2c 0a  rintf_int    },.
29eb0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
29ec0 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 22 2c 20  mprintf_int64", 
29ed0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
29ee0 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70  Proc*)sqlite3_mp
29ef0 72 69 6e 74 66 5f 69 6e 74 36 34 20 20 7d 2c 0a  rintf_int64  },.
29f00 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
29f10 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67 22 2c 20 20  mprintf_long",  
29f20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
29f30 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70  Proc*)sqlite3_mp
29f40 72 69 6e 74 66 5f 6c 6f 6e 67 20 20 20 7d 2c 0a  rintf_long   },.
29f50 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
29f60 6d 70 72 69 6e 74 66 5f 73 74 72 22 2c 20 20 20  mprintf_str",   
29f70 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
29f80 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70  Proc*)sqlite3_mp
29f90 72 69 6e 74 66 5f 73 74 72 20 20 20 20 7d 2c 0a  rintf_str    },.
29fa0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
29fb0 73 6e 70 72 69 6e 74 66 5f 73 74 72 22 2c 20 20  snprintf_str",  
29fc0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
29fd0 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 73 6e  Proc*)sqlite3_sn
29fe0 70 72 69 6e 74 66 5f 73 74 72 20 20 20 7d 2c 0a  printf_str   },.
29ff0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2a000 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 22  mprintf_stronly"
2a010 2c 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64  ,       (Tcl_Cmd
2a020 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70  Proc*)sqlite3_mp
2a030 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 7d 2c 0a  rintf_stronly},.
2a040 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2a050 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 22 2c  mprintf_double",
2a060 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
2a070 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70  Proc*)sqlite3_mp
2a080 72 69 6e 74 66 5f 64 6f 75 62 6c 65 20 7d 2c 0a  rintf_double },.
2a090 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2a0a0 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 22 2c  mprintf_scaled",
2a0b0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
2a0c0 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70  Proc*)sqlite3_mp
2a0d0 72 69 6e 74 66 5f 73 63 61 6c 65 64 20 7d 2c 0a  rintf_scaled },.
2a0e0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2a0f0 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c  mprintf_hexdoubl
2a100 65 22 2c 20 20 20 28 54 63 6c 5f 43 6d 64 50 72  e",   (Tcl_CmdPr
2a110 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69  oc*)sqlite3_mpri
2a120 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65 7d 2c 0a  ntf_hexdouble},.
2a130 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2a140 6d 70 72 69 6e 74 66 5f 7a 5f 74 65 73 74 22 2c  mprintf_z_test",
2a150 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
2a160 50 72 6f 63 2a 29 74 65 73 74 5f 6d 70 72 69 6e  Proc*)test_mprin
2a170 74 66 5f 7a 20 20 20 20 20 20 20 20 7d 2c 0a 20  tf_z        },. 
2a180 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
2a190 70 72 69 6e 74 66 5f 6e 5f 74 65 73 74 22 2c 20  printf_n_test", 
2a1a0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
2a1b0 72 6f 63 2a 29 74 65 73 74 5f 6d 70 72 69 6e 74  roc*)test_mprint
2a1c0 66 5f 6e 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  f_n        },.  
2a1d0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6e     { "sqlite3_sn
2a1e0 70 72 69 6e 74 66 5f 69 6e 74 22 2c 20 20 20 20  printf_int",    
2a1f0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
2a200 6f 63 2a 29 74 65 73 74 5f 73 6e 70 72 69 6e 74  oc*)test_snprint
2a210 66 5f 69 6e 74 20 20 20 20 20 7d 2c 0a 20 20 20  f_int     },.   
2a220 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c 61 73    { "sqlite3_las
2a230 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c  t_insert_rowid",
2a240 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
2a250 63 2a 29 74 65 73 74 5f 6c 61 73 74 5f 72 6f 77  c*)test_last_row
2a260 69 64 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  id       },.    
2a270 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 65 63   { "sqlite3_exec
2a280 5f 70 72 69 6e 74 66 22 2c 20 20 20 20 20 20 20  _printf",       
2a290 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2a2a0 2a 29 74 65 73 74 5f 65 78 65 63 5f 70 72 69 6e  *)test_exec_prin
2a2b0 74 66 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  tf      },.     
2a2c0 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 65 63 5f  { "sqlite3_exec_
2a2d0 68 65 78 22 2c 20 20 20 20 20 20 20 20 20 20 20  hex",           
2a2e0 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
2a2f0 29 74 65 73 74 5f 65 78 65 63 5f 68 65 78 20 20  )test_exec_hex  
2a300 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
2a310 20 22 73 71 6c 69 74 65 33 5f 65 78 65 63 22 2c   "sqlite3_exec",
2a320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a330 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
2a340 74 65 73 74 5f 65 78 65 63 20 20 20 20 20 20 20  test_exec       
2a350 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
2a360 22 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 6e 72  "sqlite3_exec_nr
2a370 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2a380 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
2a390 65 73 74 5f 65 78 65 63 5f 6e 72 20 20 20 20 20  est_exec_nr     
2a3a0 20 20 20 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20       },.#ifndef 
2a3b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 47 45 54 5f  SQLITE_OMIT_GET_
2a3c0 54 41 42 4c 45 0a 20 20 20 20 20 7b 20 22 73 71  TABLE.     { "sq
2a3d0 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f  lite3_get_table_
2a3e0 70 72 69 6e 74 66 22 2c 20 20 20 20 20 20 28 54  printf",      (T
2a3f0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
2a400 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74  _get_table_print
2a410 66 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20  f },.#endif.    
2a420 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6c 6f 73   { "sqlite3_clos
2a430 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
2a440 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2a450 2a 29 73 71 6c 69 74 65 5f 74 65 73 74 5f 63 6c  *)sqlite_test_cl
2a460 6f 73 65 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  ose     },.     
2a470 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74  { "sqlite3_creat
2a480 65 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20  e_function",    
2a490 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
2a4a0 29 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75 6e  )test_create_fun
2a4b0 63 74 69 6f 6e 20 20 7d 2c 0a 20 20 20 20 20 7b  ction  },.     {
2a4c0 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65   "sqlite3_create
2a4d0 5f 61 67 67 72 65 67 61 74 65 22 2c 20 20 20 20  _aggregate",    
2a4e0 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
2a4f0 74 65 73 74 5f 63 72 65 61 74 65 5f 61 67 67 72  test_create_aggr
2a500 65 67 61 74 65 20 7d 2c 0a 20 20 20 20 20 7b 20  egate },.     { 
2a510 22 73 71 6c 69 74 65 5f 72 65 67 69 73 74 65 72  "sqlite_register
2a520 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c  _test_function",
2a530 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
2a540 65 73 74 5f 72 65 67 69 73 74 65 72 5f 66 75 6e  est_register_fun
2a550 63 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  c    },.     { "
2a560 73 71 6c 69 74 65 5f 61 62 6f 72 74 22 2c 20 20  sqlite_abort",  
2a570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a580 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71  (Tcl_CmdProc*)sq
2a590 6c 69 74 65 5f 61 62 6f 72 74 20 20 20 20 20 20  lite_abort      
2a5a0 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
2a5b0 71 6c 69 74 65 5f 62 69 6e 64 22 2c 20 20 20 20  qlite_bind",    
2a5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2a5d0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
2a5e0 74 5f 62 69 6e 64 20 20 20 20 20 20 20 20 20 20  t_bind          
2a5f0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 72     },.     { "br
2a600 65 61 6b 70 6f 69 6e 74 22 2c 20 20 20 20 20 20  eakpoint",      
2a610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
2a620 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
2a630 5f 62 72 65 61 6b 70 6f 69 6e 74 20 20 20 20 20  _breakpoint     
2a640 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2a650 69 74 65 33 5f 6b 65 79 22 2c 20 20 20 20 20 20  ite3_key",      
2a660 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
2a670 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
2a680 6b 65 79 20 20 20 20 20 20 20 20 20 20 20 20 20  key             
2a690 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2a6a0 74 65 33 5f 72 65 6b 65 79 22 2c 20 20 20 20 20  te3_rekey",     
2a6b0 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
2a6c0 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 72  _CmdProc*)test_r
2a6d0 65 6b 65 79 20 20 20 20 20 20 20 20 20 20 20 20  ekey            
2a6e0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2a6f0 65 5f 73 65 74 5f 6d 61 67 69 63 22 2c 20 20 20  e_set_magic",   
2a700 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
2a710 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f  CmdProc*)sqlite_
2a720 73 65 74 5f 6d 61 67 69 63 20 20 20 20 20 20 7d  set_magic      }
2a730 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2a740 33 5f 69 6e 74 65 72 72 75 70 74 22 2c 20 20 20  3_interrupt",   
2a750 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
2a760 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 69 6e 74  mdProc*)test_int
2a770 65 72 72 75 70 74 20 20 20 20 20 20 20 20 7d 2c  errupt        },
2a780 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f  .     { "sqlite_
2a790 64 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e 22  delete_function"
2a7a0 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d  ,        (Tcl_Cm
2a7b0 64 50 72 6f 63 2a 29 64 65 6c 65 74 65 5f 66 75  dProc*)delete_fu
2a7c0 6e 63 74 69 6f 6e 20 20 20 20 20 20 20 7d 2c 0a  nction       },.
2a7d0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 64       { "sqlite_d
2a7e0 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 22  elete_collation"
2a7f0 2c 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64  ,       (Tcl_Cmd
2a800 50 72 6f 63 2a 29 64 65 6c 65 74 65 5f 63 6f 6c  Proc*)delete_col
2a810 6c 61 74 69 6f 6e 20 20 20 20 20 20 7d 2c 0a 20  lation      },. 
2a820 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 67      { "sqlite3_g
2a830 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 22 2c 20  et_autocommit", 
2a840 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
2a850 72 6f 63 2a 29 67 65 74 5f 61 75 74 6f 63 6f 6d  roc*)get_autocom
2a860 6d 69 74 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  mit        },.  
2a870 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 74     { "sqlite3_st
2a880 61 63 6b 5f 75 73 65 64 22 2c 20 20 20 20 20 20  ack_used",      
2a890 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
2a8a0 6f 63 2a 29 74 65 73 74 5f 73 74 61 63 6b 5f 75  oc*)test_stack_u
2a8b0 73 65 64 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  sed       },.   
2a8c0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 75 73    { "sqlite3_bus
2a8d0 79 5f 74 69 6d 65 6f 75 74 22 2c 20 20 20 20 20  y_timeout",     
2a8e0 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
2a8f0 63 2a 29 74 65 73 74 5f 62 75 73 79 5f 74 69 6d  c*)test_busy_tim
2a900 65 6f 75 74 20 20 20 20 20 7d 2c 0a 20 20 20 20  eout     },.    
2a910 20 7b 20 22 70 72 69 6e 74 66 22 2c 20 20 20 20   { "printf",    
2a920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a930 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2a940 2a 29 74 65 73 74 5f 70 72 69 6e 74 66 20 20 20  *)test_printf   
2a950 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
2a960 7b 20 22 73 71 6c 69 74 65 33 49 6f 54 72 61 63  { "sqlite3IoTrac
2a970 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
2a980 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
2a990 65 73 74 5f 69 6f 5f 74 72 61 63 65 20 20 20 20  est_io_trace    
2a9a0 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73       },.  };.  s
2a9b0 74 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20  tatic struct {. 
2a9c0 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
2a9d0 0a 20 20 20 20 20 54 63 6c 5f 4f 62 6a 43 6d 64  .     Tcl_ObjCmd
2a9e0 50 72 6f 63 20 2a 78 50 72 6f 63 3b 0a 20 20 20  Proc *xProc;.   
2a9f0 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61    void *clientDa
2aa00 74 61 3b 0a 20 20 7d 20 61 4f 62 6a 43 6d 64 5b  ta;.  } aObjCmd[
2aa10 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 73 71  ] = {.     { "sq
2aa20 6c 69 74 65 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e  lite3_connection
2aa30 5f 70 6f 69 6e 74 65 72 22 2c 20 20 20 20 67 65  _pointer",    ge
2aa40 74 5f 73 71 6c 69 74 65 5f 70 6f 69 6e 74 65 72  t_sqlite_pointer
2aa50 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  , 0 },.     { "s
2aa60 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 22  qlite3_bind_int"
2aa70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  ,              t
2aa80 65 73 74 5f 62 69 6e 64 5f 69 6e 74 2c 20 20 20  est_bind_int,   
2aa90 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22     0 },.     { "
2aaa0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72  sqlite3_bind_zer
2aab0 6f 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20  oblob",         
2aac0 74 65 73 74 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c  test_bind_zerobl
2aad0 6f 62 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20  ob, 0 },.     { 
2aae0 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e  "sqlite3_bind_in
2aaf0 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 20 20  t64",           
2ab00 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74 36 34   test_bind_int64
2ab10 2c 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b  ,    0 },.     {
2ab20 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64   "sqlite3_bind_d
2ab30 6f 75 62 6c 65 22 2c 20 20 20 20 20 20 20 20 20  ouble",         
2ab40 20 20 74 65 73 74 5f 62 69 6e 64 5f 64 6f 75 62    test_bind_doub
2ab50 6c 65 2c 20 20 20 30 20 7d 2c 0a 20 20 20 20 20  le,   0 },.     
2ab60 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  { "sqlite3_bind_
2ab70 6e 75 6c 6c 22 2c 20 20 20 20 20 20 20 20 20 20  null",          
2ab80 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 6e 75 6c     test_bind_nul
2ab90 6c 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20  l     ,0 },.    
2aba0 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
2abb0 5f 74 65 78 74 22 2c 20 20 20 20 20 20 20 20 20  _text",         
2abc0 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 74 65      test_bind_te
2abd0 78 74 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20  xt     ,0 },.   
2abe0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
2abf0 64 5f 74 65 78 74 31 36 22 2c 20 20 20 20 20 20  d_text16",      
2ac00 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 74       test_bind_t
2ac10 65 78 74 31 36 20 20 20 2c 30 20 7d 2c 0a 20 20  ext16   ,0 },.  
2ac20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
2ac30 6e 64 5f 62 6c 6f 62 22 2c 20 20 20 20 20 20 20  nd_blob",       
2ac40 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f        test_bind_
2ac50 62 6c 6f 62 20 20 20 20 20 2c 30 20 7d 2c 0a 20  blob     ,0 },. 
2ac60 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
2ac70 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f  ind_parameter_co
2ac80 75 6e 74 22 2c 20 20 74 65 73 74 5f 62 69 6e 64  unt",  test_bind
2ac90 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74  _parameter_count
2aca0 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  , 0},.     { "sq
2acb0 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
2acc0 65 74 65 72 5f 6e 61 6d 65 22 2c 20 20 20 74 65  eter_name",   te
2acd0 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  st_bind_paramete
2ace0 72 5f 6e 61 6d 65 2c 20 20 30 7d 2c 0a 20 20 20  r_name,  0},.   
2acf0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
2ad00 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65  d_parameter_inde
2ad10 78 22 2c 20 20 74 65 73 74 5f 62 69 6e 64 5f 70  x",  test_bind_p
2ad20 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 2c 20  arameter_index, 
2ad30 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  0},.     { "sqli
2ad40 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e  te3_clear_bindin
2ad50 67 73 22 2c 20 20 20 20 20 20 20 20 74 65 73 74  gs",        test
2ad60 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 2c  _clear_bindings,
2ad70 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
2ad80 69 74 65 33 5f 73 6c 65 65 70 22 2c 20 20 20 20  ite3_sleep",    
2ad90 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
2ada0 74 5f 73 6c 65 65 70 2c 20 20 20 20 20 20 20 20  t_sleep,        
2adb0 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71    0},.     { "sq
2adc0 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 22 2c 20  lite3_errcode", 
2add0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
2ade0 73 74 5f 65 72 72 63 6f 64 65 20 20 20 20 20 20  st_errcode      
2adf0 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
2ae00 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f  qlite3_extended_
2ae10 65 72 72 63 6f 64 65 22 2c 20 20 20 20 20 20 74  errcode",      t
2ae20 65 73 74 5f 65 78 5f 65 72 72 63 6f 64 65 20 20  est_ex_errcode  
2ae30 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
2ae40 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 22 2c  sqlite3_errmsg",
2ae50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae60 74 65 73 74 5f 65 72 72 6d 73 67 20 20 20 20 20  test_errmsg     
2ae70 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
2ae80 22 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31  "sqlite3_errmsg1
2ae90 36 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  6",             
2aea0 20 74 65 73 74 5f 65 72 72 6d 73 67 31 36 20 20   test_errmsg16  
2aeb0 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
2aec0 20 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e 22 2c   "sqlite3_open",
2aed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aee0 20 20 74 65 73 74 5f 6f 70 65 6e 20 20 20 20 20    test_open     
2aef0 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
2af00 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  { "sqlite3_open1
2af10 36 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  6",             
2af20 20 20 20 74 65 73 74 5f 6f 70 65 6e 31 36 20 20     test_open16  
2af30 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
2af40 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e   { "sqlite3_open
2af50 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20 20 20  _v2",           
2af60 20 20 20 20 74 65 73 74 5f 6f 70 65 6e 5f 76 32      test_open_v2
2af70 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
2af80 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6d    { "sqlite3_com
2af90 70 6c 65 74 65 31 36 22 2c 20 20 20 20 20 20 20  plete16",       
2afa0 20 20 20 20 20 74 65 73 74 5f 63 6f 6d 70 6c 65       test_comple
2afb0 74 65 31 36 20 20 20 20 2c 30 20 7d 2c 0a 0a 20  te16    ,0 },.. 
2afc0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 70      { "sqlite3_p
2afd0 72 65 70 61 72 65 22 2c 20 20 20 20 20 20 20 20  repare",        
2afe0 20 20 20 20 20 20 20 74 65 73 74 5f 70 72 65 70         test_prep
2aff0 61 72 65 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a  are       ,0 },.
2b000 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2b010 70 72 65 70 61 72 65 31 36 22 2c 20 20 20 20 20  prepare16",     
2b020 20 20 20 20 20 20 20 20 74 65 73 74 5f 70 72 65          test_pre
2b030 70 61 72 65 31 36 20 20 20 20 20 2c 30 20 7d 2c  pare16     ,0 },
2b040 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2b050 5f 70 72 65 70 61 72 65 5f 76 32 22 2c 20 20 20  _prepare_v2",   
2b060 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 70 72           test_pr
2b070 65 70 61 72 65 5f 76 32 20 20 20 20 2c 30 20 7d  epare_v2    ,0 }
2b080 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2b090 33 5f 70 72 65 70 61 72 65 5f 74 6b 74 33 31 33  3_prepare_tkt313
2b0a0 34 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f 70  4",       test_p
2b0b0 72 65 70 61 72 65 5f 74 6b 74 33 31 33 34 2c 20  repare_tkt3134, 
2b0c0 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  0},.     { "sqli
2b0d0 74 65 33 5f 70 72 65 70 61 72 65 31 36 5f 76 32  te3_prepare16_v2
2b0e0 22 2c 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ",          test
2b0f0 5f 70 72 65 70 61 72 65 31 36 5f 76 32 20 20 2c  _prepare16_v2  ,
2b100 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
2b110 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 22 2c 20  ite3_finalize", 
2b120 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
2b130 74 5f 66 69 6e 61 6c 69 7a 65 20 20 20 20 20 20  t_finalize      
2b140 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
2b150 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
2b160 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65  s",           te
2b170 73 74 5f 73 74 6d 74 5f 73 74 61 74 75 73 20 20  st_stmt_status  
2b180 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
2b190 71 6c 69 74 65 33 5f 72 65 73 65 74 22 2c 20 20  qlite3_reset",  
2b1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
2b1b0 65 73 74 5f 72 65 73 65 74 20 20 20 20 20 20 20  est_reset       
2b1c0 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
2b1d0 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64 22  sqlite3_expired"
2b1e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b1f0 74 65 73 74 5f 65 78 70 69 72 65 64 20 20 20 20  test_expired    
2b200 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
2b210 22 73 71 6c 69 74 65 33 5f 74 72 61 6e 73 66 65  "sqlite3_transfe
2b220 72 5f 62 69 6e 64 69 6e 67 73 22 2c 20 20 20 20  r_bindings",    
2b230 20 74 65 73 74 5f 74 72 61 6e 73 66 65 72 5f 62   test_transfer_b
2b240 69 6e 64 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  ind ,0 },.     {
2b250 20 22 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65   "sqlite3_change
2b260 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  s",             
2b270 20 20 74 65 73 74 5f 63 68 61 6e 67 65 73 20 20    test_changes  
2b280 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
2b290 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 65 70 22  { "sqlite3_step"
2b2a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b2b0 20 20 20 74 65 73 74 5f 73 74 65 70 20 20 20 20     test_step    
2b2c0 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
2b2d0 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 71 6c 22   { "sqlite3_sql"
2b2e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b2f0 20 20 20 20 74 65 73 74 5f 73 71 6c 20 20 20 20      test_sql    
2b300 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
2b310 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6e 65 78    { "sqlite3_nex
2b320 74 5f 73 74 6d 74 22 2c 20 20 20 20 20 20 20 20  t_stmt",        
2b330 20 20 20 20 20 74 65 73 74 5f 6e 65 78 74 5f 73       test_next_s
2b340 74 6d 74 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  tmt     ,0 },.  
2b350 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 74     { "sqlite3_st
2b360 6d 74 5f 72 65 61 64 6f 6e 6c 79 22 2c 20 20 20  mt_readonly",   
2b370 20 20 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f        test_stmt_
2b380 72 65 61 64 6f 6e 6c 79 20 2c 30 20 7d 2c 0a 20  readonly ,0 },. 
2b390 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73      { "sqlite3_s
2b3a0 74 6d 74 5f 62 75 73 79 22 2c 20 20 20 20 20 20  tmt_busy",      
2b3b0 20 20 20 20 20 20 20 74 65 73 74 5f 73 74 6d 74         test_stmt
2b3c0 5f 62 75 73 79 20 20 20 20 20 2c 30 20 7d 2c 0a  _busy     ,0 },.
2b3d0 20 20 20 20 20 7b 20 22 75 73 65 73 5f 73 74 6d       { "uses_stm
2b3e0 74 5f 6a 6f 75 72 6e 61 6c 22 2c 20 20 20 20 20  t_journal",     
2b3f0 20 20 20 20 20 20 20 20 75 73 65 73 5f 73 74 6d          uses_stm
2b400 74 5f 6a 6f 75 72 6e 61 6c 20 2c 30 20 7d 2c 0a  t_journal ,0 },.
2b410 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2b420 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 22  _release_memory"
2b430 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f 72 65  ,        test_re
2b440 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 2c 20 20 20  lease_memory,   
2b450 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71    0},.     { "sq
2b460 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65  lite3_db_release
2b470 5f 6d 65 6d 6f 72 79 22 2c 20 20 20 20 20 74 65  _memory",     te
2b480 73 74 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65  st_db_release_me
2b490 6d 6f 72 79 2c 20 20 30 7d 2c 0a 20 20 20 20 20  mory,  0},.     
2b4a0 7b 20 22 73 71 6c 69 74 65 33 5f 64 62 5f 66 69  { "sqlite3_db_fi
2b4b0 6c 65 6e 61 6d 65 22 2c 20 20 20 20 20 20 20 20  lename",        
2b4c0 20 20 20 74 65 73 74 5f 64 62 5f 66 69 6c 65 6e     test_db_filen
2b4d0 61 6d 65 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  ame,        0},.
2b4e0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2b4f0 64 62 5f 72 65 61 64 6f 6e 6c 79 22 2c 20 20 20  db_readonly",   
2b500 20 20 20 20 20 20 20 20 74 65 73 74 5f 64 62 5f          test_db_
2b510 72 65 61 64 6f 6e 6c 79 2c 20 20 20 20 20 20 20  readonly,       
2b520 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
2b530 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c  ite3_soft_heap_l
2b540 69 6d 69 74 22 2c 20 20 20 20 20 20 20 74 65 73  imit",       tes
2b550 74 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  t_soft_heap_limi
2b560 74 2c 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b  t,    0},.     {
2b570 20 22 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64   "sqlite3_thread
2b580 5f 63 6c 65 61 6e 75 70 22 2c 20 20 20 20 20 20  _cleanup",      
2b590 20 20 74 65 73 74 5f 74 68 72 65 61 64 5f 63 6c    test_thread_cl
2b5a0 65 61 6e 75 70 2c 20 20 20 20 20 30 7d 2c 0a 20  eanup,     0},. 
2b5b0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 70      { "sqlite3_p
2b5c0 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 22 2c  ager_refcounts",
2b5d0 20 20 20 20 20 20 20 74 65 73 74 5f 70 61 67 65         test_page
2b5e0 72 5f 72 65 66 63 6f 75 6e 74 73 2c 20 20 20 20  r_refcounts,    
2b5f0 30 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c  0},..     { "sql
2b600 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  ite3_load_extens
2b610 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 74 65 73  ion",        tes
2b620 74 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  t_load_extension
2b630 2c 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b  ,     0},.     {
2b640 20 22 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65   "sqlite3_enable
2b650 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 22  _load_extension"
2b660 2c 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f 6c 6f  , test_enable_lo
2b670 61 64 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20  ad,        0},. 
2b680 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
2b690 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63  xtended_result_c
2b6a0 6f 64 65 73 22 2c 20 74 65 73 74 5f 65 78 74 65  odes", test_exte
2b6b0 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65  nded_result_code
2b6c0 73 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73  s, 0},.     { "s
2b6d0 71 6c 69 74 65 33 5f 6c 69 6d 69 74 22 2c 20 20  qlite3_limit",  
2b6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
2b6f0 65 73 74 5f 6c 69 6d 69 74 2c 20 20 20 20 20 20  est_limit,      
2b700 20 20 20 20 20 20 20 20 20 20 20 30 7d 2c 0a 0a             0},..
2b710 20 20 20 20 20 7b 20 22 73 61 76 65 5f 70 72 6e       { "save_prn
2b720 67 5f 73 74 61 74 65 22 2c 20 20 20 20 20 20 20  g_state",       
2b730 20 20 20 20 20 20 20 20 73 61 76 65 5f 70 72 6e          save_prn
2b740 67 5f 73 74 61 74 65 2c 20 20 20 20 30 20 7d 2c  g_state,    0 },
2b750 0a 20 20 20 20 20 7b 20 22 72 65 73 74 6f 72 65  .     { "restore
2b760 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c 20 20 20  _prng_state",   
2b770 20 20 20 20 20 20 20 20 20 72 65 73 74 6f 72 65           restore
2b780 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20 30 20 7d  _prng_state, 0 }
2b790 2c 0a 20 20 20 20 20 7b 20 22 72 65 73 65 74 5f  ,.     { "reset_
2b7a0 70 72 6e 67 5f 73 74 61 74 65 22 2c 20 20 20 20  prng_state",    
2b7b0 20 20 20 20 20 20 20 20 20 20 72 65 73 65 74 5f            reset_
2b7c0 70 72 6e 67 5f 73 74 61 74 65 2c 20 20 20 30 20  prng_state,   0 
2b7d0 7d 2c 0a 20 20 20 20 20 7b 20 22 6f 70 74 69 6d  },.     { "optim
2b7e0 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 22  ization_control"
2b7f0 2c 20 20 20 20 20 20 20 20 20 20 6f 70 74 69 6d  ,          optim
2b800 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 2c  ization_control,
2b810 30 7d 2c 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  0},.#if SQLITE_O
2b820 53 5f 57 49 4e 0a 20 20 20 20 20 7b 20 22 6c 6f  S_WIN.     { "lo
2b830 63 6b 5f 77 69 6e 33 32 5f 66 69 6c 65 22 2c 20  ck_win32_file", 
2b840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
2b850 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b 2c 20 20  n32_file_lock,  
2b860 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20    0 },.#endif.  
2b870 20 20 20 7b 20 22 74 63 6c 5f 6f 62 6a 70 72 6f     { "tcl_objpro
2b880 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  c",             
2b890 20 20 20 20 20 20 72 75 6e 41 73 4f 62 6a 50 72        runAsObjPr
2b8a0 6f 63 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a  oc,       0 },..
2b8b0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
2b8c0 63 6f 6c 75 6d 6e 5f 2a 28 29 20 41 50 49 20 2a  column_*() API *
2b8d0 2f 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  /.     { "sqlite
2b8e0 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 22 2c  3_column_count",
2b8f0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63            test_c
2b900 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 20 2c 30 20  olumn_count  ,0 
2b910 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2b920 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 22 2c 20  e3_data_count", 
2b930 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
2b940 64 61 74 61 5f 63 6f 75 6e 74 20 20 20 20 2c 30  data_count    ,0
2b950 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2b960 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 22  te3_column_type"
2b970 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ,           test
2b980 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 20 20 2c  _column_type   ,
2b990 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
2b9a0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
2b9b0 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ",           tes
2b9c0 74 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20 20 20  t_column_blob   
2b9d0 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
2b9e0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75  lite3_column_dou
2b9f0 62 6c 65 22 2c 20 20 20 20 20 20 20 20 20 74 65  ble",         te
2ba00 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65  st_column_double
2ba10 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
2ba20 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
2ba30 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 20 74  t64",          t
2ba40 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  est_column_int64
2ba50 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
2ba60 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
2ba70 65 78 74 22 2c 20 20 20 74 65 73 74 5f 73 74 6d  ext",   test_stm
2ba80 74 5f 75 74 66 38 2c 20 20 28 76 6f 69 64 2a 29  t_utf8,  (void*)
2ba90 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
2baa0 65 78 74 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  ext },.     { "s
2bab0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61  qlite3_column_na
2bac0 6d 65 22 2c 20 20 20 74 65 73 74 5f 73 74 6d 74  me",   test_stmt
2bad0 5f 75 74 66 38 2c 20 20 28 76 6f 69 64 2a 29 73  _utf8,  (void*)s
2bae0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61  qlite3_column_na
2baf0 6d 65 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  me },.     { "sq
2bb00 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
2bb10 22 2c 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f  ",    test_stmt_
2bb20 69 6e 74 2c 20 20 20 28 76 6f 69 64 2a 29 73 71  int,   (void*)sq
2bb30 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
2bb40 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2bb50 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
2bb60 73 22 2c 20 20 74 65 73 74 5f 73 74 6d 74 5f 69  s",  test_stmt_i
2bb70 6e 74 2c 20 20 20 28 76 6f 69 64 2a 29 73 71 6c  nt,   (void*)sql
2bb80 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
2bb90 73 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  s},.#ifndef SQLI
2bba0 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45  TE_OMIT_DECLTYPE
2bbb0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2bbc0 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65  _column_decltype
2bbd0 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38  ",test_stmt_utf8
2bbe0 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f  ,(void*)sqlite3_
2bbf0 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 7d  column_decltype}
2bc00 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ,.#endif.#ifdef 
2bc10 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
2bc20 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 7b 20  LUMN_METADATA.{ 
2bc30 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
2bc40 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 22 2c 74  database_name",t
2bc50 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 28 76  est_stmt_utf8,(v
2bc60 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  oid*)sqlite3_col
2bc70 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d  umn_database_nam
2bc80 65 7d 2c 0a 7b 20 22 73 71 6c 69 74 65 33 5f 63  e},.{ "sqlite3_c
2bc90 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65  olumn_table_name
2bca0 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38  ",test_stmt_utf8
2bcb0 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f  ,(void*)sqlite3_
2bcc0 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d  column_table_nam
2bcd0 65 7d 2c 0a 7b 20 22 73 71 6c 69 74 65 33 5f 63  e},.{ "sqlite3_c
2bce0 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d  olumn_origin_nam
2bcf0 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74 66  e",test_stmt_utf
2bd00 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  8,(void*)sqlite3
2bd10 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e  _column_origin_n
2bd20 61 6d 65 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69  ame},.#endif..#i
2bd30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2bd40 54 5f 55 54 46 31 36 0a 20 20 20 20 20 7b 20 22  T_UTF16.     { "
2bd50 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
2bd60 79 74 65 73 31 36 22 2c 20 74 65 73 74 5f 73 74  ytes16", test_st
2bd70 6d 74 5f 69 6e 74 2c 20 28 76 6f 69 64 2a 29 73  mt_int, (void*)s
2bd80 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
2bd90 74 65 73 31 36 20 7d 2c 0a 20 20 20 20 20 7b 20  tes16 },.     { 
2bda0 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
2bdb0 74 65 78 74 31 36 22 2c 20 20 74 65 73 74 5f 73  text16",  test_s
2bdc0 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f 69 64  tmt_utf16, (void
2bdd0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
2bde0 5f 74 65 78 74 31 36 7d 2c 0a 20 20 20 20 20 7b  _text16},.     {
2bdf0 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
2be00 5f 6e 61 6d 65 31 36 22 2c 20 20 74 65 73 74 5f  _name16",  test_
2be10 73 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f 69  stmt_utf16, (voi
2be20 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
2be30 6e 5f 6e 61 6d 65 31 36 7d 2c 0a 20 20 20 20 20  n_name16},.     
2be40 7b 20 22 61 64 64 5f 61 6c 69 67 6e 6d 65 6e 74  { "add_alignment
2be50 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73  _test_collations
2be60 22 2c 20 61 64 64 5f 61 6c 69 67 6e 6d 65 6e 74  ", add_alignment
2be70 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73  _test_collations
2be80 2c 20 30 20 20 20 20 20 20 7d 2c 0a 23 69 66 6e  , 0      },.#ifn
2be90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2bea0 44 45 43 4c 54 59 50 45 0a 20 20 20 20 20 7b 20  DECLTYPE.     { 
2beb0 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
2bec0 64 65 63 6c 74 79 70 65 31 36 22 2c 74 65 73 74  decltype16",test
2bed0 5f 73 74 6d 74 5f 75 74 66 31 36 2c 28 76 6f 69  _stmt_utf16,(voi
2bee0 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
2bef0 6e 5f 64 65 63 6c 74 79 70 65 31 36 7d 2c 0a 23  n_decltype16},.#
2bf00 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
2bf10 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
2bf20 4e 5f 4d 45 54 41 44 41 54 41 0a 7b 22 73 71 6c  N_METADATA.{"sql
2bf30 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61  ite3_column_data
2bf40 62 61 73 65 5f 6e 61 6d 65 31 36 22 2c 0a 20 20  base_name16",.  
2bf50 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c  test_stmt_utf16,
2bf60 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f   (void*)sqlite3_
2bf70 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f  column_database_
2bf80 6e 61 6d 65 31 36 7d 2c 0a 7b 22 73 71 6c 69 74  name16},.{"sqlit
2bf90 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f  e3_column_table_
2bfa0 6e 61 6d 65 31 36 22 2c 20 74 65 73 74 5f 73 74  name16", test_st
2bfb0 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f 69 64 2a  mt_utf16, (void*
2bfc0 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
2bfd0 74 61 62 6c 65 5f 6e 61 6d 65 31 36 7d 2c 0a 7b  table_name16},.{
2bfe0 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
2bff0 6f 72 69 67 69 6e 5f 6e 61 6d 65 31 36 22 2c 20  origin_name16", 
2c000 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c  test_stmt_utf16,
2c010 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f   (void*)sqlite3_
2c020 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61  column_origin_na
2c030 6d 65 31 36 7d 2c 0a 23 65 6e 64 69 66 0a 23 65  me16},.#endif.#e
2c040 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c  ndif.     { "sql
2c050 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
2c060 61 74 69 6f 6e 5f 76 32 22 2c 20 74 65 73 74 5f  ation_v2", test_
2c070 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
2c080 5f 76 32 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b  _v2, 0 },.     {
2c090 20 22 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c   "sqlite3_global
2c0a0 5f 72 65 63 6f 76 65 72 22 2c 20 20 20 20 20 74  _recover",     t
2c0b0 65 73 74 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76  est_global_recov
2c0c0 65 72 2c 20 30 20 20 20 7d 2c 0a 20 20 20 20 20  er, 0   },.     
2c0d0 7b 20 22 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74  { "working_64bit
2c0e0 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  _int",          
2c0f0 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e  working_64bit_in
2c100 74 2c 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20  t,   0   },.    
2c110 20 7b 20 22 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74   { "vfs_unlink_t
2c120 65 73 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  est",           
2c130 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74   vfs_unlink_test
2c140 2c 20 20 20 20 20 30 20 20 20 7d 2c 0a 20 20 20  ,     0   },.   
2c150 20 20 7b 20 22 76 66 73 5f 69 6e 69 74 66 61 69    { "vfs_initfai
2c160 6c 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20 20  l_test",        
2c170 20 20 76 66 73 5f 69 6e 69 74 66 61 69 6c 5f 74    vfs_initfail_t
2c180 65 73 74 2c 20 20 20 30 20 20 20 7d 2c 0a 20 20  est,   0   },.  
2c190 20 20 20 7b 20 22 76 66 73 5f 75 6e 72 65 67 69     { "vfs_unregi
2c1a0 73 74 65 72 5f 61 6c 6c 22 2c 20 20 20 20 20 20  ster_all",      
2c1b0 20 20 20 76 66 73 5f 75 6e 72 65 67 69 73 74 65     vfs_unregiste
2c1c0 72 5f 61 6c 6c 2c 20 20 30 20 20 20 7d 2c 0a 20  r_all,  0   },. 
2c1d0 20 20 20 20 7b 20 22 76 66 73 5f 72 65 72 65 67      { "vfs_rereg
2c1e0 69 73 74 65 72 5f 61 6c 6c 22 2c 20 20 20 20 20  ister_all",     
2c1f0 20 20 20 20 76 66 73 5f 72 65 72 65 67 69 73 74      vfs_reregist
2c200 65 72 5f 61 6c 6c 2c 20 20 30 20 20 20 7d 2c 0a  er_all,  0   },.
2c210 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e       { "file_con
2c220 74 72 6f 6c 5f 74 65 73 74 22 2c 20 20 20 20 20  trol_test",     
2c230 20 20 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f       file_contro
2c240 6c 5f 74 65 73 74 2c 20 20 20 30 20 20 20 7d 2c  l_test,   0   },
2c250 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f  .     { "file_co
2c260 6e 74 72 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f 5f  ntrol_lasterrno_
2c270 74 65 73 74 22 2c 20 66 69 6c 65 5f 63 6f 6e 74  test", file_cont
2c280 72 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f 5f 74 65  rol_lasterrno_te
2c290 73 74 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20 20  st,  0   },.    
2c2a0 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c   { "file_control
2c2b0 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74 22  _lockproxy_test"
2c2c0 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c  , file_control_l
2c2d0 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74 2c 20 20  ockproxy_test,  
2c2e0 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66  0   },.     { "f
2c2f0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e  ile_control_chun
2c300 6b 73 69 7a 65 5f 74 65 73 74 22 2c 20 66 69 6c  ksize_test", fil
2c310 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73  e_control_chunks
2c320 69 7a 65 5f 74 65 73 74 2c 20 20 30 20 20 20 7d  ize_test,  0   }
2c330 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63  ,.     { "file_c
2c340 6f 6e 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f  ontrol_sizehint_
2c350 74 65 73 74 22 2c 20 20 66 69 6c 65 5f 63 6f 6e  test",  file_con
2c360 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74 65  trol_sizehint_te
2c370 73 74 2c 20 20 20 30 20 20 20 7d 2c 0a 20 20 20  st,   0   },.   
2c380 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f    { "file_contro
2c390 6c 5f 77 69 6e 33 32 5f 61 76 5f 72 65 74 72 79  l_win32_av_retry
2c3a0 22 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  ", file_control_
2c3b0 77 69 6e 33 32 5f 61 76 5f 72 65 74 72 79 2c 20  win32_av_retry, 
2c3c0 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   0   },.     { "
2c3d0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72  file_control_per
2c3e0 73 69 73 74 5f 77 61 6c 22 2c 20 20 20 20 66 69  sist_wal",    fi
2c3f0 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72 73 69  le_control_persi
2c400 73 74 5f 77 61 6c 2c 20 20 20 20 20 30 20 20 20  st_wal,     0   
2c410 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f  },.     { "file_
2c420 63 6f 6e 74 72 6f 6c 5f 70 6f 77 65 72 73 61 66  control_powersaf
2c430 65 5f 6f 76 65 72 77 72 69 74 65 22 2c 66 69 6c  e_overwrite",fil
2c440 65 5f 63 6f 6e 74 72 6f 6c 5f 70 6f 77 65 72 73  e_control_powers
2c450 61 66 65 5f 6f 76 65 72 77 72 69 74 65 2c 30 7d  afe_overwrite,0}
2c460 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63  ,.     { "file_c
2c470 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d 65 22 2c  ontrol_vfsname",
2c480 20 20 20 20 20 20 20 20 66 69 6c 65 5f 63 6f 6e          file_con
2c490 74 72 6f 6c 5f 76 66 73 6e 61 6d 65 2c 20 20 20  trol_vfsname,   
2c4a0 20 20 20 20 20 20 30 20 20 20 7d 2c 0a 20 20 20        0   },.   
2c4b0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 76 66 73    { "sqlite3_vfs
2c4c0 5f 6c 69 73 74 22 2c 20 20 20 20 20 20 20 20 20  _list",         
2c4d0 20 20 76 66 73 5f 6c 69 73 74 2c 20 20 20 20 20    vfs_list,     
2c4e0 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  0   },.     { "s
2c4f0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
2c500 6e 63 74 69 6f 6e 5f 76 32 22 2c 20 74 65 73 74  nction_v2", test
2c510 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
2c520 5f 76 32 2c 20 30 20 7d 2c 0a 0a 20 20 20 20 20  _v2, 0 },..     
2c530 2f 2a 20 46 75 6e 63 74 69 6f 6e 73 20 66 72 6f  /* Functions fro
2c540 6d 20 6f 73 2e 68 20 2a 2f 0a 23 69 66 6e 64 65  m os.h */.#ifnde
2c550 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
2c560 46 31 36 0a 20 20 20 20 20 7b 20 22 61 64 64 5f  F16.     { "add_
2c570 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 20  test_collate",  
2c580 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 6c 61        test_colla
2c590 74 65 2c 20 30 20 20 20 20 20 20 20 20 20 20 20  te, 0           
2c5a0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64 64 5f   },.     { "add_
2c5b0 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65  test_collate_nee
2c5c0 64 65 64 22 2c 20 74 65 73 74 5f 63 6f 6c 6c 61  ded", test_colla
2c5d0 74 65 5f 6e 65 65 64 65 64 2c 20 30 20 20 20 20  te_needed, 0    
2c5e0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64 64 5f   },.     { "add_
2c5f0 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20  test_function", 
2c600 20 20 20 20 20 20 74 65 73 74 5f 66 75 6e 63 74        test_funct
2c610 69 6f 6e 2c 20 30 20 20 20 20 20 20 20 20 20 20  ion, 0          
2c620 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20   },.#endif.     
2c630 7b 20 22 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  { "sqlite3_test_
2c640 65 72 72 73 74 72 22 2c 20 20 20 20 20 74 65 73  errstr",     tes
2c650 74 5f 65 72 72 73 74 72 2c 20 30 20 20 20 20 20  t_errstr, 0     
2c660 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
2c670 7b 20 22 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f  { "tcl_variable_
2c680 74 79 70 65 22 2c 20 20 20 20 20 20 20 74 63 6c  type",       tcl
2c690 5f 76 61 72 69 61 62 6c 65 5f 74 79 70 65 2c 20  _variable_type, 
2c6a0 30 20 20 20 20 20 20 20 7d 2c 0a 23 69 66 6e 64  0       },.#ifnd
2c6b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
2c6c0 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20  HARED_CACHE.    
2c6d0 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 6e 61 62   { "sqlite3_enab
2c6e0 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 22  le_shared_cache"
2c6f0 2c 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f 73 68  , test_enable_sh
2c700 61 72 65 64 2c 20 30 20 20 7d 2c 0a 20 20 20 20  ared, 0  },.    
2c710 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 68 61 72   { "sqlite3_shar
2c720 65 64 5f 63 61 63 68 65 5f 72 65 70 6f 72 74 22  ed_cache_report"
2c730 2c 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 68  , sqlite3BtreeSh
2c740 61 72 65 64 43 61 63 68 65 52 65 70 6f 72 74 2c  aredCacheReport,
2c750 20 30 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20   0},.#endif.    
2c760 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c 69 62 76   { "sqlite3_libv
2c770 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 22 2c 20  ersion_number", 
2c780 74 65 73 74 5f 6c 69 62 76 65 72 73 69 6f 6e 5f  test_libversion_
2c790 6e 75 6d 62 65 72 2c 20 30 20 20 7d 2c 0a 23 69  number, 0  },.#i
2c7a0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
2c7b0 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
2c7c0 54 41 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  TA.     { "sqlit
2c7d0 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  e3_table_column_
2c7e0 6d 65 74 61 64 61 74 61 22 2c 20 74 65 73 74 5f  metadata", test_
2c7f0 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
2c800 61 64 61 74 61 2c 20 30 20 20 7d 2c 0a 23 65 6e  adata, 0  },.#en
2c810 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
2c820 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
2c830 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2c840 5f 62 6c 6f 62 5f 72 65 61 64 22 2c 20 20 20 74  _blob_read",   t
2c850 65 73 74 5f 62 6c 6f 62 5f 72 65 61 64 2c 20 30  est_blob_read, 0
2c860 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2c870 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 22  ite3_blob_write"
2c880 2c 20 20 74 65 73 74 5f 62 6c 6f 62 5f 77 72 69  ,  test_blob_wri
2c890 74 65 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b  te, 0  },.     {
2c8a0 20 22 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72   "sqlite3_blob_r
2c8b0 65 6f 70 65 6e 22 2c 20 74 65 73 74 5f 62 6c 6f  eopen", test_blo
2c8c0 62 5f 72 65 6f 70 65 6e 2c 20 30 20 20 7d 2c 0a  b_reopen, 0  },.
2c8d0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2c8e0 62 6c 6f 62 5f 62 79 74 65 73 22 2c 20 20 74 65  blob_bytes",  te
2c8f0 73 74 5f 62 6c 6f 62 5f 62 79 74 65 73 2c 20 30  st_blob_bytes, 0
2c900 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2c910 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 22  ite3_blob_close"
2c920 2c 20 20 74 65 73 74 5f 62 6c 6f 62 5f 63 6c 6f  ,  test_blob_clo
2c930 73 65 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66  se, 0  },.#endif
2c940 0a 20 20 20 20 20 7b 20 22 70 63 61 63 68 65 5f  .     { "pcache_
2c950 73 74 61 74 73 22 2c 20 20 20 20 20 20 20 74 65  stats",       te
2c960 73 74 5f 70 63 61 63 68 65 5f 73 74 61 74 73 2c  st_pcache_stats,
2c970 20 30 20 20 7d 2c 0a 23 69 66 64 65 66 20 53 51   0  },.#ifdef SQ
2c980 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f  LITE_ENABLE_UNLO
2c990 43 4b 5f 4e 4f 54 49 46 59 0a 20 20 20 20 20 7b  CK_NOTIFY.     {
2c9a0 20 22 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b   "sqlite3_unlock
2c9b0 5f 6e 6f 74 69 66 79 22 2c 20 74 65 73 74 5f 75  _notify", test_u
2c9c0 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 2c 20 30 20  nlock_notify, 0 
2c9d0 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20   },.#endif.     
2c9e0 7b 20 22 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  { "sqlite3_wal_c
2c9f0 68 65 63 6b 70 6f 69 6e 74 22 2c 20 20 20 74 65  heckpoint",   te
2ca00 73 74 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  st_wal_checkpoin
2ca10 74 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20  t, 0  },.     { 
2ca20 22 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65  "sqlite3_wal_che
2ca30 63 6b 70 6f 69 6e 74 5f 76 32 22 2c 74 65 73 74  ckpoint_v2",test
2ca40 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f  _wal_checkpoint_
2ca50 76 32 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b  v2, 0  },.     {
2ca60 20 22 74 65 73 74 5f 73 71 6c 69 74 65 33 5f 6c   "test_sqlite3_l
2ca70 6f 67 22 2c 20 20 20 20 20 20 20 20 20 74 65 73  og",         tes
2ca80 74 5f 73 71 6c 69 74 65 33 5f 6c 6f 67 2c 20 30  t_sqlite3_log, 0
2ca90 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c    },.#ifndef SQL
2caa0 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
2cab0 0a 20 20 20 20 20 7b 20 22 70 72 69 6e 74 5f 65  .     { "print_e
2cac0 78 70 6c 61 69 6e 5f 71 75 65 72 79 5f 70 6c 61  xplain_query_pla
2cad0 6e 22 2c 20 74 65 73 74 5f 70 72 69 6e 74 5f 65  n", test_print_e
2cae0 71 70 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66  qp, 0  },.#endif
2caf0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2cb00 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 22 2c 20  _test_control", 
2cb10 74 65 73 74 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  test_test_contro
2cb20 6c 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74  l },.  };.  stat
2cb30 69 63 20 69 6e 74 20 62 69 74 6d 61 73 6b 5f 73  ic int bitmask_s
2cb40 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 42 69 74  ize = sizeof(Bit
2cb50 6d 61 73 6b 29 2a 38 3b 0a 20 20 69 6e 74 20 69  mask)*8;.  int i
2cb60 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
2cb70 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
2cb80 74 2c 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73  t, sqlite3_fulls
2cb90 79 6e 63 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74  ync_count;.  ext
2cba0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
2cbb0 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 3b 0a  opentemp_count;.
2cbc0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
2cbd0 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 3b  ite3_like_count;
2cbe0 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
2cbf0 6c 69 74 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f  lite3_xferopt_co
2cc00 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  unt;.  extern in
2cc10 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
2cc20 72 65 61 64 64 62 5f 63 6f 75 6e 74 3b 0a 20 20  readdb_count;.  
2cc30 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
2cc40 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
2cc50 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e  _count;.  extern
2cc60 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67   int sqlite3_pag
2cc70 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 3b  er_writej_count;
2cc80 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
2cc90 49 4e 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  IN.  extern int 
2cca0 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 3b  sqlite3_os_type;
2ccb0 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
2ccc0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 65 78  QLITE_DEBUG.  ex
2ccd0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
2cce0 57 68 65 72 65 54 72 61 63 65 3b 0a 20 20 65 78  WhereTrace;.  ex
2ccf0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
2cd00 4f 53 54 72 61 63 65 3b 0a 20 20 65 78 74 65 72  OSTrace;.  exter
2cd10 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  n int sqlite3Vdb
2cd20 65 41 64 64 6f 70 54 72 61 63 65 3b 0a 20 20 65  eAddopTrace;.  e
2cd30 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
2cd40 33 57 61 6c 54 72 61 63 65 3b 0a 23 65 6e 64 69  3WalTrace;.#endi
2cd50 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
2cd60 54 45 53 54 0a 20 20 65 78 74 65 72 6e 20 63 68  TEST.  extern ch
2cd70 61 72 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79  ar sqlite3_query
2cd80 5f 70 6c 61 6e 5b 5d 3b 0a 20 20 73 74 61 74 69  _plan[];.  stati
2cd90 63 20 63 68 61 72 20 2a 71 75 65 72 79 5f 70 6c  c char *query_pl
2cda0 61 6e 20 3d 20 73 71 6c 69 74 65 33 5f 71 75 65  an = sqlite3_que
2cdb0 72 79 5f 70 6c 61 6e 3b 0a 23 69 66 64 65 66 20  ry_plan;.#ifdef 
2cdc0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
2cdd0 53 33 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  S3.  extern int 
2cde0 73 71 6c 69 74 65 33 5f 66 74 73 33 5f 65 6e 61  sqlite3_fts3_ena
2cdf0 62 6c 65 5f 70 61 72 65 6e 74 68 65 73 65 73 3b  ble_parentheses;
2ce00 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a  .#endif.#endif..
2ce10 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
2ce20 65 6f 66 28 61 43 6d 64 29 2f 73 69 7a 65 6f 66  eof(aCmd)/sizeof
2ce30 28 61 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b  (aCmd[0]); i++){
2ce40 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 43  .    Tcl_CreateC
2ce50 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 61  ommand(interp, a
2ce60 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 43  Cmd[i].zName, aC
2ce70 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 30 2c 20  md[i].xProc, 0, 
2ce80 30 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  0);.  }.  for(i=
2ce90 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f 62 6a  0; i<sizeof(aObj
2cea0 43 6d 64 29 2f 73 69 7a 65 6f 66 28 61 4f 62 6a  Cmd)/sizeof(aObj
2ceb0 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  Cmd[0]); i++){. 
2cec0 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
2ced0 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
2cee0 61 4f 62 6a 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65  aObjCmd[i].zName
2cef0 2c 20 0a 20 20 20 20 20 20 20 20 61 4f 62 6a 43  , .        aObjC
2cf00 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 61 4f 62  md[i].xProc, aOb
2cf10 6a 43 6d 64 5b 69 5d 2e 63 6c 69 65 6e 74 44 61  jCmd[i].clientDa
2cf20 74 61 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 54 63  ta, 0);.  }.  Tc
2cf30 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
2cf40 2c 20 22 73 71 6c 69 74 65 5f 73 65 61 72 63 68  , "sqlite_search
2cf50 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20  _count", .      
2cf60 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
2cf70 73 65 61 72 63 68 5f 63 6f 75 6e 74 2c 20 54 43  search_count, TC
2cf80 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54  L_LINK_INT);.  T
2cf90 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
2cfa0 70 2c 20 22 73 71 6c 69 74 65 5f 66 6f 75 6e 64  p, "sqlite_found
2cfb0 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20  _count", .      
2cfc0 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
2cfd0 66 6f 75 6e 64 5f 63 6f 75 6e 74 2c 20 54 43 4c  found_count, TCL
2cfe0 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
2cff0 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
2d000 2c 20 22 73 71 6c 69 74 65 5f 73 6f 72 74 5f 63  , "sqlite_sort_c
2d010 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63  ount", .      (c
2d020 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 73 6f  har*)&sqlite3_so
2d030 72 74 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49  rt_count, TCL_LI
2d040 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c  NK_INT);.  Tcl_L
2d050 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
2d060 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62  sqlite3_max_blob
2d070 73 69 7a 65 22 2c 20 0a 20 20 20 20 20 20 28 63  size", .      (c
2d080 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6d 61  har*)&sqlite3_ma
2d090 78 5f 62 6c 6f 62 73 69 7a 65 2c 20 54 43 4c 5f  x_blobsize, TCL_
2d0a0 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
2d0b0 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
2d0c0 20 22 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f   "sqlite_like_co
2d0d0 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68  unt", .      (ch
2d0e0 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6c 69 6b  ar*)&sqlite3_lik
2d0f0 65 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  e_count, TCL_LIN
2d100 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
2d110 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
2d120 71 6c 69 74 65 5f 69 6e 74 65 72 72 75 70 74 5f  qlite_interrupt_
2d130 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28  count", .      (
2d140 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 69  char*)&sqlite3_i
2d150 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 2c 20  nterrupt_count, 
2d160 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
2d170 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
2d180 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 65  erp, "sqlite_ope
2d190 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 22 2c 20 0a  n_file_count", .
2d1a0 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
2d1b0 6c 69 74 65 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f  lite3_open_file_
2d1c0 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  count, TCL_LINK_
2d1d0 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  INT);.  Tcl_Link
2d1e0 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
2d1f0 69 74 65 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  ite_current_time
2d200 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a  ", .      (char*
2d210 29 26 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  )&sqlite3_curren
2d220 74 5f 74 69 6d 65 2c 20 54 43 4c 5f 4c 49 4e 4b  t_time, TCL_LINK
2d230 5f 49 4e 54 29 3b 0a 23 69 66 20 53 51 4c 49 54  _INT);.#if SQLIT
2d240 45 5f 4f 53 5f 55 4e 49 58 20 26 26 20 64 65 66  E_OS_UNIX && def
2d250 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
2d260 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
2d270 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
2d280 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
2d290 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 68 6f 73  erp, "sqlite_hos
2d2a0 74 69 64 5f 6e 75 6d 22 2c 20 0a 20 20 20 20 20  tid_num", .     
2d2b0 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
2d2c0 5f 68 6f 73 74 69 64 5f 6e 75 6d 2c 20 54 43 4c  _hostid_num, TCL
2d2d0 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64  _LINK_INT);.#end
2d2e0 69 66 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  if.  Tcl_LinkVar
2d2f0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
2d300 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 22  3_xferopt_count"
2d310 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
2d320 73 71 6c 69 74 65 33 5f 78 66 65 72 6f 70 74 5f  sqlite3_xferopt_
2d330 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  count, TCL_LINK_
2d340 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  INT);.  Tcl_Link
2d350 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
2d360 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64  ite3_pager_readd
2d370 62 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20  b_count",.      
2d380 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
2d390 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75  pager_readdb_cou
2d3a0 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  nt, TCL_LINK_INT
2d3b0 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
2d3c0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
2d3d0 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
2d3e0 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63  count",.      (c
2d3f0 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 70 61  har*)&sqlite3_pa
2d400 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
2d410 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  t, TCL_LINK_INT)
2d420 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
2d430 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33  interp, "sqlite3
2d440 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
2d450 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61  unt",.      (cha
2d460 72 2a 29 26 73 71 6c 69 74 65 33 5f 70 61 67 65  r*)&sqlite3_page
2d470 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 2c 20  r_writej_count, 
2d480 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23  TCL_LINK_INT);.#
2d490 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2d4a0 49 54 5f 55 54 46 31 36 0a 20 20 54 63 6c 5f 4c  IT_UTF16.  Tcl_L
2d4b0 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
2d4c0 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67  unaligned_string
2d4d0 5f 63 6f 75 6e 74 65 72 22 2c 0a 20 20 20 20 20  _counter",.     
2d4e0 20 28 63 68 61 72 2a 29 26 75 6e 61 6c 69 67 6e   (char*)&unalign
2d4f0 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65  ed_string_counte
2d500 72 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  r, TCL_LINK_INT)
2d510 3b 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  ;.#endif.#ifndef
2d520 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
2d530 31 36 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  16.  Tcl_LinkVar
2d540 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
2d550 5f 6c 61 73 74 5f 6e 65 65 64 65 64 5f 63 6f 6c  _last_needed_col
2d560 6c 61 74 69 6f 6e 22 2c 0a 20 20 20 20 20 20 28  lation",.      (
2d570 63 68 61 72 2a 29 26 70 7a 4e 65 65 64 65 64 43  char*)&pzNeededC
2d580 6f 6c 6c 61 74 69 6f 6e 2c 20 54 43 4c 5f 4c 49  ollation, TCL_LI
2d590 4e 4b 5f 53 54 52 49 4e 47 7c 54 43 4c 5f 4c 49  NK_STRING|TCL_LI
2d5a0 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a 23  NK_READ_ONLY);.#
2d5b0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
2d5c0 5f 4f 53 5f 57 49 4e 0a 20 20 54 63 6c 5f 4c 69  _OS_WIN.  Tcl_Li
2d5d0 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
2d5e0 71 6c 69 74 65 5f 6f 73 5f 74 79 70 65 22 2c 0a  qlite_os_type",.
2d5f0 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
2d600 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20 54  lite3_os_type, T
2d610 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65  CL_LINK_INT);.#e
2d620 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
2d630 54 45 5f 54 45 53 54 0a 20 20 54 63 6c 5f 4c 69  TE_TEST.  Tcl_Li
2d640 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
2d650 71 6c 69 74 65 5f 71 75 65 72 79 5f 70 6c 61 6e  qlite_query_plan
2d660 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
2d670 26 71 75 65 72 79 5f 70 6c 61 6e 2c 20 54 43 4c  &query_plan, TCL
2d680 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 7c 54 43 4c  _LINK_STRING|TCL
2d690 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59 29  _LINK_READ_ONLY)
2d6a0 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
2d6b0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 54  SQLITE_DEBUG.  T
2d6c0 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
2d6d0 70 2c 20 22 73 71 6c 69 74 65 5f 61 64 64 6f 70  p, "sqlite_addop
2d6e0 5f 74 72 61 63 65 22 2c 0a 20 20 20 20 20 20 28  _trace",.      (
2d6f0 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 56 64  char*)&sqlite3Vd
2d700 62 65 41 64 64 6f 70 54 72 61 63 65 2c 20 54 43  beAddopTrace, TC
2d710 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54  L_LINK_INT);.  T
2d720 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
2d730 70 2c 20 22 73 71 6c 69 74 65 5f 77 68 65 72 65  p, "sqlite_where
2d740 5f 74 72 61 63 65 22 2c 0a 20 20 20 20 20 20 28  _trace",.      (
2d750 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 57 68  char*)&sqlite3Wh
2d760 65 72 65 54 72 61 63 65 2c 20 54 43 4c 5f 4c 49  ereTrace, TCL_LI
2d770 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c  NK_INT);.  Tcl_L
2d780 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
2d790 73 71 6c 69 74 65 5f 6f 73 5f 74 72 61 63 65 22  sqlite_os_trace"
2d7a0 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
2d7b0 73 71 6c 69 74 65 33 4f 53 54 72 61 63 65 2c 20  sqlite3OSTrace, 
2d7c0 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23  TCL_LINK_INT);.#
2d7d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2d7e0 49 54 5f 57 41 4c 0a 20 20 54 63 6c 5f 4c 69 6e  IT_WAL.  Tcl_Lin
2d7f0 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
2d800 6c 69 74 65 5f 77 61 6c 5f 74 72 61 63 65 22 2c  lite_wal_trace",
2d810 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
2d820 71 6c 69 74 65 33 57 61 6c 54 72 61 63 65 2c 20  qlite3WalTrace, 
2d830 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23  TCL_LINK_INT);.#
2d840 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66  endif.#endif.#if
2d850 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2d860 5f 44 49 53 4b 49 4f 0a 20 20 54 63 6c 5f 4c 69  _DISKIO.  Tcl_Li
2d870 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
2d880 71 6c 69 74 65 5f 6f 70 65 6e 74 65 6d 70 5f 63  qlite_opentemp_c
2d890 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68  ount",.      (ch
2d8a0 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 70 65  ar*)&sqlite3_ope
2d8b0 6e 74 65 6d 70 5f 63 6f 75 6e 74 2c 20 54 43 4c  ntemp_count, TCL
2d8c0 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64  _LINK_INT);.#end
2d8d0 69 66 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  if.  Tcl_LinkVar
2d8e0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
2d8f0 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c  _static_bind_val
2d900 75 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  ue",.      (char
2d910 2a 29 26 73 71 6c 69 74 65 5f 73 74 61 74 69 63  *)&sqlite_static
2d920 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 20 54 43 4c  _bind_value, TCL
2d930 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a 20  _LINK_STRING);. 
2d940 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
2d950 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 74 61  erp, "sqlite_sta
2d960 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65 22 2c  tic_bind_nbyte",
2d970 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
2d980 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e  qlite_static_bin
2d990 64 5f 6e 62 79 74 65 2c 20 54 43 4c 5f 4c 49 4e  d_nbyte, TCL_LIN
2d9a0 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
2d9b0 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
2d9c0 71 6c 69 74 65 5f 74 65 6d 70 5f 64 69 72 65 63  qlite_temp_direc
2d9d0 74 6f 72 79 22 2c 0a 20 20 20 20 20 20 28 63 68  tory",.      (ch
2d9e0 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 74 65 6d  ar*)&sqlite3_tem
2d9f0 70 5f 64 69 72 65 63 74 6f 72 79 2c 20 54 43 4c  p_directory, TCL
2da00 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a 20  _LINK_STRING);. 
2da10 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
2da20 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 64 61 74  erp, "sqlite_dat
2da30 61 5f 64 69 72 65 63 74 6f 72 79 22 2c 0a 20 20  a_directory",.  
2da40 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
2da50 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
2da60 72 79 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52  ry, TCL_LINK_STR
2da70 49 4e 47 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  ING);.  Tcl_Link
2da80 56 61 72 28 69 6e 74 65 72 70 2c 20 22 62 69 74  Var(interp, "bit
2da90 6d 61 73 6b 5f 73 69 7a 65 22 2c 0a 20 20 20 20  mask_size",.    
2daa0 20 20 28 63 68 61 72 2a 29 26 62 69 74 6d 61 73    (char*)&bitmas
2dab0 6b 5f 73 69 7a 65 2c 20 54 43 4c 5f 4c 49 4e 4b  k_size, TCL_LINK
2dac0 5f 49 4e 54 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45  _INT|TCL_LINK_RE
2dad0 41 44 5f 4f 4e 4c 59 29 3b 0a 20 20 54 63 6c 5f  AD_ONLY);.  Tcl_
2dae0 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
2daf0 22 73 71 6c 69 74 65 5f 73 79 6e 63 5f 63 6f 75  "sqlite_sync_cou
2db00 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  nt",.      (char
2db10 2a 29 26 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f  *)&sqlite3_sync_
2db20 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  count, TCL_LINK_
2db30 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  INT);.  Tcl_Link
2db40 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
2db50 69 74 65 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  ite_fullsync_cou
2db60 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  nt",.      (char
2db70 2a 29 26 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73  *)&sqlite3_fulls
2db80 79 6e 63 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c  ync_count, TCL_L
2db90 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66 20 64 65  INK_INT);.#if de
2dba0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
2dbb0 42 4c 45 5f 46 54 53 33 29 20 26 26 20 64 65 66  BLE_FTS3) && def
2dbc0 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
2dbd0 29 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ).  Tcl_LinkVar(
2dbe0 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
2dbf0 66 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65  fts3_enable_pare
2dc00 6e 74 68 65 73 65 73 22 2c 0a 20 20 20 20 20 20  ntheses",.      
2dc10 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
2dc20 66 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65  fts3_enable_pare
2dc30 6e 74 68 65 73 65 73 2c 20 54 43 4c 5f 4c 49 4e  ntheses, TCL_LIN
2dc40 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 20  K_INT);.#endif. 
2dc50 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2dc60 7d 0a                                            }.