/ Hex Artifact Content
Login

Artifact 43c87e52cb504e8c9928b1e9bad21a6117c695e9:


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 65 78 74 65 72 6e  CL_OK;.}..extern
0ae0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c   const char *sql
0af0: 69 74 65 33 45 72 72 4e 61 6d 65 28 69 6e 74 29  ite3ErrName(int)
0b00: 3b 0a 23 64 65 66 69 6e 65 20 74 31 45 72 72 6f  ;.#define t1Erro
0b10: 72 4e 61 6d 65 20 73 71 6c 69 74 65 33 45 72 72  rName sqlite3Err
0b20: 4e 61 6d 65 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  Name../*.** Conv
0b30: 65 72 74 20 61 6e 20 73 71 6c 69 74 65 33 5f 73  ert an sqlite3_s
0b40: 74 6d 74 2a 20 69 6e 74 6f 20 61 6e 20 73 71 6c  tmt* into an sql
0b50: 69 74 65 33 2a 2e 20 20 54 68 69 73 20 64 65 70  ite3*.  This dep
0b60: 65 6e 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 66  ends on the.** f
0b70: 61 63 74 20 74 68 61 74 20 74 68 65 20 73 71 6c  act that the sql
0b80: 69 74 65 33 2a 20 69 73 20 74 68 65 20 66 69 72  ite3* is the fir
0b90: 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20  st field in the 
0ba0: 56 64 62 65 20 73 74 72 75 63 74 75 72 65 2e 0a  Vdbe structure..
0bb0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 74 6d 74 54  */.#define StmtT
0bc0: 6f 44 62 28 58 29 20 20 20 73 71 6c 69 74 65 33  oDb(X)   sqlite3
0bd0: 5f 64 62 5f 68 61 6e 64 6c 65 28 58 29 0a 0a 2f  _db_handle(X)../
0be0: 2a 0a 2a 2a 20 43 68 65 63 6b 20 61 20 72 65 74  *.** Check a ret
0bf0: 75 72 6e 20 76 61 6c 75 65 20 74 6f 20 6d 61 6b  urn value to mak
0c00: 65 20 73 75 72 65 20 69 74 20 61 67 72 65 65 73  e sure it agrees
0c10: 20 77 69 74 68 20 74 68 65 20 72 65 73 75 6c 74   with the result
0c20: 73 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65  s.** from sqlite
0c30: 33 5f 65 72 72 63 6f 64 65 2e 0a 2a 2f 0a 69 6e  3_errcode..*/.in
0c40: 74 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  t sqlite3TestErr
0c50: 43 6f 64 65 28 54 63 6c 5f 49 6e 74 65 72 70 20  Code(Tcl_Interp 
0c60: 2a 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  *interp, sqlite3
0c70: 20 2a 64 62 2c 20 69 6e 74 20 72 63 29 7b 0a 20   *db, int rc){. 
0c80: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 68 72   if( sqlite3_thr
0c90: 65 61 64 73 61 66 65 28 29 3d 3d 30 20 26 26 20  eadsafe()==0 && 
0ca0: 72 63 21 3d 53 51 4c 49 54 45 5f 4d 49 53 55 53  rc!=SQLITE_MISUS
0cb0: 45 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  E && rc!=SQLITE_
0cc0: 4f 4b 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  OK.   && sqlite3
0cd0: 5f 65 72 72 63 6f 64 65 28 64 62 29 21 3d 72 63  _errcode(db)!=rc
0ce0: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75   ){.    char zBu
0cf0: 66 5b 32 30 30 5d 3b 0a 20 20 20 20 69 6e 74 20  f[200];.    int 
0d00: 72 32 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72  r2 = sqlite3_err
0d10: 63 6f 64 65 28 64 62 29 3b 0a 20 20 20 20 73 70  code(db);.    sp
0d20: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 65 72 72  rintf(zBuf, "err
0d30: 6f 72 20 63 6f 64 65 20 25 73 20 28 25 64 29 20  or code %s (%d) 
0d40: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 73  does not match s
0d50: 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 20 25  qlite3_errcode %
0d60: 73 20 28 25 64 29 22 2c 0a 20 20 20 20 20 20 20  s (%d)",.       
0d70: 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  t1ErrorName(rc),
0d80: 20 72 63 2c 20 74 31 45 72 72 6f 72 4e 61 6d 65   rc, t1ErrorName
0d90: 28 72 32 29 2c 20 72 32 29 3b 0a 20 20 20 20 54  (r2), r2);.    T
0da0: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
0db0: 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
0dc0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
0dd0: 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  erp, zBuf, 0);. 
0de0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
0df0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
0e00: 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 70  /*.** Decode a p
0e10: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
0e20: 69 74 65 33 5f 73 74 6d 74 20 6f 62 6a 65 63 74  ite3_stmt object
0e30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
0e40: 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 0a  getStmtPointer(.
0e50: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
0e60: 74 65 72 70 2c 20 0a 20 20 63 6f 6e 73 74 20 63  terp, .  const c
0e70: 68 61 72 20 2a 7a 41 72 67 2c 20 20 0a 20 20 73  har *zArg,  .  s
0e80: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70  qlite3_stmt **pp
0e90: 53 74 6d 74 0a 29 7b 0a 20 20 2a 70 70 53 74 6d  Stmt.){.  *ppStm
0ea0: 74 20 3d 20 28 73 71 6c 69 74 65 33 5f 73 74 6d  t = (sqlite3_stm
0eb0: 74 2a 29 73 71 6c 69 74 65 33 54 65 73 74 54 65  t*)sqlite3TestTe
0ec0: 78 74 54 6f 50 74 72 28 7a 41 72 67 29 3b 0a 20  xtToPtr(zArg);. 
0ed0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
0ee0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
0ef0: 65 20 61 20 74 65 78 74 20 72 65 70 72 65 73 65  e a text represe
0f00: 6e 74 61 74 69 6f 6e 20 6f 66 20 61 20 70 6f 69  ntation of a poi
0f10: 6e 74 65 72 20 74 68 61 74 20 63 61 6e 20 62 65  nter that can be
0f20: 20 75 6e 64 65 72 73 74 6f 6f 64 0a 2a 2a 20 62   understood.** b
0f30: 79 20 74 68 65 20 67 65 74 44 62 50 6f 69 6e 74  y the getDbPoint
0f40: 65 72 20 61 6e 64 20 67 65 74 56 6d 50 6f 69 6e  er and getVmPoin
0f50: 74 65 72 20 72 6f 75 74 69 6e 65 73 20 61 62 6f  ter routines abo
0f60: 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72  ve..**.** The pr
0f70: 6f 62 6c 65 6d 20 69 73 2c 20 6f 6e 20 73 6f 6d  oblem is, on som
0f80: 65 20 6d 61 63 68 69 6e 65 73 20 28 53 6f 6c 61  e machines (Sola
0f90: 72 69 73 29 20 69 66 20 79 6f 75 20 64 6f 20 61  ris) if you do a
0fa0: 20 70 72 69 6e 74 66 20 77 69 74 68 0a 2a 2a 20   printf with.** 
0fb0: 22 25 70 22 20 79 6f 75 20 63 61 6e 6e 6f 74 20  "%p" you cannot 
0fc0: 74 75 72 6e 20 61 72 6f 75 6e 64 20 61 6e 64 20  turn around and 
0fd0: 64 6f 20 61 20 73 63 61 6e 66 20 77 69 74 68 20  do a scanf with 
0fe0: 74 68 65 20 73 61 6d 65 20 22 25 70 22 20 61 6e  the same "%p" an
0ff0: 64 0a 2a 2a 20 67 65 74 20 79 6f 75 72 20 70 6f  d.** get your po
1000: 69 6e 74 65 72 20 62 61 63 6b 2e 20 20 59 6f 75  inter back.  You
1010: 20 68 61 76 65 20 74 6f 20 70 72 65 70 65 6e 64   have to prepend
1020: 20 61 20 22 30 78 22 20 62 65 66 6f 72 65 20 69   a "0x" before i
1030: 74 20 77 69 6c 6c 0a 2a 2a 20 77 6f 72 6b 2e 20  t will.** work. 
1040: 20 4f 72 20 61 74 20 6c 65 61 73 74 20 74 68 61   Or at least tha
1050: 74 20 69 73 20 77 68 61 74 20 69 73 20 72 65 70  t is what is rep
1060: 6f 72 74 65 64 20 74 6f 20 6d 65 20 28 64 72 68  orted to me (drh
1070: 29 2e 20 20 42 75 74 20 74 68 69 73 0a 2a 2a 20  ).  But this.** 
1080: 62 65 68 61 76 69 6f 72 20 76 61 72 69 65 73 20  behavior varies 
1090: 66 72 6f 6d 20 6d 61 63 68 69 6e 65 20 74 6f 20  from machine to 
10a0: 6d 61 63 68 69 6e 65 2e 20 20 54 68 65 20 73 6f  machine.  The so
10b0: 6c 75 74 69 6f 6e 20 75 73 65 64 20 68 65 72 20  lution used her 
10c0: 69 73 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74 68  is.** to test th
10d0: 65 20 73 74 72 69 6e 67 20 72 69 67 68 74 20 61  e string right a
10e0: 66 74 65 72 20 69 74 20 69 73 20 67 65 6e 65 72  fter it is gener
10f0: 61 74 65 64 20 74 6f 20 73 65 65 20 69 66 20 69  ated to see if i
1100: 74 20 63 61 6e 20 62 65 0a 2a 2a 20 75 6e 64 65  t can be.** unde
1110: 72 73 74 6f 6f 64 20 62 79 20 73 63 61 6e 66 2c  rstood by scanf,
1120: 20 61 6e 64 20 69 66 20 6e 6f 74 2c 20 74 72 79   and if not, try
1130: 20 70 72 65 70 65 6e 64 69 6e 67 20 61 6e 20 22   prepending an "
1140: 30 78 22 20 74 6f 20 73 65 65 20 69 66 0a 2a 2a  0x" to see if.**
1150: 20 74 68 61 74 20 68 65 6c 70 73 2e 20 20 49 66   that helps.  If
1160: 20 6e 6f 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20   nothing works, 
1170: 61 20 66 61 74 61 6c 20 65 72 72 6f 72 20 69 73  a fatal error is
1180: 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 69   generated..*/.i
1190: 6e 74 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61  nt sqlite3TestMa
11a0: 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 54 63 6c  kePointerStr(Tcl
11b0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
11c0: 20 63 68 61 72 20 2a 7a 50 74 72 2c 20 76 6f 69   char *zPtr, voi
11d0: 64 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  d *p){.  sqlite3
11e0: 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c 20 7a  _snprintf(100, z
11f0: 50 74 72 2c 20 22 25 70 22 2c 20 70 29 3b 0a 20  Ptr, "%p", p);. 
1200: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1210: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  }../*.** The cal
1220: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 66 6f  lback routine fo
1230: 72 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 70  r sqlite3_exec_p
1240: 72 69 6e 74 66 28 29 2e 0a 2a 2f 0a 73 74 61 74  rintf()..*/.stat
1250: 69 63 20 69 6e 74 20 65 78 65 63 5f 70 72 69 6e  ic int exec_prin
1260: 74 66 5f 63 62 28 76 6f 69 64 20 2a 70 41 72 67  tf_cb(void *pArg
1270: 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72  , int argc, char
1280: 20 2a 2a 61 72 67 76 2c 20 63 68 61 72 20 2a 2a   **argv, char **
1290: 6e 61 6d 65 29 7b 0a 20 20 54 63 6c 5f 44 53 74  name){.  Tcl_DSt
12a0: 72 69 6e 67 20 2a 73 74 72 20 3d 20 28 54 63 6c  ring *str = (Tcl
12b0: 5f 44 53 74 72 69 6e 67 2a 29 70 41 72 67 3b 0a  _DString*)pArg;.
12c0: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20    int i;..  if( 
12d0: 54 63 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67 74  Tcl_DStringLengt
12e0: 68 28 73 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20  h(str)==0 ){.   
12f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
1300: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63  ; i++){.      Tc
1310: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45  l_DStringAppendE
1320: 6c 65 6d 65 6e 74 28 73 74 72 2c 20 6e 61 6d 65  lement(str, name
1330: 5b 69 5d 20 3f 20 6e 61 6d 65 5b 69 5d 20 3a 20  [i] ? name[i] : 
1340: 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a 20  "NULL");.    }. 
1350: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
1360: 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  argc; i++){.    
1370: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
1380: 64 45 6c 65 6d 65 6e 74 28 73 74 72 2c 20 61 72  dElement(str, ar
1390: 67 76 5b 69 5d 20 3f 20 61 72 67 76 5b 69 5d 20  gv[i] ? argv[i] 
13a0: 3a 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 7d 0a 20  : "NULL");.  }. 
13b0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
13c0: 0a 2a 2a 20 54 68 65 20 49 2f 4f 20 74 72 61 63  .** The I/O trac
13d0: 69 6e 67 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f  ing callback..*/
13e0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
13f0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
1400: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
1410: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
1420: 45 29 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a  E).static FILE *
1430: 69 6f 74 72 61 63 65 5f 66 69 6c 65 20 3d 20 30  iotrace_file = 0
1440: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6f  ;.static void io
1450: 5f 74 72 61 63 65 5f 63 61 6c 6c 62 61 63 6b 28  _trace_callback(
1460: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
1470: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
1480: 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74  list ap;.  va_st
1490: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
14a0: 3b 0a 20 20 76 66 70 72 69 6e 74 66 28 69 6f 74  ;.  vfprintf(iot
14b0: 72 61 63 65 5f 66 69 6c 65 2c 20 7a 46 6f 72 6d  race_file, zForm
14c0: 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  at, ap);.  va_en
14d0: 64 28 61 70 29 3b 0a 20 20 66 66 6c 75 73 68 28  d(ap);.  fflush(
14e0: 69 6f 74 72 61 63 65 5f 66 69 6c 65 29 3b 0a 7d  iotrace_file);.}
14f0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55  .#endif../*.** U
1500: 73 61 67 65 3a 20 20 69 6f 5f 74 72 61 63 65 20  sage:  io_trace 
1510: 46 49 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 54  FILENAME.**.** T
1520: 75 72 6e 20 49 2f 4f 20 74 72 61 63 69 6e 67 20  urn I/O tracing 
1530: 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 49 66 20 46  on or off.  If F
1540: 49 4c 45 4e 41 4d 45 20 69 73 20 6e 6f 74 20 61  ILENAME is not a
1550: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 0a  n empty string,.
1560: 2a 2a 20 49 2f 4f 20 74 72 61 63 69 6e 67 20 62  ** I/O tracing b
1570: 65 67 69 6e 73 20 67 6f 69 6e 67 20 69 6e 74 6f  egins going into
1580: 20 46 49 4c 45 4e 41 4d 45 2e 20 49 66 20 46 49   FILENAME. If FI
1590: 4c 45 4e 41 4d 45 20 69 73 20 61 6e 20 65 6d 70  LENAME is an emp
15a0: 74 79 0a 2a 2a 20 73 74 72 69 6e 67 2c 20 49 2f  ty.** string, I/
15b0: 4f 20 74 72 61 63 69 6e 67 20 69 73 20 74 75 72  O tracing is tur
15c0: 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74  ned off..*/.stat
15d0: 69 63 20 69 6e 74 20 74 65 73 74 5f 69 6f 5f 74  ic int test_io_t
15e0: 72 61 63 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  race(.  void *No
15f0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
1600: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
1610: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
1620: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
1630: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
1640: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1660: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
1670: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
1680: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
1690: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
16a0: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23  argument */.){.#
16b0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
16c0: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26  TE_OMIT_TRACE) &
16d0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
16e0: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29  _ENABLE_IOTRACE)
16f0: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
1700: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1710: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1720: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1730: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
1740: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  v[0],.          
1750: 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30  " FILENAME\"", 0
1760: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1770: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1780: 66 28 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 20  f( iotrace_file 
1790: 29 7b 0a 20 20 20 20 69 66 28 20 69 6f 74 72 61  ){.    if( iotra
17a0: 63 65 5f 66 69 6c 65 21 3d 73 74 64 6f 75 74 20  ce_file!=stdout 
17b0: 26 26 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 21  && iotrace_file!
17c0: 3d 73 74 64 65 72 72 20 29 7b 0a 20 20 20 20 20  =stderr ){.     
17d0: 20 66 63 6c 6f 73 65 28 69 6f 74 72 61 63 65 5f   fclose(iotrace_
17e0: 66 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  file);.    }.   
17f0: 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 20 3d 20   iotrace_file = 
1800: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f  0;.    sqlite3Io
1810: 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Trace = 0;.  }. 
1820: 20 69 66 28 20 61 72 67 76 5b 31 5d 5b 30 5d 20   if( argv[1][0] 
1830: 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
1840: 70 28 61 72 67 76 5b 31 5d 2c 22 73 74 64 6f 75  p(argv[1],"stdou
1850: 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
1860: 69 6f 74 72 61 63 65 5f 66 69 6c 65 20 3d 20 73  iotrace_file = s
1870: 74 64 6f 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65  tdout;.    }else
1880: 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
1890: 5b 31 5d 2c 22 73 74 64 65 72 72 22 29 3d 3d 30  [1],"stderr")==0
18a0: 20 29 7b 0a 20 20 20 20 20 20 69 6f 74 72 61 63   ){.      iotrac
18b0: 65 5f 66 69 6c 65 20 3d 20 73 74 64 65 72 72 3b  e_file = stderr;
18c0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18d0: 20 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 20 3d    iotrace_file =
18e0: 20 66 6f 70 65 6e 28 61 72 67 76 5b 31 5d 2c 20   fopen(argv[1], 
18f0: 22 77 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  "w");.    }.    
1900: 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 20 3d  sqlite3IoTrace =
1910: 20 69 6f 5f 74 72 61 63 65 5f 63 61 6c 6c 62 61   io_trace_callba
1920: 63 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ck;.  }.#endif. 
1930: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1940: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  }.../*.** Usage:
1950: 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 70    sqlite3_exec_p
1960: 72 69 6e 74 66 20 20 44 42 20 20 46 4f 52 4d 41  rintf  DB  FORMA
1970: 54 20 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20  T  STRING.**.** 
1980: 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69 74  Invoke the sqlit
1990: 65 33 5f 65 78 65 63 5f 70 72 69 6e 74 66 28 29  e3_exec_printf()
19a0: 20 69 6e 74 65 72 66 61 63 65 20 75 73 69 6e 67   interface using
19b0: 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
19c0: 73 65 0a 2a 2a 20 44 42 2e 20 20 54 68 65 20 53  se.** DB.  The S
19d0: 51 4c 20 69 73 20 74 68 65 20 73 74 72 69 6e 67  QL is the string
19e0: 20 46 4f 52 4d 41 54 2e 20 20 54 68 65 20 66 6f   FORMAT.  The fo
19f0: 72 6d 61 74 20 73 74 72 69 6e 67 20 73 68 6f 75  rmat string shou
1a00: 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6f 6e  ld contain.** on
1a10: 65 20 25 73 20 6f 72 20 25 71 2e 20 20 53 54 52  e %s or %q.  STR
1a20: 49 4e 47 20 69 73 20 74 68 65 20 76 61 6c 75 65  ING is the value
1a30: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 25   inserted into %
1a40: 73 20 6f 72 20 25 71 2e 0a 2a 2f 0a 73 74 61 74  s or %q..*/.stat
1a50: 69 63 20 69 6e 74 20 74 65 73 74 5f 65 78 65 63  ic int test_exec
1a60: 5f 70 72 69 6e 74 66 28 0a 20 20 76 6f 69 64 20  _printf(.  void 
1a70: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
1a80: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
1a90: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
1aa0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
1ab0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
1ac0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
1ad0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
1ae0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
1af0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
1b00: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
1b10: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
1b20: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
1b30: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1b40: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73  .  Tcl_DString s
1b50: 74 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  tr;.  int rc;.  
1b60: 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a  char *zErr = 0;.
1b70: 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
1b80: 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20  char zBuf[30];. 
1b90: 20 69 66 28 20 61 72 67 63 21 3d 34 20 29 7b 0a   if( argc!=4 ){.
1ba0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1bb0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1bc0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1bd0: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
1be0: 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44 42  0], .       " DB
1bf0: 20 46 4f 52 4d 41 54 20 53 54 52 49 4e 47 22 2c   FORMAT STRING",
1c00: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1c10: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1c20: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
1c30: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
1c40: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
1c50: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
1c60: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73  l_DStringInit(&s
1c70: 74 72 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71  tr);.  zSql = sq
1c80: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72  lite3_mprintf(ar
1c90: 67 76 5b 32 5d 2c 20 61 72 67 76 5b 33 5d 29 3b  gv[2], argv[3]);
1ca0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1cb0: 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 65  exec(db, zSql, e
1cc0: 78 65 63 5f 70 72 69 6e 74 66 5f 63 62 2c 20 26  xec_printf_cb, &
1cd0: 73 74 72 2c 20 26 7a 45 72 72 29 3b 0a 20 20 73  str, &zErr);.  s
1ce0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
1cf0: 29 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75  );.  sprintf(zBu
1d00: 66 2c 20 22 25 64 22 2c 20 72 63 29 3b 0a 20 20  f, "%d", rc);.  
1d10: 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e  Tcl_AppendElemen
1d20: 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b  t(interp, zBuf);
1d30: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65  .  Tcl_AppendEle
1d40: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 63 3d  ment(interp, rc=
1d50: 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 63 6c  =SQLITE_OK ? Tcl
1d60: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73  _DStringValue(&s
1d70: 74 72 29 20 3a 20 7a 45 72 72 29 3b 0a 20 20 54  tr) : zErr);.  T
1d80: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
1d90: 73 74 72 29 3b 0a 20 20 69 66 28 20 7a 45 72 72  str);.  if( zErr
1da0: 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
1db0: 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 73 71 6c  zErr);.  if( sql
1dc0: 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
1dd0: 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20  interp, db, rc) 
1de0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1df0: 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  OR;.  return TCL
1e00: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1e10: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65 78  age:  sqlite3_ex
1e20: 65 63 5f 68 65 78 20 20 44 42 20 20 48 45 58 0a  ec_hex  DB  HEX.
1e30: 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  **.** Invoke the
1e40: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20   sqlite3_exec() 
1e50: 6f 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  on a string that
1e60: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 62 79 20   is obtained by 
1e70: 74 72 61 6e 73 6c 61 74 69 6e 67 0a 2a 2a 20 48  translating.** H
1e80: 45 58 20 69 6e 74 6f 20 41 53 43 49 49 2e 20 20  EX into ASCII.  
1e90: 4d 6f 73 74 20 63 68 61 72 61 63 74 65 72 73 20  Most characters 
1ea0: 61 72 65 20 74 72 61 6e 73 6c 61 74 65 64 20 61  are translated a
1eb0: 73 20 69 73 2e 20 20 25 48 48 20 62 65 63 6f 6d  s is.  %HH becom
1ec0: 65 73 0a 2a 2a 20 61 20 68 65 78 20 63 68 61 72  es.** a hex char
1ed0: 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  acter..*/.static
1ee0: 20 69 6e 74 20 74 65 73 74 5f 65 78 65 63 5f 68   int test_exec_h
1ef0: 65 78 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  ex(.  void *NotU
1f00: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
1f10: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
1f20: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
1f30: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
1f40: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
1f50: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
1f60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1f70: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
1f80: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
1f90: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
1fa0: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
1fb0: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73  gument */.){.  s
1fc0: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 54 63  qlite3 *db;.  Tc
1fd0: 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20  l_DString str;. 
1fe0: 20 69 6e 74 20 72 63 2c 20 69 2c 20 6a 3b 0a 20   int rc, i, j;. 
1ff0: 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b   char *zErr = 0;
2000: 0a 20 20 63 68 61 72 20 2a 7a 48 65 78 3b 0a 20  .  char *zHex;. 
2010: 20 63 68 61 72 20 7a 53 71 6c 5b 35 30 30 5d 3b   char zSql[500];
2020: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d  .  char zBuf[30]
2030: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
2040: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
2050: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2060: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
2070: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
2080: 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22  gv[0], .       "
2090: 20 44 42 20 48 45 58 22 2c 20 30 29 3b 0a 20 20   DB HEX", 0);.  
20a0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
20b0: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
20c0: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
20d0: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
20e0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
20f0: 52 4f 52 3b 0a 20 20 7a 48 65 78 20 3d 20 61 72  ROR;.  zHex = ar
2100: 67 76 5b 32 5d 3b 0a 20 20 66 6f 72 28 69 3d 6a  gv[2];.  for(i=j
2110: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 53 71  =0; i<sizeof(zSq
2120: 6c 29 20 26 26 20 7a 48 65 78 5b 6a 5d 3b 20 69  l) && zHex[j]; i
2130: 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, j++){.    if
2140: 28 20 7a 48 65 78 5b 6a 5d 3d 3d 27 25 27 20 26  ( zHex[j]=='%' &
2150: 26 20 7a 48 65 78 5b 6a 2b 32 5d 20 26 26 20 7a  & zHex[j+2] && z
2160: 48 65 78 5b 6a 2b 32 5d 20 29 7b 0a 20 20 20 20  Hex[j+2] ){.    
2170: 20 20 7a 53 71 6c 5b 69 5d 20 3d 20 28 74 65 73    zSql[i] = (tes
2180: 74 48 65 78 54 6f 49 6e 74 28 7a 48 65 78 5b 6a  tHexToInt(zHex[j
2190: 2b 31 5d 29 3c 3c 34 29 20 2b 20 74 65 73 74 48  +1])<<4) + testH
21a0: 65 78 54 6f 49 6e 74 28 7a 48 65 78 5b 6a 2b 32  exToInt(zHex[j+2
21b0: 5d 29 3b 0a 20 20 20 20 20 20 6a 20 2b 3d 20 32  ]);.      j += 2
21c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21d0: 20 20 20 7a 53 71 6c 5b 69 5d 20 3d 20 7a 48 65     zSql[i] = zHe
21e0: 78 5b 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  x[j];.    }.  }.
21f0: 20 20 7a 53 71 6c 5b 69 5d 20 3d 20 30 3b 0a 20    zSql[i] = 0;. 
2200: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
2210: 28 26 73 74 72 29 3b 0a 20 20 72 63 20 3d 20 73  (&str);.  rc = s
2220: 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20  qlite3_exec(db, 
2230: 7a 53 71 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74  zSql, exec_print
2240: 66 5f 63 62 2c 20 26 73 74 72 2c 20 26 7a 45 72  f_cb, &str, &zEr
2250: 72 29 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42  r);.  sprintf(zB
2260: 75 66 2c 20 22 25 64 22 2c 20 72 63 29 3b 0a 20  uf, "%d", rc);. 
2270: 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65   Tcl_AppendEleme
2280: 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29  nt(interp, zBuf)
2290: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c  ;.  Tcl_AppendEl
22a0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 63  ement(interp, rc
22b0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 63  ==SQLITE_OK ? Tc
22c0: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
22d0: 73 74 72 29 20 3a 20 7a 45 72 72 29 3b 0a 20 20  str) : zErr);.  
22e0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
22f0: 26 73 74 72 29 3b 0a 20 20 69 66 28 20 7a 45 72  &str);.  if( zEr
2300: 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  r ) sqlite3_free
2310: 28 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 73 71  (zErr);.  if( sq
2320: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
2330: 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
2340: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2350: 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ROR;.  return TC
2360: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
2370: 73 61 67 65 3a 20 20 64 62 5f 65 6e 74 65 72 20  sage:  db_enter 
2380: 44 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 62  DB.**         db
2390: 5f 6c 65 61 76 65 20 44 42 0a 2a 2a 0a 2a 2a 20  _leave DB.**.** 
23a0: 45 6e 74 65 72 20 6f 72 20 6c 65 61 76 65 20 74  Enter or leave t
23b0: 68 65 20 6d 75 74 65 78 20 6f 6e 20 61 20 64 61  he mutex on a da
23c0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
23d0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
23e0: 20 64 62 5f 65 6e 74 65 72 28 0a 20 20 76 6f 69   db_enter(.  voi
23f0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
2400: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2410: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
2420: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
2430: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
2440: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
2450: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
2460: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
2470: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
2480: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
2490: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
24a0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
24b0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
24c0: 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  b;.  if( argc!=2
24d0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
24e0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
24f0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
2500: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
2510: 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
2520: 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72  " DB", 0);.    r
2530: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2540: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
2550: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
2560: 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
2570: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2580: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
2590: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
25a0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  x);.  return TCL
25b0: 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  _OK;.}.static in
25c0: 74 20 64 62 5f 6c 65 61 76 65 28 0a 20 20 76 6f  t db_leave(.  vo
25d0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
25e0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
25f0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2600: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2610: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2620: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2630: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
2640: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2650: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
2660: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
2670: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
2680: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
2690: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
26a0: 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  db;.  if( argc!=
26b0: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
26c0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
26d0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
26e0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
26f0: 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
2700: 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
2710: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2720: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
2730: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
2740: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
2750: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2760: 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  R;.  sqlite3_mut
2770: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
2780: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ex);.  return TC
2790: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
27a0: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65  sage:  sqlite3_e
27b0: 78 65 63 20 20 44 42 20 20 53 51 4c 0a 2a 2a 0a  xec  DB  SQL.**.
27c0: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71  ** Invoke the sq
27d0: 6c 69 74 65 33 5f 65 78 65 63 20 69 6e 74 65 72  lite3_exec inter
27e0: 66 61 63 65 20 75 73 69 6e 67 20 74 68 65 20 6f  face using the o
27f0: 70 65 6e 20 64 61 74 61 62 61 73 65 20 44 42 0a  pen database DB.
2800: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
2810: 73 74 5f 65 78 65 63 28 0a 20 20 76 6f 69 64 20  st_exec(.  void 
2820: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
2830: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
2840: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
2850: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
2860: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
2870: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
2880: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2890: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
28a0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
28b0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
28c0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
28d0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
28e0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
28f0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73  .  Tcl_DString s
2900: 74 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  tr;.  int rc;.  
2910: 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a  char *zErr = 0;.
2920: 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
2930: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72  int i, j;.  char
2940: 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 69 66 28   zBuf[30];.  if(
2950: 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
2960: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2970: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
2980: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
2990: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
29a0: 0a 20 20 20 20 20 20 20 22 20 44 42 20 53 51 4c  .       " DB SQL
29b0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
29c0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
29d0: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
29e0: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
29f0: 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
2a00: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2a10: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
2a20: 26 73 74 72 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  &str);.  zSql = 
2a30: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2a40: 22 25 73 22 2c 20 61 72 67 76 5b 32 5d 29 3b 0a  "%s", argv[2]);.
2a50: 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 53 71    for(i=j=0; zSq
2a60: 6c 5b 69 5d 3b 29 7b 0a 20 20 20 20 69 66 28 20  l[i];){.    if( 
2a70: 7a 53 71 6c 5b 69 5d 3d 3d 27 25 27 20 29 7b 0a  zSql[i]=='%' ){.
2a80: 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20        zSql[j++] 
2a90: 3d 20 28 74 65 73 74 48 65 78 54 6f 49 6e 74 28  = (testHexToInt(
2aa0: 7a 53 71 6c 5b 69 2b 31 5d 29 3c 3c 34 29 20 2b  zSql[i+1])<<4) +
2ab0: 20 74 65 73 74 48 65 78 54 6f 49 6e 74 28 7a 53   testHexToInt(zS
2ac0: 71 6c 5b 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20  ql[i+2]);.      
2ad0: 69 20 2b 3d 20 33 3b 0a 20 20 20 20 7d 65 6c 73  i += 3;.    }els
2ae0: 65 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b  e{.      zSql[j+
2af0: 2b 5d 20 3d 20 7a 53 71 6c 5b 69 2b 2b 5d 3b 0a  +] = zSql[i++];.
2b00: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 53 71 6c      }.  }.  zSql
2b10: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  [j] = 0;.  rc = 
2b20: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
2b30: 20 7a 53 71 6c 2c 20 65 78 65 63 5f 70 72 69 6e   zSql, exec_prin
2b40: 74 66 5f 63 62 2c 20 26 73 74 72 2c 20 26 7a 45  tf_cb, &str, &zE
2b50: 72 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  rr);.  sqlite3_f
2b60: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 73 70 72  ree(zSql);.  spr
2b70: 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c  intf(zBuf, "%d",
2b80: 20 72 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65   rc);.  Tcl_Appe
2b90: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2ba0: 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41  , zBuf);.  Tcl_A
2bb0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2bc0: 65 72 70 2c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  erp, rc==SQLITE_
2bd0: 4f 4b 20 3f 20 54 63 6c 5f 44 53 74 72 69 6e 67  OK ? Tcl_DString
2be0: 56 61 6c 75 65 28 26 73 74 72 29 20 3a 20 7a 45  Value(&str) : zE
2bf0: 72 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  rr);.  Tcl_DStri
2c00: 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20  ngFree(&str);.  
2c10: 69 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74  if( zErr ) sqlit
2c20: 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20  e3_free(zErr);. 
2c30: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
2c40: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
2c50: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
2c60: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
2c70: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
2c80: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
2c90: 6c 69 74 65 33 5f 65 78 65 63 5f 6e 72 20 20 44  lite3_exec_nr  D
2ca0: 42 20 20 53 51 4c 0a 2a 2a 0a 2a 2a 20 49 6e 76  B  SQL.**.** Inv
2cb0: 6f 6b 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  oke the sqlite3_
2cc0: 65 78 65 63 20 69 6e 74 65 72 66 61 63 65 20 75  exec interface u
2cd0: 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20 64 61  sing the open da
2ce0: 74 61 62 61 73 65 20 44 42 2e 20 20 44 69 73 63  tabase DB.  Disc
2cf0: 61 72 64 0a 2a 2a 20 61 6c 6c 20 72 65 73 75 6c  ard.** all resul
2d00: 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ts.*/.static int
2d10: 20 74 65 73 74 5f 65 78 65 63 5f 6e 72 28 0a 20   test_exec_nr(. 
2d20: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
2d30: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2d40: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
2d50: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
2d60: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
2d70: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
2d80: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
2d90: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2da0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
2db0: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
2dc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
2dd0: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
2de0: 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
2df0: 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
2e00: 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20  .  char *zErr = 
2e10: 30 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33  0;.  if( argc!=3
2e20: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
2e30: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2e40: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
2e50: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
2e60: 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
2e70: 22 20 44 42 20 53 51 4c 22 2c 20 30 29 3b 0a 20  " DB SQL", 0);. 
2e80: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2e90: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
2ea0: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
2eb0: 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
2ec0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
2ed0: 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
2ee0: 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 61 72  ite3_exec(db, ar
2ef0: 67 76 5b 32 5d 2c 20 30 2c 20 30 2c 20 26 7a 45  gv[2], 0, 0, &zE
2f00: 72 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  rr);.  if( sqlit
2f10: 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
2f20: 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
2f30: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2f40: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
2f50: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
2f60: 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e:  sqlite3_mpri
2f70: 6e 74 66 5f 7a 5f 74 65 73 74 20 20 53 45 50 41  ntf_z_test  SEPA
2f80: 52 41 54 4f 52 20 20 41 52 47 30 20 20 41 52 47  RATOR  ARG0  ARG
2f90: 31 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74  1 ....**.** Test
2fa0: 20 74 68 65 20 25 7a 20 66 6f 72 6d 61 74 20 6f   the %z format o
2fb0: 66 20 73 71 6c 69 74 65 5f 6d 70 72 69 6e 74 66  f sqlite_mprintf
2fc0: 28 29 2e 20 20 55 73 65 20 6d 75 6c 74 69 70 6c  ().  Use multipl
2fd0: 65 20 6d 70 72 69 6e 74 66 28 29 20 63 61 6c 6c  e mprintf() call
2fe0: 73 20 74 6f 20 0a 2a 2a 20 63 6f 6e 63 61 74 65  s to .** concate
2ff0: 6e 61 74 65 20 61 72 67 30 20 74 68 72 6f 75 67  nate arg0 throug
3000: 68 20 61 72 67 6e 20 75 73 69 6e 67 20 73 65 70  h argn using sep
3010: 61 72 61 74 6f 72 20 61 73 20 74 68 65 20 73 65  arator as the se
3020: 70 61 72 61 74 6f 72 2e 0a 2a 2a 20 52 65 74 75  parator..** Retu
3030: 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  rn the result..*
3040: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
3050: 74 5f 6d 70 72 69 6e 74 66 5f 7a 28 0a 20 20 76  t_mprintf_z(.  v
3060: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
3070: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
3080: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
3090: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
30a0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
30b0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
30c0: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
30d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
30e0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
30f0: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
3100: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
3110: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
3120: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 52  */.){.  char *zR
3130: 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 69 6e 74  esult = 0;.  int
3140: 20 69 3b 0a 0a 20 20 66 6f 72 28 69 3d 32 3b 20   i;..  for(i=2; 
3150: 69 3c 61 72 67 63 20 26 26 20 28 69 3d 3d 32 20  i<argc && (i==2 
3160: 7c 7c 20 7a 52 65 73 75 6c 74 29 3b 20 69 2b 2b  || zResult); i++
3170: 29 7b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20 3d  ){.    zResult =
3180: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
3190: 28 22 25 7a 25 73 25 73 22 2c 20 7a 52 65 73 75  ("%z%s%s", zResu
31a0: 6c 74 2c 20 61 72 67 76 5b 31 5d 2c 20 61 72 67  lt, argv[1], arg
31b0: 76 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 54 63 6c  v[i]);.  }.  Tcl
31c0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
31d0: 74 65 72 70 2c 20 7a 52 65 73 75 6c 74 2c 20 30  terp, zResult, 0
31e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
31f0: 65 28 7a 52 65 73 75 6c 74 29 3b 0a 20 20 72 65  e(zResult);.  re
3200: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
3210: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
3220: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6e 5f  lite3_mprintf_n_
3230: 74 65 73 74 20 20 53 54 52 49 4e 47 0a 2a 2a 0a  test  STRING.**.
3240: 2a 2a 20 54 65 73 74 20 74 68 65 20 25 6e 20 66  ** Test the %n f
3250: 6f 72 6d 61 74 20 6f 66 20 73 71 6c 69 74 65 5f  ormat of sqlite_
3260: 6d 70 72 69 6e 74 66 28 29 2e 20 20 52 65 74 75  mprintf().  Retu
3270: 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  rn the length of
3280: 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 73 74   the.** input st
3290: 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
32a0: 69 6e 74 20 74 65 73 74 5f 6d 70 72 69 6e 74 66  int test_mprintf
32b0: 5f 6e 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  _n(.  void *NotU
32c0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
32d0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
32e0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
32f0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
3300: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
3310: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
3320: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3330: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
3340: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
3350: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
3360: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
3370: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63  gument */.){.  c
3380: 68 61 72 20 2a 7a 53 74 72 3b 0a 20 20 69 6e 74  har *zStr;.  int
3390: 20 6e 20 3d 20 30 3b 0a 20 20 7a 53 74 72 20 3d   n = 0;.  zStr =
33a0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
33b0: 28 22 25 73 25 6e 22 2c 20 61 72 67 76 5b 31 5d  ("%s%n", argv[1]
33c0: 2c 20 26 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33  , &n);.  sqlite3
33d0: 5f 66 72 65 65 28 7a 53 74 72 29 3b 0a 20 20 54  _free(zStr);.  T
33e0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
33f0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
3400: 6e 74 4f 62 6a 28 6e 29 29 3b 0a 20 20 72 65 74  ntObj(n));.  ret
3410: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
3420: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
3430: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 69 6e  ite3_snprintf_in
3440: 74 20 20 53 49 5a 45 20 46 4f 52 4d 41 54 20 20  t  SIZE FORMAT  
3450: 49 4e 54 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  INT.**.** Test t
3460: 68 65 20 6f 66 20 73 71 6c 69 74 65 33 5f 73 6e  he of sqlite3_sn
3470: 70 72 69 6e 74 66 28 29 20 72 6f 75 74 69 6e 65  printf() routine
3480: 2e 20 20 53 49 5a 45 20 69 73 20 74 68 65 20 73  .  SIZE is the s
3490: 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75  ize of the.** ou
34a0: 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62  tput buffer in b
34b0: 79 74 65 73 2e 20 20 54 68 65 20 6d 61 78 69 6d  ytes.  The maxim
34c0: 75 6d 20 73 69 7a 65 20 69 73 20 31 30 30 2e 20  um size is 100. 
34d0: 20 46 4f 52 4d 41 54 20 69 73 20 74 68 65 0a 2a   FORMAT is the.*
34e0: 2a 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 2e  * format string.
34f0: 20 20 49 4e 54 20 69 73 20 61 20 73 69 6e 67 6c    INT is a singl
3500: 65 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65  e integer argume
3510: 6e 74 2e 20 20 54 68 65 20 46 4f 52 4d 41 54 0a  nt.  The FORMAT.
3520: 2a 2a 20 73 74 72 69 6e 67 20 6d 75 73 74 20 72  ** string must r
3530: 65 71 75 69 72 65 20 6e 6f 20 6d 6f 72 65 20 74  equire no more t
3540: 68 61 6e 20 74 68 69 73 20 6f 6e 65 20 69 6e 74  han this one int
3550: 65 67 65 72 20 61 72 67 75 6d 65 6e 74 2e 20 20  eger argument.  
3560: 49 66 0a 2a 2a 20 59 6f 75 20 70 61 73 73 20 69  If.** You pass i
3570: 6e 20 61 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  n a format strin
3580: 67 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20  g that requires 
3590: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 61 72  more than one ar
35a0: 67 75 6d 65 6e 74 2c 0a 2a 2a 20 62 61 64 20 74  gument,.** bad t
35b0: 68 69 6e 67 73 20 77 69 6c 6c 20 68 61 70 70 65  hings will happe
35c0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
35d0: 20 74 65 73 74 5f 73 6e 70 72 69 6e 74 66 5f 69   test_snprintf_i
35e0: 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  nt(.  void *NotU
35f0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
3600: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
3610: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
3620: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
3630: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
3640: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
3650: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3660: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
3670: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
3680: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
3690: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
36a0: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63  gument */.){.  c
36b0: 68 61 72 20 7a 53 74 72 5b 31 30 30 5d 3b 0a 20  har zStr[100];. 
36c0: 20 69 6e 74 20 6e 20 3d 20 61 74 6f 69 28 61 72   int n = atoi(ar
36d0: 67 76 5b 31 5d 29 3b 0a 20 20 63 6f 6e 73 74 20  gv[1]);.  const 
36e0: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 20 3d 20  char *zFormat = 
36f0: 61 72 67 76 5b 32 5d 3b 0a 20 20 69 6e 74 20 61  argv[2];.  int a
3700: 31 20 3d 20 61 74 6f 69 28 61 72 67 76 5b 33 5d  1 = atoi(argv[3]
3710: 29 3b 0a 20 20 69 66 28 20 6e 3e 73 69 7a 65 6f  );.  if( n>sizeo
3720: 66 28 7a 53 74 72 29 20 29 20 6e 20 3d 20 73 69  f(zStr) ) n = si
3730: 7a 65 6f 66 28 7a 53 74 72 29 3b 0a 20 20 73 71  zeof(zStr);.  sq
3740: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
3750: 69 7a 65 6f 66 28 7a 53 74 72 29 2c 20 7a 53 74  izeof(zStr), zSt
3760: 72 2c 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c  r, "abcdefghijkl
3770: 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22 29  mnopqrstuvwxyz")
3780: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ;.  sqlite3_snpr
3790: 69 6e 74 66 28 6e 2c 20 7a 53 74 72 2c 20 7a 46  intf(n, zStr, zF
37a0: 6f 72 6d 61 74 2c 20 61 31 29 3b 0a 20 20 54 63  ormat, a1);.  Tc
37b0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
37c0: 6e 74 65 72 70 2c 20 7a 53 74 72 2c 20 30 29 3b  nterp, zStr, 0);
37d0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
37e0: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
37f0: 49 54 45 5f 4f 4d 49 54 5f 47 45 54 5f 54 41 42  ITE_OMIT_GET_TAB
3800: 4c 45 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  LE../*.** Usage:
3810: 20 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61    sqlite3_get_ta
3820: 62 6c 65 5f 70 72 69 6e 74 66 20 20 44 42 20 20  ble_printf  DB  
3830: 46 4f 52 4d 41 54 20 20 53 54 52 49 4e 47 20 20  FORMAT  STRING  
3840: 3f 2d 2d 6e 6f 2d 63 6f 75 6e 74 73 3f 0a 2a 2a  ?--no-counts?.**
3850: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73  .** Invoke the s
3860: 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65  qlite3_get_table
3870: 5f 70 72 69 6e 74 66 28 29 20 69 6e 74 65 72 66  _printf() interf
3880: 61 63 65 20 75 73 69 6e 67 20 74 68 65 20 6f 70  ace using the op
3890: 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 44  en database.** D
38a0: 42 2e 20 20 54 68 65 20 53 51 4c 20 69 73 20 74  B.  The SQL is t
38b0: 68 65 20 73 74 72 69 6e 67 20 46 4f 52 4d 41 54  he string FORMAT
38c0: 2e 20 20 54 68 65 20 66 6f 72 6d 61 74 20 73 74  .  The format st
38d0: 72 69 6e 67 20 73 68 6f 75 6c 64 20 63 6f 6e 74  ring should cont
38e0: 61 69 6e 0a 2a 2a 20 6f 6e 65 20 25 73 20 6f 72  ain.** one %s or
38f0: 20 25 71 2e 20 20 53 54 52 49 4e 47 20 69 73 20   %q.  STRING is 
3900: 74 68 65 20 76 61 6c 75 65 20 69 6e 73 65 72 74  the value insert
3910: 65 64 20 69 6e 74 6f 20 25 73 20 6f 72 20 25 71  ed into %s or %q
3920: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3930: 74 65 73 74 5f 67 65 74 5f 74 61 62 6c 65 5f 70  test_get_table_p
3940: 72 69 6e 74 66 28 0a 20 20 76 6f 69 64 20 2a 4e  rintf(.  void *N
3950: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
3960: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
3970: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
3980: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
3990: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
39a0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
39b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
39c0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
39d0: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
39e0: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
39f0: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
3a00: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
3a10: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
3a20: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72   Tcl_DString str
3a30: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  ;.  int rc;.  ch
3a40: 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20  ar *zErr = 0;.  
3a50: 69 6e 74 20 6e 52 6f 77 2c 20 6e 43 6f 6c 3b 0a  int nRow, nCol;.
3a60: 20 20 63 68 61 72 20 2a 2a 61 52 65 73 75 6c 74    char **aResult
3a70: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
3a80: 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 63 68  r zBuf[30];.  ch
3a90: 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20  ar *zSql;.  int 
3aa0: 72 65 73 43 6f 75 6e 74 20 3d 20 2d 31 3b 0a 20  resCount = -1;. 
3ab0: 20 69 66 28 20 61 72 67 63 3d 3d 35 20 29 7b 0a   if( argc==5 ){.
3ac0: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
3ad0: 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
3ae0: 34 5d 2c 20 26 72 65 73 43 6f 75 6e 74 29 20 29  4], &resCount) )
3af0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
3b00: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 72 67  R;.  }.  if( arg
3b10: 63 21 3d 34 20 26 26 20 61 72 67 63 21 3d 35 20  c!=4 && argc!=5 
3b20: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
3b30: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
3b40: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
3b50: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
3b60: 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22  gv[0], .       "
3b70: 20 44 42 20 46 4f 52 4d 41 54 20 53 54 52 49 4e   DB FORMAT STRIN
3b80: 47 20 3f 43 4f 55 4e 54 3f 22 2c 20 30 29 3b 0a  G ?COUNT?", 0);.
3b90: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
3ba0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
3bb0: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
3bc0: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
3bd0: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
3be0: 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 44 53 74  ERROR;.  Tcl_DSt
3bf0: 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a  ringInit(&str);.
3c00: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
3c10: 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 32 5d  _mprintf(argv[2]
3c20: 2c 61 72 67 76 5b 33 5d 29 3b 0a 20 20 69 66 28  ,argv[3]);.  if(
3c30: 20 61 72 67 63 3d 3d 35 20 29 7b 0a 20 20 20 20   argc==5 ){.    
3c40: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 67 65 74  rc = sqlite3_get
3c50: 5f 74 61 62 6c 65 28 64 62 2c 20 7a 53 71 6c 2c  _table(db, zSql,
3c60: 20 26 61 52 65 73 75 6c 74 2c 20 30 2c 20 30 2c   &aResult, 0, 0,
3c70: 20 26 7a 45 72 72 29 3b 0a 20 20 7d 65 6c 73 65   &zErr);.  }else
3c80: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
3c90: 65 33 5f 67 65 74 5f 74 61 62 6c 65 28 64 62 2c  e3_get_table(db,
3ca0: 20 7a 53 71 6c 2c 20 26 61 52 65 73 75 6c 74 2c   zSql, &aResult,
3cb0: 20 26 6e 52 6f 77 2c 20 26 6e 43 6f 6c 2c 20 26   &nRow, &nCol, &
3cc0: 7a 45 72 72 29 3b 0a 20 20 20 20 72 65 73 43 6f  zErr);.    resCo
3cd0: 75 6e 74 20 3d 20 28 6e 52 6f 77 2b 31 29 2a 6e  unt = (nRow+1)*n
3ce0: 43 6f 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  Col;.  }.  sqlit
3cf0: 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
3d00: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22   sprintf(zBuf, "
3d10: 25 64 22 2c 20 72 63 29 3b 0a 20 20 54 63 6c 5f  %d", rc);.  Tcl_
3d20: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
3d30: 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20 69  terp, zBuf);.  i
3d40: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
3d50: 20 29 7b 0a 20 20 20 20 69 66 28 20 61 72 67 63   ){.    if( argc
3d60: 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 73 70 72  ==4 ){.      spr
3d70: 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c  intf(zBuf, "%d",
3d80: 20 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 54 63   nRow);.      Tc
3d90: 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  l_AppendElement(
3da0: 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20  interp, zBuf);. 
3db0: 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75       sprintf(zBu
3dc0: 66 2c 20 22 25 64 22 2c 20 6e 43 6f 6c 29 3b 0a  f, "%d", nCol);.
3dd0: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
3de0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
3df0: 7a 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zBuf);.    }.   
3e00: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 65 73 43   for(i=0; i<resC
3e10: 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ount; i++){.    
3e20: 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d    Tcl_AppendElem
3e30: 65 6e 74 28 69 6e 74 65 72 70 2c 20 61 52 65 73  ent(interp, aRes
3e40: 75 6c 74 5b 69 5d 20 3f 20 61 52 65 73 75 6c 74  ult[i] ? aResult
3e50: 5b 69 5d 20 3a 20 22 4e 55 4c 4c 22 29 3b 0a 20  [i] : "NULL");. 
3e60: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
3e70: 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d    Tcl_AppendElem
3e80: 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72  ent(interp, zErr
3e90: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
3ea0: 5f 66 72 65 65 5f 74 61 62 6c 65 28 61 52 65 73  _free_table(aRes
3eb0: 75 6c 74 29 3b 0a 20 20 69 66 28 20 7a 45 72 72  ult);.  if( zErr
3ec0: 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
3ed0: 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 73 71 6c  zErr);.  if( sql
3ee0: 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
3ef0: 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20  interp, db, rc) 
3f00: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
3f10: 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  OR;.  return TCL
3f20: 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  _OK;.}..#endif /
3f30: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 47 45  * SQLITE_OMIT_GE
3f40: 54 5f 54 41 42 4c 45 20 2a 2f 0a 0a 0a 2f 2a 0a  T_TABLE */.../*.
3f50: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
3f60: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
3f70: 6f 77 69 64 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65  owid DB.**.** Re
3f80: 74 75 72 6e 73 20 74 68 65 20 69 6e 74 65 67 65  turns the intege
3f90: 72 20 52 4f 57 49 44 20 6f 66 20 74 68 65 20 6d  r ROWID of the m
3fa0: 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73 65 72  ost recent inser
3fb0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
3fc0: 20 74 65 73 74 5f 6c 61 73 74 5f 72 6f 77 69 64   test_last_rowid
3fd0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
3fe0: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
3ff0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
4000: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
4010: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
4020: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
4030: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
4040: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4050: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
4060: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
4070: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4080: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
4090: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
40a0: 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72  ite3 *db;.  char
40b0: 20 7a 42 75 66 5b 33 30 5d 3b 0a 0a 20 20 69 66   zBuf[30];..  if
40c0: 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20  ( argc!=2 ){.   
40d0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
40e0: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
40f0: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
4100: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
4110: 20 22 20 44 42 5c 22 22 2c 20 30 29 3b 0a 20 20   " DB\"", 0);.  
4120: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
4130: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
4140: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
4150: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
4160: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
4170: 52 4f 52 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a  ROR;.  sprintf(z
4180: 42 75 66 2c 20 22 25 6c 6c 64 22 2c 20 73 71 6c  Buf, "%lld", sql
4190: 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74  ite3_last_insert
41a0: 5f 72 6f 77 69 64 28 64 62 29 29 3b 0a 20 20 54  _rowid(db));.  T
41b0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
41c0: 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
41d0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
41e0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  E_OK;.}../*.** U
41f0: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6b  sage:  sqlite3_k
4200: 65 79 20 44 42 20 4b 45 59 0a 2a 2a 0a 2a 2a 20  ey DB KEY.**.** 
4210: 53 65 74 20 74 68 65 20 63 6f 64 65 63 20 6b 65  Set the codec ke
4220: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
4230: 20 74 65 73 74 5f 6b 65 79 28 0a 20 20 76 6f 69   test_key(.  voi
4240: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
4250: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
4260: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
4270: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
4280: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
4290: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
42a0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
42b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
42c0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
42d0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
42e0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
42f0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
4300: 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .){.#ifdef SQLIT
4310: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 73 71  E_HAS_CODEC.  sq
4320: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
4330: 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 3b 0a 20  st char *zKey;. 
4340: 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69 66 28   int nKey;.  if(
4350: 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
4360: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
4370: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
4380: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
4390: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
43a0: 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d         " FILENAM
43b0: 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  E\"", 0);.    re
43c0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
43d0: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
43e0: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
43f0: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
4400: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
4410: 0a 20 20 7a 4b 65 79 20 3d 20 61 72 67 76 5b 32  .  zKey = argv[2
4420: 5d 3b 0a 20 20 6e 4b 65 79 20 3d 20 73 74 72 6c  ];.  nKey = strl
4430: 65 6e 28 7a 4b 65 79 29 3b 0a 20 20 73 71 6c 69  en(zKey);.  sqli
4440: 74 65 33 5f 6b 65 79 28 64 62 2c 20 7a 4b 65 79  te3_key(db, zKey
4450: 2c 20 6e 4b 65 79 29 3b 0a 23 65 6e 64 69 66 0a  , nKey);.#endif.
4460: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
4470: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
4480: 20 20 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 20    sqlite3_rekey 
4490: 44 42 20 4b 45 59 0a 2a 2a 0a 2a 2a 20 43 68 61  DB KEY.**.** Cha
44a0: 6e 67 65 20 74 68 65 20 63 6f 64 65 63 20 6b 65  nge the codec ke
44b0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
44c0: 20 74 65 73 74 5f 72 65 6b 65 79 28 0a 20 20 76   test_rekey(.  v
44d0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
44e0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
44f0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
4500: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
4510: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
4520: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
4530: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
4540: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4550: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
4560: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
4570: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
4580: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
4590: 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  */.){.#ifdef SQL
45a0: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
45b0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
45c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 3b  onst char *zKey;
45d0: 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69  .  int nKey;.  i
45e0: 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20  f( argc!=3 ){.  
45f0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
4600: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
4610: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
4620: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
4630: 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e  ,.       " FILEN
4640: 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  AME\"", 0);.    
4650: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
4660: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
4670: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
4680: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
4690: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
46a0: 52 3b 0a 20 20 7a 4b 65 79 20 3d 20 61 72 67 76  R;.  zKey = argv
46b0: 5b 32 5d 3b 0a 20 20 6e 4b 65 79 20 3d 20 73 74  [2];.  nKey = st
46c0: 72 6c 65 6e 28 7a 4b 65 79 29 3b 0a 20 20 73 71  rlen(zKey);.  sq
46d0: 6c 69 74 65 33 5f 72 65 6b 65 79 28 64 62 2c 20  lite3_rekey(db, 
46e0: 7a 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 23 65 6e  zKey, nKey);.#en
46f0: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  dif.  return TCL
4700: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
4710: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 63 6c  age:  sqlite3_cl
4720: 6f 73 65 20 44 42 0a 2a 2a 0a 2a 2a 20 43 6c 6f  ose DB.**.** Clo
4730: 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ses the database
4740: 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74   opened by sqlit
4750: 65 33 5f 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74  e3_open..*/.stat
4760: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f 74 65  ic int sqlite_te
4770: 73 74 5f 63 6c 6f 73 65 28 0a 20 20 76 6f 69 64  st_close(.  void
4780: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
4790: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
47a0: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
47b0: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
47c0: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
47d0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
47e0: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
47f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
4800: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
4810: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
4820: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
4830: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
4840: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
4850: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  ;.  int rc;.  if
4860: 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20  ( argc!=2 ){.   
4870: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
4880: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
4890: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
48a0: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
48b0: 0a 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41  .       " FILENA
48c0: 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  ME\"", 0);.    r
48d0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
48e0: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
48f0: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
4900: 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
4910: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
4920: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
4930: 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 54 63  _close(db);.  Tc
4940: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
4950: 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72  rp, (char *)t1Er
4960: 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c  rorName(rc), TCL
4970: 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75  _STATIC);.  retu
4980: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
4990: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
49a0: 74 65 33 5f 63 6c 6f 73 65 5f 76 32 20 44 42 0a  te3_close_v2 DB.
49b0: 2a 2a 0a 2a 2a 20 43 6c 6f 73 65 73 20 74 68 65  **.** Closes the
49c0: 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64   database opened
49d0: 20 62 79 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e   by sqlite3_open
49e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
49f0: 73 71 6c 69 74 65 5f 74 65 73 74 5f 63 6c 6f 73  sqlite_test_clos
4a00: 65 5f 76 32 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  e_v2(.  void *No
4a10: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
4a20: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
4a30: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
4a40: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
4a50: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
4a60: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
4a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4a80: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
4a90: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
4aa0: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
4ab0: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
4ac0: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
4ad0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
4ae0: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72  int rc;.  if( ar
4af0: 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
4b00: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
4b10: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
4b20: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
4b30: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
4b40: 20 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22      " FILENAME\"
4b50: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
4b60: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
4b70: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
4b80: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
4b90: 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
4ba0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
4bb0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6c 6f  rc = sqlite3_clo
4bc0: 73 65 5f 76 32 28 64 62 29 3b 0a 20 20 54 63 6c  se_v2(db);.  Tcl
4bd0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
4be0: 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
4bf0: 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  orName(rc), TCL_
4c00: 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72  STATIC);.  retur
4c10: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
4c20: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
4c30: 6e 20 6f 66 20 74 68 65 20 78 5f 63 6f 61 6c 65  n of the x_coale
4c40: 73 63 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  sce() function..
4c50: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 69  ** Return the fi
4c60: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6e 6f 6e  rst argument non
4c70: 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a  -NULL argument..
4c80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
4c90: 31 5f 69 66 6e 75 6c 6c 46 75 6e 63 28 0a 20 20  1_ifnullFunc(.  
4ca0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
4cb0: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
4cc0: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
4cd0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
4ce0: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
4cf0: 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29  =0; i<argc; i++)
4d00: 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  {.    if( SQLITE
4d10: 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76  _NULL!=sqlite3_v
4d20: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 69  alue_type(argv[i
4d30: 5d 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ]) ){.      int 
4d40: 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
4d50: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 69 5d 29  e_bytes(argv[i])
4d60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
4d70: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
4d80: 65 78 74 2c 20 28 63 68 61 72 2a 29 73 71 6c 69  ext, (char*)sqli
4d90: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
4da0: 72 67 76 5b 69 5d 29 2c 0a 20 20 20 20 20 20 20  rgv[i]),.       
4db0: 20 20 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41     n, SQLITE_TRA
4dc0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 62  NSIENT);.      b
4dd0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
4de0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61  }../*.** These a
4df0: 72 65 20 74 65 73 74 20 66 75 6e 63 74 69 6f 6e  re test function
4e00: 73 2e 20 20 20 20 68 65 78 38 28 29 20 69 6e 74  s.    hex8() int
4e10: 65 72 70 72 65 74 73 20 69 74 73 20 61 72 67 75  erprets its argu
4e20: 6d 65 6e 74 20 61 73 0a 2a 2a 20 55 54 46 38 20  ment as.** UTF8 
4e30: 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 68 65  and returns a he
4e40: 78 20 65 6e 63 6f 64 69 6e 67 2e 20 20 68 65 78  x encoding.  hex
4e50: 31 36 6c 65 28 29 20 69 6e 74 65 72 70 72 65 74  16le() interpret
4e60: 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74 0a 2a  s its argument.*
4e70: 2a 20 61 73 20 55 54 46 31 36 6c 65 20 61 6e 64  * as UTF16le and
4e80: 20 72 65 74 75 72 6e 73 20 61 20 68 65 78 20 65   returns a hex e
4e90: 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  ncoding..*/.stat
4ea0: 69 63 20 76 6f 69 64 20 68 65 78 38 46 75 6e 63  ic void hex8Func
4eb0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
4ec0: 20 2a 70 2c 20 69 6e 74 20 61 72 67 63 2c 20 73   *p, int argc, s
4ed0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
4ee0: 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e  rgv){.  const un
4ef0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a  signed char *z;.
4f00: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
4f10: 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20 7a 20 3d  zBuf[200];.  z =
4f20: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
4f30: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ext(argv[0]);.  
4f40: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
4f50: 66 28 7a 42 75 66 29 2f 32 20 2d 20 32 20 26 26  f(zBuf)/2 - 2 &&
4f60: 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   z[i]; i++){.   
4f70: 20 73 70 72 69 6e 74 66 28 26 7a 42 75 66 5b 69   sprintf(&zBuf[i
4f80: 2a 32 5d 2c 20 22 25 30 32 78 22 2c 20 7a 5b 69  *2], "%02x", z[i
4f90: 5d 26 30 78 66 66 29 3b 0a 20 20 7d 0a 20 20 7a  ]&0xff);.  }.  z
4fa0: 42 75 66 5b 69 2a 32 5d 20 3d 20 30 3b 0a 20 20  Buf[i*2] = 0;.  
4fb0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
4fc0: 65 78 74 28 70 2c 20 28 63 68 61 72 2a 29 7a 42  ext(p, (char*)zB
4fd0: 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54  uf, -1, SQLITE_T
4fe0: 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 23 69 66  RANSIENT);.}.#if
4ff0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5000: 5f 55 54 46 31 36 0a 73 74 61 74 69 63 20 76 6f  _UTF16.static vo
5010: 69 64 20 68 65 78 31 36 46 75 6e 63 28 73 71 6c  id hex16Func(sql
5020: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 2c  ite3_context *p,
5030: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
5040: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29  e3_value **argv)
5050: 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
5060: 65 64 20 73 68 6f 72 74 20 69 6e 74 20 2a 7a 3b  ed short int *z;
5070: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
5080: 20 7a 42 75 66 5b 34 30 30 5d 3b 0a 20 20 7a 20   zBuf[400];.  z 
5090: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
50a0: 74 65 78 74 31 36 28 61 72 67 76 5b 30 5d 29 3b  text16(argv[0]);
50b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
50c0: 7a 65 6f 66 28 7a 42 75 66 29 2f 34 20 2d 20 34  zeof(zBuf)/4 - 4
50d0: 20 26 26 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a   && z[i]; i++){.
50e0: 20 20 20 20 73 70 72 69 6e 74 66 28 26 7a 42 75      sprintf(&zBu
50f0: 66 5b 69 2a 34 5d 2c 20 22 25 30 34 78 22 2c 20  f[i*4], "%04x", 
5100: 7a 5b 69 5d 26 30 78 66 66 29 3b 0a 20 20 7d 0a  z[i]&0xff);.  }.
5110: 20 20 7a 42 75 66 5b 69 2a 34 5d 20 3d 20 30 3b    zBuf[i*4] = 0;
5120: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
5130: 74 5f 74 65 78 74 28 70 2c 20 28 63 68 61 72 2a  t_text(p, (char*
5140: 29 7a 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54  )zBuf, -1, SQLIT
5150: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a  E_TRANSIENT);.}.
5160: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20  #endif../*.** A 
5170: 73 74 72 75 63 74 75 72 65 20 69 6e 74 6f 20 77  structure into w
5180: 68 69 63 68 20 74 6f 20 61 63 63 75 6d 75 6c 61  hich to accumula
5190: 74 65 20 74 65 78 74 2e 0a 2a 2f 0a 73 74 72 75  te text..*/.stru
51a0: 63 74 20 64 73 74 72 20 7b 0a 20 20 69 6e 74 20  ct dstr {.  int 
51b0: 6e 41 6c 6c 6f 63 3b 20 20 2f 2a 20 53 70 61 63  nAlloc;  /* Spac
51c0: 65 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  e allocated */. 
51d0: 20 69 6e 74 20 6e 55 73 65 64 3b 20 20 20 2f 2a   int nUsed;   /*
51e0: 20 53 70 61 63 65 20 75 73 65 64 20 2a 2f 0a 20   Space used */. 
51f0: 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 2f 2a   char *z;     /*
5200: 20 54 68 65 20 73 70 61 63 65 20 2a 2f 0a 7d 3b   The space */.};
5210: 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74  ../*.** Append t
5220: 65 78 74 20 74 6f 20 61 20 64 73 74 72 0a 2a 2f  ext to a dstr.*/
5230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 73 74  .static void dst
5240: 72 41 70 70 65 6e 64 28 73 74 72 75 63 74 20 64  rAppend(struct d
5250: 73 74 72 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  str *p, const ch
5260: 61 72 20 2a 7a 2c 20 69 6e 74 20 64 69 76 69 64  ar *z, int divid
5270: 65 72 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 28  er){.  int n = (
5280: 69 6e 74 29 73 74 72 6c 65 6e 28 7a 29 3b 0a 20  int)strlen(z);. 
5290: 20 69 66 28 20 70 2d 3e 6e 55 73 65 64 20 2b 20   if( p->nUsed + 
52a0: 6e 20 2b 20 32 20 3e 20 70 2d 3e 6e 41 6c 6c 6f  n + 2 > p->nAllo
52b0: 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  c ){.    char *z
52c0: 4e 65 77 3b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c  New;.    p->nAll
52d0: 6f 63 20 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 2a 32  oc = p->nAlloc*2
52e0: 20 2b 20 6e 20 2b 20 32 30 30 3b 0a 20 20 20 20   + n + 200;.    
52f0: 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72  zNew = sqlite3_r
5300: 65 61 6c 6c 6f 63 28 70 2d 3e 7a 2c 20 70 2d 3e  ealloc(p->z, p->
5310: 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28  nAlloc);.    if(
5320: 20 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   zNew==0 ){.    
5330: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
5340: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73  ->z);.      mems
5350: 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
5360: 2a 70 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  *p));.      retu
5370: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  rn;.    }.    p-
5380: 3e 7a 20 3d 20 7a 4e 65 77 3b 0a 20 20 7d 0a 20  >z = zNew;.  }. 
5390: 20 69 66 28 20 64 69 76 69 64 65 72 20 26 26 20   if( divider && 
53a0: 70 2d 3e 6e 55 73 65 64 3e 30 20 29 7b 0a 20 20  p->nUsed>0 ){.  
53b0: 20 20 70 2d 3e 7a 5b 70 2d 3e 6e 55 73 65 64 2b    p->z[p->nUsed+
53c0: 2b 5d 20 3d 20 64 69 76 69 64 65 72 3b 0a 20 20  +] = divider;.  
53d0: 7d 0a 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e 7a  }.  memcpy(&p->z
53e0: 5b 70 2d 3e 6e 55 73 65 64 5d 2c 20 7a 2c 20 6e  [p->nUsed], z, n
53f0: 2b 31 29 3b 0a 20 20 70 2d 3e 6e 55 73 65 64 20  +1);.  p->nUsed 
5400: 2b 3d 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  += n;.}../*.** I
5410: 6e 76 6f 6b 65 64 20 66 6f 72 20 65 61 63 68 20  nvoked for each 
5420: 63 61 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 73 71  callback from sq
5430: 6c 69 74 65 33 45 78 65 63 46 75 6e 63 0a 2a 2f  lite3ExecFunc.*/
5440: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 65 63  .static int exec
5450: 46 75 6e 63 43 61 6c 6c 62 61 63 6b 28 76 6f 69  FuncCallback(voi
5460: 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 61 72  d *pData, int ar
5470: 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 2c  gc, char **argv,
5480: 20 63 68 61 72 20 2a 2a 4e 6f 74 55 73 65 64 29   char **NotUsed)
5490: 7b 0a 20 20 73 74 72 75 63 74 20 64 73 74 72 20  {.  struct dstr 
54a0: 2a 70 20 3d 20 28 73 74 72 75 63 74 20 64 73 74  *p = (struct dst
54b0: 72 2a 29 70 44 61 74 61 3b 0a 20 20 69 6e 74 20  r*)pData;.  int 
54c0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
54d0: 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  argc; i++){.    
54e0: 69 66 28 20 61 72 67 76 5b 69 5d 3d 3d 30 20 29  if( argv[i]==0 )
54f0: 7b 0a 20 20 20 20 20 20 64 73 74 72 41 70 70 65  {.      dstrAppe
5500: 6e 64 28 70 2c 20 22 4e 55 4c 4c 22 2c 20 27 20  nd(p, "NULL", ' 
5510: 27 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ');.    }else{. 
5520: 20 20 20 20 20 64 73 74 72 41 70 70 65 6e 64 28       dstrAppend(
5530: 70 2c 20 61 72 67 76 5b 69 5d 2c 20 27 20 27 29  p, argv[i], ' ')
5540: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
5550: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
5560: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
5570: 6f 66 20 74 68 65 20 78 5f 73 71 6c 69 74 65 5f  of the x_sqlite_
5580: 65 78 65 63 28 29 20 66 75 6e 63 74 69 6f 6e 2e  exec() function.
5590: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
55a0: 74 61 6b 65 73 0a 2a 2a 20 61 20 73 69 6e 67 6c  takes.** a singl
55b0: 65 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 61  e argument and a
55c0: 74 74 65 6d 70 74 73 20 74 6f 20 65 78 65 63 75  ttempts to execu
55d0: 74 65 20 74 68 61 74 20 61 72 67 75 6d 65 6e 74  te that argument
55e0: 20 61 73 20 53 51 4c 20 63 6f 64 65 2e 0a 2a 2a   as SQL code..**
55f0: 20 54 68 69 73 20 69 73 20 69 6c 6c 65 67 61 6c   This is illegal
5600: 20 61 6e 64 20 73 68 6f 75 6c 64 20 73 65 74 20   and should set 
5610: 74 68 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  the SQLITE_MISUS
5620: 45 20 66 6c 61 67 20 6f 6e 20 74 68 65 20 64 61  E flag on the da
5630: 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 32 30  tabase..**.** 20
5640: 30 34 2d 4a 61 6e 2d 30 37 3a 20 20 57 65 20 68  04-Jan-07:  We h
5650: 61 76 65 20 63 68 61 6e 67 65 64 20 74 68 69 73  ave changed this
5660: 20 74 6f 20 6d 61 6b 65 20 69 74 20 6c 65 67 61   to make it lega
5670: 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65  l to call sqlite
5680: 33 5f 65 78 65 63 28 29 0a 2a 2a 20 66 72 6f 6d  3_exec().** from
5690: 20 77 69 74 68 69 6e 20 61 20 66 75 6e 63 74 69   within a functi
56a0: 6f 6e 20 63 61 6c 6c 2e 20 20 0a 2a 2a 20 0a 2a  on call.  .** .*
56b0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
56c0: 69 6d 75 6c 61 74 65 73 20 74 68 65 20 65 66 66  imulates the eff
56d0: 65 63 74 20 6f 66 20 68 61 76 69 6e 67 20 74 77  ect of having tw
56e0: 6f 20 74 68 72 65 61 64 73 20 61 74 74 65 6d 70  o threads attemp
56f0: 74 20 74 6f 0a 2a 2a 20 75 73 65 20 74 68 65 20  t to.** use the 
5700: 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 61 74  same database at
5710: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a   the same time..
5720: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
5730: 71 6c 69 74 65 33 45 78 65 63 46 75 6e 63 28 0a  qlite3ExecFunc(.
5740: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
5750: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69  t *context, .  i
5760: 6e 74 20 61 72 67 63 2c 20 20 0a 20 20 73 71 6c  nt argc,  .  sql
5770: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
5780: 76 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 64 73  v.){.  struct ds
5790: 74 72 20 78 3b 0a 20 20 6d 65 6d 73 65 74 28 26  tr x;.  memset(&
57a0: 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 78 29 29  x, 0, sizeof(x))
57b0: 3b 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65  ;.  (void)sqlite
57c0: 33 5f 65 78 65 63 28 28 73 71 6c 69 74 65 33 2a  3_exec((sqlite3*
57d0: 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61  )sqlite3_user_da
57e0: 74 61 28 63 6f 6e 74 65 78 74 29 2c 0a 20 20 20  ta(context),.   
57f0: 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65     (char*)sqlite
5800: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
5810: 76 5b 30 5d 29 2c 0a 20 20 20 20 20 20 65 78 65  v[0]),.      exe
5820: 63 46 75 6e 63 43 61 6c 6c 62 61 63 6b 2c 20 26  cFuncCallback, &
5830: 78 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  x, 0);.  sqlite3
5840: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
5850: 74 65 78 74 2c 20 78 2e 7a 2c 20 78 2e 6e 55 73  text, x.z, x.nUs
5860: 65 64 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  ed, SQLITE_TRANS
5870: 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  IENT);.  sqlite3
5880: 5f 66 72 65 65 28 78 2e 7a 29 3b 0a 7d 0a 0a 2f  _free(x.z);.}../
5890: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
58a0: 69 6f 6e 20 6f 66 20 74 6b 74 32 32 31 33 66 75  ion of tkt2213fu
58b0: 6e 63 28 29 2c 20 61 20 73 63 61 6c 61 72 20 66  nc(), a scalar f
58c0: 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 74 61 6b  unction that tak
58d0: 65 73 20 65 78 61 63 74 6c 79 0a 2a 2a 20 6f 6e  es exactly.** on
58e0: 65 20 61 72 67 75 6d 65 6e 74 2e 20 49 74 20 68  e argument. It h
58f0: 61 73 20 74 77 6f 20 69 6e 74 65 72 65 73 74 69  as two interesti
5900: 6e 67 20 66 65 61 74 75 72 65 73 3a 0a 2a 2a 0a  ng features:.**.
5910: 2a 2a 20 2a 20 49 74 20 63 61 6c 6c 73 20 73 71  ** * It calls sq
5920: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
5930: 28 29 20 33 20 74 69 6d 65 73 20 6f 6e 20 74 68  () 3 times on th
5940: 65 20 61 72 67 75 6d 65 6e 74 20 73 71 6c 69 74  e argument sqlit
5950: 65 33 5f 76 61 6c 75 65 2a 2e 0a 2a 2a 20 20 20  e3_value*..**   
5960: 49 66 20 74 68 65 20 74 68 72 65 65 20 70 6f 69  If the three poi
5970: 6e 74 65 72 73 20 72 65 74 75 72 6e 65 64 20 61  nters returned a
5980: 72 65 20 6e 6f 74 20 74 68 65 20 73 61 6d 65 20  re not the same 
5990: 61 6e 20 53 51 4c 20 65 72 72 6f 72 20 69 73 20  an SQL error is 
59a0: 72 61 69 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 20  raised..**.** * 
59b0: 4f 74 68 65 72 77 69 73 65 20 69 74 20 72 65 74  Otherwise it ret
59c0: 75 72 6e 73 20 61 20 63 6f 70 79 20 6f 66 20 74  urns a copy of t
59d0: 68 65 20 74 65 78 74 20 72 65 70 72 65 73 65 6e  he text represen
59e0: 74 61 74 69 6f 6e 20 6f 66 20 69 74 73 20 0a 2a  tation of its .*
59f0: 2a 20 20 20 61 72 67 75 6d 65 6e 74 20 69 6e 20  *   argument in 
5a00: 73 75 63 68 20 61 20 77 61 79 20 61 73 20 74 68  such a way as th
5a10: 65 20 56 44 42 45 20 72 65 70 72 65 73 65 6e 74  e VDBE represent
5a20: 61 74 69 6f 6e 20 69 73 20 61 20 4d 65 6d 2a 20  ation is a Mem* 
5a30: 63 65 6c 6c 20 0a 2a 2a 20 20 20 77 69 74 68 20  cell .**   with 
5a40: 74 68 65 20 4d 45 4d 5f 54 65 72 6d 20 66 6c 61  the MEM_Term fla
5a50: 67 20 63 6c 65 61 72 2e 20 0a 2a 2a 0a 2a 2a 20  g clear. .**.** 
5a60: 54 69 63 6b 65 74 20 23 32 32 31 33 20 63 61 6e  Ticket #2213 can
5a70: 20 74 68 65 72 65 66 6f 72 65 20 62 65 20 74 65   therefore be te
5a80: 73 74 65 64 20 62 79 20 65 76 61 6c 75 61 74 69  sted by evaluati
5a90: 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
5aa0: 0a 2a 2a 20 53 51 4c 20 65 78 70 72 65 73 73 69  .** SQL expressi
5ab0: 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 74 6b 74 32  on:.**.**   tkt2
5ac0: 32 31 33 66 75 6e 63 28 74 6b 74 32 32 31 33 66  213func(tkt2213f
5ad0: 75 6e 63 28 27 61 20 73 74 72 69 6e 67 27 29 29  unc('a string'))
5ae0: 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.*/.static void
5af0: 20 74 6b 74 32 32 31 33 46 75 6e 63 74 69 6f 6e   tkt2213Function
5b00: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
5b10: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20  ext *context, . 
5b20: 20 69 6e 74 20 61 72 67 63 2c 20 20 0a 20 20 73   int argc,  .  s
5b30: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
5b40: 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 6e 54 65  rgv.){.  int nTe
5b50: 78 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  xt;.  unsigned c
5b60: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74  har const *zText
5b70: 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  1;.  unsigned ch
5b80: 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74 32  ar const *zText2
5b90: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
5ba0: 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74 33 3b  r const *zText3;
5bb0: 0a 0a 20 20 6e 54 65 78 74 20 3d 20 73 71 6c 69  ..  nText = sqli
5bc0: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
5bd0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a 54 65 78  argv[0]);.  zTex
5be0: 74 31 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  t1 = sqlite3_val
5bf0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
5c00: 3b 0a 20 20 7a 54 65 78 74 32 20 3d 20 73 71 6c  ;.  zText2 = sql
5c10: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
5c20: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a 54 65 78  argv[0]);.  zTex
5c30: 74 33 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  t3 = sqlite3_val
5c40: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
5c50: 3b 0a 0a 20 20 69 66 28 20 7a 54 65 78 74 31 21  ;..  if( zText1!
5c60: 3d 7a 54 65 78 74 32 20 7c 7c 20 7a 54 65 78 74  =zText2 || zText
5c70: 32 21 3d 7a 54 65 78 74 33 20 29 7b 0a 20 20 20  2!=zText3 ){.   
5c80: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
5c90: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22  error(context, "
5ca0: 74 6b 74 32 32 31 33 20 69 73 20 6e 6f 74 20 66  tkt2213 is not f
5cb0: 69 78 65 64 22 2c 20 2d 31 29 3b 0a 20 20 7d 65  ixed", -1);.  }e
5cc0: 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
5cd0: 43 6f 70 79 20 3d 20 28 63 68 61 72 20 2a 29 73  Copy = (char *)s
5ce0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 54  qlite3_malloc(nT
5cf0: 65 78 74 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ext);.    memcpy
5d00: 28 7a 43 6f 70 79 2c 20 7a 54 65 78 74 31 2c 20  (zCopy, zText1, 
5d10: 6e 54 65 78 74 29 3b 0a 20 20 20 20 73 71 6c 69  nText);.    sqli
5d20: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
5d30: 63 6f 6e 74 65 78 74 2c 20 7a 43 6f 70 79 2c 20  context, zCopy, 
5d40: 6e 54 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 66  nText, sqlite3_f
5d50: 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ree);.  }.}../*.
5d60: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
5d70: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 61   SQL function ta
5d80: 6b 65 73 20 34 20 61 72 67 75 6d 65 6e 74 73 2e  kes 4 arguments.
5d90: 20 20 54 68 65 20 32 6e 64 20 61 6e 64 0a 2a 2a    The 2nd and.**
5da0: 20 34 74 68 20 61 72 67 75 6d 65 6e 74 20 6d 75   4th argument mu
5db0: 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65  st be one of the
5dc0: 73 65 20 73 74 72 69 6e 67 73 3a 20 20 27 74 65  se strings:  'te
5dd0: 78 74 27 2c 20 27 74 65 78 74 31 36 27 2c 0a 2a  xt', 'text16',.*
5de0: 2a 20 6f 72 20 27 62 6c 6f 62 27 20 63 6f 72 72  * or 'blob' corr
5df0: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 41 50 49  esponding to API
5e00: 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 0a 2a 2a   functions.**.**
5e10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
5e20: 6c 75 65 5f 74 65 78 74 28 29 0a 2a 2a 20 20 20  lue_text().**   
5e30: 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
5e40: 5f 74 65 78 74 31 36 28 29 0a 2a 2a 20 20 20 20  _text16().**    
5e50: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f    sqlite3_value_
5e60: 62 6c 6f 62 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65  blob().**.** The
5e70: 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20   third argument 
5e80: 69 73 20 61 20 73 74 72 69 6e 67 2c 20 65 69 74  is a string, eit
5e90: 68 65 72 20 27 62 79 74 65 73 27 20 6f 72 20 27  her 'bytes' or '
5ea0: 62 79 74 65 73 31 36 27 20 6f 72 20 27 6e 6f 6f  bytes16' or 'noo
5eb0: 70 27 2c 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  p',.** correspon
5ec0: 64 69 6e 67 20 74 6f 20 41 50 49 73 3a 0a 2a 2a  ding to APIs:.**
5ed0: 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
5ee0: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 29 0a 2a  _value_bytes().*
5ef0: 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  *      sqlite3_v
5f00: 61 6c 75 65 5f 62 79 74 65 73 31 36 28 29 0a 2a  alue_bytes16().*
5f10: 2a 20 20 20 20 20 20 6e 6f 6f 70 0a 2a 2a 0a 2a  *      noop.**.*
5f20: 2a 20 54 68 65 20 41 50 49 73 20 64 65 73 69 67  * The APIs desig
5f30: 6e 61 74 65 64 20 62 79 20 74 68 65 20 32 6e 64  nated by the 2nd
5f40: 20 74 68 72 6f 75 67 68 20 34 74 68 20 61 72 67   through 4th arg
5f50: 75 6d 65 6e 74 73 20 61 72 65 20 61 70 70 6c 69  uments are appli
5f60: 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72  ed.** to the fir
5f70: 73 74 20 61 72 67 75 6d 65 6e 74 20 69 6e 20 6f  st argument in o
5f80: 72 64 65 72 2e 20 20 49 66 20 74 68 65 20 70 6f  rder.  If the po
5f90: 69 6e 74 65 72 73 20 72 65 74 75 72 6e 65 64 20  inters returned 
5fa0: 62 79 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64  by the.** second
5fb0: 20 61 6e 64 20 66 6f 75 72 74 68 20 61 72 65 20   and fourth are 
5fc0: 64 69 66 66 65 72 65 6e 74 2c 20 74 68 69 73 20  different, this 
5fd0: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
5fe0: 31 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  1.  Otherwise,.*
5ff0: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * this routine r
6000: 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20  eturns 0..**.** 
6010: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
6020: 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 74 6f   used to test to
6030: 20 73 65 65 20 77 68 65 6e 20 72 65 74 75 72 6e   see when return
6040: 65 64 20 70 6f 69 6e 74 65 72 73 20 66 72 6f 6d  ed pointers from
6050: 0a 2a 2a 20 74 68 65 20 5f 74 65 78 74 28 29 2c  .** the _text(),
6060: 20 5f 74 65 78 74 31 36 28 29 20 61 6e 64 20 5f   _text16() and _
6070: 62 6c 6f 62 28 29 20 41 50 49 73 20 62 65 63 6f  blob() APIs beco
6080: 6d 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a  me invalidated..
6090: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
60a0: 74 72 43 68 6e 67 46 75 6e 63 74 69 6f 6e 28 0a  trChngFunction(.
60b0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
60c0: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69  t *context, .  i
60d0: 6e 74 20 61 72 67 63 2c 20 20 0a 20 20 73 71 6c  nt argc,  .  sql
60e0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
60f0: 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  v.){.  const voi
6100: 64 20 2a 70 31 2c 20 2a 70 32 3b 0a 20 20 63 6f  d *p1, *p2;.  co
6110: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6d 64 3b 0a  nst char *zCmd;.
6120: 20 20 69 66 28 20 61 72 67 63 21 3d 34 20 29 20    if( argc!=4 ) 
6130: 72 65 74 75 72 6e 3b 0a 20 20 7a 43 6d 64 20 3d  return;.  zCmd =
6140: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
6150: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
6160: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28  (argv[1]);.  if(
6170: 20 7a 43 6d 64 3d 3d 30 20 29 20 72 65 74 75 72   zCmd==0 ) retur
6180: 6e 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28  n;.  if( strcmp(
6190: 7a 43 6d 64 2c 22 74 65 78 74 22 29 3d 3d 30 20  zCmd,"text")==0 
61a0: 29 7b 0a 20 20 20 20 70 31 20 3d 20 28 63 6f 6e  ){.    p1 = (con
61b0: 73 74 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  st void*)sqlite3
61c0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
61d0: 5b 30 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  [0]);.#ifndef SQ
61e0: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
61f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
6200: 6d 70 28 7a 43 6d 64 2c 20 22 74 65 78 74 31 36  mp(zCmd, "text16
6210: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 31 20  ")==0 ){.    p1 
6220: 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73  = (const void*)s
6230: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
6240: 74 31 36 28 61 72 67 76 5b 30 5d 29 3b 0a 23 65  t16(argv[0]);.#e
6250: 6e 64 69 66 0a 20 20 7d 65 6c 73 65 20 69 66 28  ndif.  }else if(
6260: 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 62   strcmp(zCmd, "b
6270: 6c 6f 62 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lob")==0 ){.    
6280: 70 31 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64  p1 = (const void
6290: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
62a0: 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20  blob(argv[0]);. 
62b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
62c0: 72 6e 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64 20 3d  rn;.  }.  zCmd =
62d0: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
62e0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
62f0: 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 69 66 28  (argv[2]);.  if(
6300: 20 7a 43 6d 64 3d 3d 30 20 29 20 72 65 74 75 72   zCmd==0 ) retur
6310: 6e 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28  n;.  if( strcmp(
6320: 7a 43 6d 64 2c 22 62 79 74 65 73 22 29 3d 3d 30  zCmd,"bytes")==0
6330: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
6340: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
6350: 5b 30 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  [0]);.#ifndef SQ
6360: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
6370: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
6380: 6d 70 28 7a 43 6d 64 2c 20 22 62 79 74 65 73 31  mp(zCmd, "bytes1
6390: 36 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  6")==0 ){.    sq
63a0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
63b0: 73 31 36 28 61 72 67 76 5b 30 5d 29 3b 0a 23 65  s16(argv[0]);.#e
63c0: 6e 64 69 66 0a 20 20 7d 65 6c 73 65 20 69 66 28  ndif.  }else if(
63d0: 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 6e   strcmp(zCmd, "n
63e0: 6f 6f 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  oop")==0 ){.    
63f0: 2f 2a 20 64 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* do nothing */
6400: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
6410: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64  turn;.  }.  zCmd
6420: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
6430: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
6440: 78 74 28 61 72 67 76 5b 33 5d 29 3b 0a 20 20 69  xt(argv[3]);.  i
6450: 66 28 20 7a 43 6d 64 3d 3d 30 20 29 20 72 65 74  f( zCmd==0 ) ret
6460: 75 72 6e 3b 0a 20 20 69 66 28 20 73 74 72 63 6d  urn;.  if( strcm
6470: 70 28 7a 43 6d 64 2c 22 74 65 78 74 22 29 3d 3d  p(zCmd,"text")==
6480: 30 20 29 7b 0a 20 20 20 20 70 32 20 3d 20 28 63  0 ){.    p2 = (c
6490: 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c 69 74  onst void*)sqlit
64a0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
64b0: 67 76 5b 30 5d 29 3b 0a 23 69 66 6e 64 65 66 20  gv[0]);.#ifndef 
64c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
64d0: 36 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  6.  }else if( st
64e0: 72 63 6d 70 28 7a 43 6d 64 2c 20 22 74 65 78 74  rcmp(zCmd, "text
64f0: 31 36 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  16")==0 ){.    p
6500: 32 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a  2 = (const void*
6510: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
6520: 65 78 74 31 36 28 61 72 67 76 5b 30 5d 29 3b 0a  ext16(argv[0]);.
6530: 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 20 69  #endif.  }else i
6540: 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20  f( strcmp(zCmd, 
6550: 22 62 6c 6f 62 22 29 3d 3d 30 20 29 7b 0a 20 20  "blob")==0 ){.  
6560: 20 20 70 32 20 3d 20 28 63 6f 6e 73 74 20 76 6f    p2 = (const vo
6570: 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  id*)sqlite3_valu
6580: 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b  e_blob(argv[0]);
6590: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
65a0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
65b0: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63  te3_result_int(c
65c0: 6f 6e 74 65 78 74 2c 20 70 31 21 3d 70 32 29 3b  ontext, p1!=p2);
65d0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  .}.../*.** Usage
65e0: 3a 20 20 73 71 6c 69 74 65 5f 74 65 73 74 5f 63  :  sqlite_test_c
65f0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 44  reate_function D
6600: 42 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65  B.**.** Call the
6610: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
6620: 66 75 6e 63 74 69 6f 6e 20 41 50 49 20 6f 6e 20  function API on 
6630: 74 68 65 20 67 69 76 65 6e 20 64 61 74 61 62 61  the given databa
6640: 73 65 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74  se in order.** t
6650: 6f 20 63 72 65 61 74 65 20 61 20 66 75 6e 63 74  o create a funct
6660: 69 6f 6e 20 6e 61 6d 65 64 20 22 78 5f 63 6f 61  ion named "x_coa
6670: 6c 65 73 63 65 22 2e 20 20 54 68 69 73 20 66 75  lesce".  This fu
6680: 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65 20  nction does the 
6690: 73 61 6d 65 20 74 68 69 6e 67 0a 2a 2a 20 61 73  same thing.** as
66a0: 20 74 68 65 20 22 63 6f 61 6c 65 73 63 65 22 20   the "coalesce" 
66b0: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20  function.  This 
66c0: 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 72 65  function also re
66d0: 67 69 73 74 65 72 73 20 61 6e 20 53 51 4c 20 66  gisters an SQL f
66e0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6e 61 6d 65 64  unction.** named
66f0: 20 22 78 5f 73 71 6c 69 74 65 5f 65 78 65 63 22   "x_sqlite_exec"
6700: 20 74 68 61 74 20 69 6e 76 6f 6b 65 73 20 73 71   that invokes sq
6710: 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 20 20 49  lite3_exec().  I
6720: 6e 76 6f 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f  nvoking sqlite3_
6730: 65 78 65 63 28 29 0a 2a 2a 20 69 6e 20 74 68 69  exec().** in thi
6740: 73 20 77 61 79 20 69 73 20 69 6c 6c 65 67 61 6c  s way is illegal
6750: 20 72 65 63 75 72 73 69 6f 6e 20 61 6e 64 20 73   recursion and s
6760: 68 6f 75 6c 64 20 72 61 69 73 65 20 61 6e 20 53  hould raise an S
6770: 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 65 72 72  QLITE_MISUSE err
6780: 6f 72 2e 0a 2a 2a 20 54 68 65 20 65 66 66 65 63  or..** The effec
6790: 74 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  t is similar to 
67a0: 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74 68  trying to use th
67b0: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
67c0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 72 6f 6d 0a  connection from.
67d0: 2a 2a 20 74 77 6f 20 74 68 72 65 61 64 73 20 61  ** two threads a
67e0: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
67f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69  .**.** The origi
6800: 6e 61 6c 20 6d 6f 74 69 76 61 74 69 6f 6e 20 66  nal motivation f
6810: 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  or this routine 
6820: 77 61 73 20 74 6f 20 62 65 20 61 62 6c 65 20 74  was to be able t
6830: 6f 20 63 61 6c 6c 20 74 68 65 0a 2a 2a 20 73 71  o call the.** sq
6840: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
6850: 63 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 77  ction function w
6860: 68 69 6c 65 20 61 20 71 75 65 72 79 20 69 73 20  hile a query is 
6870: 69 6e 20 70 72 6f 67 72 65 73 73 20 69 6e 20 6f  in progress in o
6880: 72 64 65 72 0a 2a 2a 20 74 6f 20 74 65 73 74 20  rder.** to test 
6890: 74 68 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  the SQLITE_MISUS
68a0: 45 20 64 65 74 65 63 74 69 6f 6e 20 6c 6f 67 69  E detection logi
68b0: 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  c..*/.static int
68c0: 20 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75 6e   test_create_fun
68d0: 63 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 4e  ction(.  void *N
68e0: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
68f0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
6900: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
6910: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
6920: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
6930: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
6940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6950: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
6960: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
6970: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
6980: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
6990: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
69a0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
69b0: 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  te3 *db;..  if( 
69c0: 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  argc!=2 ){.    T
69d0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
69e0: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
69f0: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
6a00: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
6a10: 20 20 20 20 20 20 22 20 44 42 5c 22 22 2c 20 30        " DB\"", 0
6a20: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
6a30: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
6a40: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
6a50: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
6a60: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
6a70: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
6a80: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
6a90: 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 78 5f  function(db, "x_
6aa0: 63 6f 61 6c 65 73 63 65 22 2c 20 2d 31 2c 20 53  coalesce", -1, S
6ab0: 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20 0a 20  QLITE_ANY, 0, . 
6ac0: 20 20 20 20 20 20 20 74 31 5f 69 66 6e 75 6c 6c         t1_ifnull
6ad0: 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 69  Func, 0, 0);.  i
6ae0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6af0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
6b00: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
6b10: 74 69 6f 6e 28 64 62 2c 20 22 68 65 78 38 22 2c  tion(db, "hex8",
6b20: 20 31 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20   1, SQLITE_ANY, 
6b30: 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 68 65  0, .          he
6b40: 78 38 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  x8Func, 0, 0);. 
6b50: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
6b60: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 69  E_OMIT_UTF16.  i
6b70: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6b80: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
6b90: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
6ba0: 74 69 6f 6e 28 64 62 2c 20 22 68 65 78 31 36 22  tion(db, "hex16"
6bb0: 2c 20 31 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c  , 1, SQLITE_ANY,
6bc0: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 68   0, .          h
6bd0: 65 78 31 36 46 75 6e 63 2c 20 30 2c 20 30 29 3b  ex16Func, 0, 0);
6be0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
6bf0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6c00: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
6c10: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
6c20: 69 6f 6e 28 64 62 2c 20 22 74 6b 74 32 32 31 33  ion(db, "tkt2213
6c30: 66 75 6e 63 22 2c 20 31 2c 20 53 51 4c 49 54 45  func", 1, SQLITE
6c40: 5f 41 4e 59 2c 20 30 2c 20 0a 20 20 20 20 20 20  _ANY, 0, .      
6c50: 20 20 20 20 74 6b 74 32 32 31 33 46 75 6e 63 74      tkt2213Funct
6c60: 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  ion, 0, 0);.  }.
6c70: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6c80: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
6c90: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
6ca0: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 70 6f 69  unction(db, "poi
6cb0: 6e 74 65 72 5f 63 68 61 6e 67 65 22 2c 20 34 2c  nter_change", 4,
6cc0: 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20   SQLITE_ANY, 0, 
6cd0: 0a 20 20 20 20 20 20 20 20 20 20 70 74 72 43 68  .          ptrCh
6ce0: 6e 67 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30  ngFunction, 0, 0
6cf0: 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
6d00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
6d10: 36 0a 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73  6.  /* Use the s
6d20: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
6d30: 6e 63 74 69 6f 6e 31 36 28 29 20 41 50 49 20 68  nction16() API h
6d40: 65 72 65 2e 20 4d 61 69 6e 6c 79 20 66 6f 72 20  ere. Mainly for 
6d50: 66 75 6e 2c 20 62 75 74 20 61 6c 73 6f 20 0a 20  fun, but also . 
6d60: 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20 69   ** because it i
6d70: 73 20 6e 6f 74 20 74 65 73 74 65 64 20 61 6e 79  s not tested any
6d80: 77 68 65 72 65 20 65 6c 73 65 2e 20 2a 2f 0a 20  where else. */. 
6d90: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6da0: 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  OK ){.    const 
6db0: 76 6f 69 64 20 2a 7a 55 74 66 31 36 3b 0a 20 20  void *zUtf16;.  
6dc0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
6dd0: 2a 70 56 61 6c 3b 0a 20 20 20 20 73 71 6c 69 74  *pVal;.    sqlit
6de0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
6df0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 70  b->mutex);.    p
6e00: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Val = sqlite3Val
6e10: 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20 20 73  ueNew(db);.    s
6e20: 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
6e30: 72 28 70 56 61 6c 2c 20 2d 31 2c 20 22 78 5f 73  r(pVal, -1, "x_s
6e40: 71 6c 69 74 65 5f 65 78 65 63 22 2c 20 53 51 4c  qlite_exec", SQL
6e50: 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
6e60: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7a 55  _STATIC);.    zU
6e70: 74 66 31 36 20 3d 20 73 71 6c 69 74 65 33 56 61  tf16 = sqlite3Va
6e80: 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51  lueText(pVal, SQ
6e90: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
6ea0: 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
6eb0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
6ec0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
6ed0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
6ee0: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
6ef0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
6f00: 63 74 69 6f 6e 31 36 28 64 62 2c 20 7a 55 74 66  ction16(db, zUtf
6f10: 31 36 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  16, .           
6f20: 20 20 20 20 20 31 2c 20 53 51 4c 49 54 45 5f 55       1, SQLITE_U
6f30: 54 46 31 36 2c 20 64 62 2c 20 73 71 6c 69 74 65  TF16, db, sqlite
6f40: 33 45 78 65 63 46 75 6e 63 2c 20 30 2c 20 30 29  3ExecFunc, 0, 0)
6f50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
6f60: 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
6f70: 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  l);.    sqlite3_
6f80: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
6f90: 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 23 65 6e 64  mutex);.  }.#end
6fa0: 69 66 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  if..  if( sqlite
6fb0: 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
6fc0: 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
6fd0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
6fe0: 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
6ff0: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
7000: 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
7010: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
7020: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
7030: 52 6f 75 74 69 6e 65 73 20 74 6f 20 69 6d 70 6c  Routines to impl
7040: 65 6d 65 6e 74 20 74 68 65 20 78 5f 63 6f 75 6e  ement the x_coun
7050: 74 28 29 20 61 67 67 72 65 67 61 74 65 20 66 75  t() aggregate fu
7060: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 78 5f  nction..**.** x_
7070: 63 6f 75 6e 74 28 29 20 63 6f 75 6e 74 73 20 74  count() counts t
7080: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e  he number of non
7090: 2d 6e 75 6c 6c 20 61 72 67 75 6d 65 6e 74 73 2e  -null arguments.
70a0: 20 20 42 75 74 20 74 68 65 72 65 20 61 72 65 0a    But there are.
70b0: 2a 2a 20 73 6f 6d 65 20 74 77 69 73 74 73 20 66  ** some twists f
70c0: 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  or testing purpo
70d0: 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ses..**.** If th
70e0: 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 5f  e argument to x_
70f0: 63 6f 75 6e 74 28 29 20 69 73 20 34 30 20 74 68  count() is 40 th
7100: 65 6e 20 61 20 55 54 46 2d 38 20 65 72 72 6f 72  en a UTF-8 error
7110: 20 69 73 20 72 65 70 6f 72 74 65 64 0a 2a 2a 20   is reported.** 
7120: 6f 6e 20 74 68 65 20 73 74 65 70 20 66 75 6e 63  on the step func
7130: 74 69 6f 6e 2e 20 20 49 66 20 78 5f 63 6f 75 6e  tion.  If x_coun
7140: 74 28 34 31 29 20 69 73 20 73 65 65 6e 2c 20 74  t(41) is seen, t
7150: 68 65 6e 20 61 20 55 54 46 2d 31 36 20 65 72 72  hen a UTF-16 err
7160: 6f 72 0a 2a 2a 20 69 73 20 72 65 70 6f 72 74 65  or.** is reporte
7170: 64 20 6f 6e 20 74 68 65 20 73 74 65 70 20 66 75  d on the step fu
7180: 6e 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  nction.  If the 
7190: 74 6f 74 61 6c 20 63 6f 75 6e 74 20 69 73 20 34  total count is 4
71a0: 32 2c 20 74 68 65 6e 0a 2a 2a 20 61 20 55 54 46  2, then.** a UTF
71b0: 2d 38 20 65 72 72 6f 72 20 69 73 20 72 65 70 6f  -8 error is repo
71c0: 72 74 65 64 20 6f 6e 20 74 68 65 20 66 69 6e 61  rted on the fina
71d0: 6c 69 7a 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  lize function..*
71e0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
71f0: 20 74 31 43 6f 75 6e 74 43 74 78 20 74 31 43 6f   t1CountCtx t1Co
7200: 75 6e 74 43 74 78 3b 0a 73 74 72 75 63 74 20 74  untCtx;.struct t
7210: 31 43 6f 75 6e 74 43 74 78 20 7b 0a 20 20 69 6e  1CountCtx {.  in
7220: 74 20 6e 3b 0a 7d 3b 0a 73 74 61 74 69 63 20 76  t n;.};.static v
7230: 6f 69 64 20 74 31 43 6f 75 6e 74 53 74 65 70 28  oid t1CountStep(
7240: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
7250: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
7260: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
7270: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
7280: 29 7b 0a 20 20 74 31 43 6f 75 6e 74 43 74 78 20  ){.  t1CountCtx 
7290: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
72a0: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
72b0: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a  ext(context, siz
72c0: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20  eof(*p));.  if( 
72d0: 28 61 72 67 63 3d 3d 30 20 7c 7c 20 53 51 4c 49  (argc==0 || SQLI
72e0: 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33  TE_NULL!=sqlite3
72f0: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
7300: 5b 30 5d 29 20 29 20 26 26 20 70 20 29 7b 0a 20  [0]) ) && p ){. 
7310: 20 20 20 70 2d 3e 6e 2b 2b 3b 0a 20 20 7d 0a 20     p->n++;.  }. 
7320: 20 69 66 28 20 61 72 67 63 3e 30 20 29 7b 0a 20   if( argc>0 ){. 
7330: 20 20 20 69 6e 74 20 76 20 3d 20 73 71 6c 69 74     int v = sqlit
7340: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67  e3_value_int(arg
7350: 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 76  v[0]);.    if( v
7360: 3d 3d 34 30 20 29 7b 0a 20 20 20 20 20 20 73 71  ==40 ){.      sq
7370: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
7380: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 76 61 6c  or(context, "val
7390: 75 65 20 6f 66 20 34 30 20 68 61 6e 64 65 64 20  ue of 40 handed 
73a0: 74 6f 20 78 5f 63 6f 75 6e 74 22 2c 20 2d 31 29  to x_count", -1)
73b0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
73c0: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20  _OMIT_UTF16.    
73d0: 7d 65 6c 73 65 20 69 66 28 20 76 3d 3d 34 31 20  }else if( v==41 
73e0: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
73f0: 68 61 72 20 7a 55 74 66 31 36 45 72 72 4d 73 67  har zUtf16ErrMsg
7400: 5b 5d 20 3d 20 7b 20 30 2c 20 30 78 36 31 2c 20  [] = { 0, 0x61, 
7410: 30 2c 20 30 78 36 32 2c 20 30 2c 20 30 78 36 33  0, 0x62, 0, 0x63
7420: 2c 20 30 2c 20 30 2c 20 30 7d 3b 0a 20 20 20 20  , 0, 0, 0};.    
7430: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
7440: 5f 65 72 72 6f 72 31 36 28 63 6f 6e 74 65 78 74  _error16(context
7450: 2c 20 26 7a 55 74 66 31 36 45 72 72 4d 73 67 5b  , &zUtf16ErrMsg[
7460: 31 2d 53 51 4c 49 54 45 5f 42 49 47 45 4e 44 49  1-SQLITE_BIGENDI
7470: 41 4e 5d 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66  AN], -1);.#endif
7480: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 20 20 20 0a  .    }.  }.}   .
7490: 73 74 61 74 69 63 20 76 6f 69 64 20 74 31 43 6f  static void t1Co
74a0: 75 6e 74 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69  untFinalize(sqli
74b0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
74c0: 74 65 78 74 29 7b 0a 20 20 74 31 43 6f 75 6e 74  text){.  t1Count
74d0: 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71  Ctx *p;.  p = sq
74e0: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
74f0: 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
7500: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
7510: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  if( p ){.    if(
7520: 20 70 2d 3e 6e 3d 3d 34 32 20 29 7b 0a 20 20 20   p->n==42 ){.   
7530: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
7540: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
7550: 20 22 78 5f 63 6f 75 6e 74 20 74 6f 74 61 6c 73   "x_count totals
7560: 20 74 6f 20 34 32 22 2c 20 2d 31 29 3b 0a 20 20   to 42", -1);.  
7570: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
7580: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
7590: 74 28 63 6f 6e 74 65 78 74 2c 20 70 20 3f 20 70  t(context, p ? p
75a0: 2d 3e 6e 20 3a 20 30 29 3b 0a 20 20 20 20 7d 0a  ->n : 0);.    }.
75b0: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
75c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
75d0: 43 41 54 45 44 0a 73 74 61 74 69 63 20 76 6f 69  CATED.static voi
75e0: 64 20 6c 65 67 61 63 79 43 6f 75 6e 74 53 74 65  d legacyCountSte
75f0: 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  p(.  sqlite3_con
7600: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
7610: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
7620: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
7630: 76 0a 29 7b 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20  v.){.  /* no-op 
7640: 2a 2f 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  */.}..static voi
7650: 64 20 6c 65 67 61 63 79 43 6f 75 6e 74 46 69 6e  d legacyCountFin
7660: 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f  alize(sqlite3_co
7670: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b  ntext *context){
7680: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
7690: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73  t_int(context, s
76a0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
76b0: 5f 63 6f 75 6e 74 28 63 6f 6e 74 65 78 74 29 29  _count(context))
76c0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
76d0: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
76e0: 33 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67 61  3_create_aggrega
76f0: 74 65 20 44 42 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  te DB.**.** Call
7700: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63 72 65   the sqlite3_cre
7710: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 41 50 49  ate_function API
7720: 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 64 61   on the given da
7730: 74 61 62 61 73 65 20 69 6e 20 6f 72 64 65 72 0a  tabase in order.
7740: 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 61 20 66  ** to create a f
7750: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 78  unction named "x
7760: 5f 63 6f 75 6e 74 22 2e 20 20 54 68 69 73 20 66  _count".  This f
7770: 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c  unction is simil
7780: 61 72 0a 2a 2a 20 74 6f 20 74 68 65 20 62 75 69  ar.** to the bui
7790: 6c 74 2d 69 6e 20 63 6f 75 6e 74 28 29 20 66 75  lt-in count() fu
77a0: 6e 63 74 69 6f 6e 2c 20 77 69 74 68 20 61 20 66  nction, with a f
77b0: 65 77 20 73 70 65 63 69 61 6c 20 71 75 69 72 6b  ew special quirk
77c0: 73 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67  s.** for testing
77d0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 72 65 73   the sqlite3_res
77e0: 75 6c 74 5f 65 72 72 6f 72 28 29 20 41 50 49 73  ult_error() APIs
77f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67  ..**.** The orig
7800: 69 6e 61 6c 20 6d 6f 74 69 76 61 74 69 6f 6e 20  inal motivation 
7810: 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  for this routine
7820: 20 77 61 73 20 74 6f 20 62 65 20 61 62 6c 65 20   was to be able 
7830: 74 6f 20 63 61 6c 6c 20 74 68 65 0a 2a 2a 20 73  to call the.** s
7840: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 61 67  qlite3_create_ag
7850: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
7860: 20 77 68 69 6c 65 20 61 20 71 75 65 72 79 20 69   while a query i
7870: 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 69 6e  s in progress in
7880: 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 74 65 73   order.** to tes
7890: 74 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 49 53  t the SQLITE_MIS
78a0: 55 53 45 20 64 65 74 65 63 74 69 6f 6e 20 6c 6f  USE detection lo
78b0: 67 69 63 2e 20 20 53 65 65 20 6d 69 73 75 73 65  gic.  See misuse
78c0: 2e 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  .test..**.** Thi
78d0: 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 6c 61  s routine was la
78e0: 74 65 72 20 65 78 74 65 6e 64 65 64 20 74 6f 20  ter extended to 
78f0: 74 65 73 74 20 74 68 65 20 75 73 65 20 6f 66 20  test the use of 
7900: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
7910: 72 72 6f 72 28 29 0a 2a 2a 20 77 69 74 68 69 6e  rror().** within
7920: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
7930: 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 74 65  ions..**.** Late
7940: 72 3a 20 49 74 20 69 73 20 6e 6f 77 20 61 6c 73  r: It is now als
7950: 6f 20 65 78 74 65 6e 64 65 64 20 74 6f 20 72 65  o extended to re
7960: 67 69 73 74 65 72 20 74 68 65 20 61 67 67 72 65  gister the aggre
7970: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  gate function.**
7980: 20 22 6c 65 67 61 63 79 5f 63 6f 75 6e 74 28 29   "legacy_count()
7990: 22 20 77 69 74 68 20 74 68 65 20 73 75 70 70 6c  " with the suppl
79a0: 69 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e  ied database han
79b0: 64 6c 65 2e 20 54 68 69 73 20 69 73 20 75 73 65  dle. This is use
79c0: 64 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65  d.** to test the
79d0: 20 64 65 70 72 65 63 61 74 65 64 20 73 71 6c 69   deprecated sqli
79e0: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
79f0: 75 6e 74 28 29 20 41 50 49 2e 0a 2a 2f 0a 73 74  unt() API..*/.st
7a00: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 72  atic int test_cr
7a10: 65 61 74 65 5f 61 67 67 72 65 67 61 74 65 28 0a  eate_aggregate(.
7a20: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
7a30: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
7a40: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
7a50: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
7a60: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
7a70: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
7a80: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
7a90: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7aa0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
7ab0: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
7ac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
7ad0: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
7ae0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
7af0: 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
7b00: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ;.  if( argc!=2 
7b10: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
7b20: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
7b30: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
7b40: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
7b50: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
7b60: 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b  FILENAME\"", 0);
7b70: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
7b80: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
7b90: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
7ba0: 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
7bb0: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
7bc0: 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
7bd0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
7be0: 6e 63 74 69 6f 6e 28 64 62 2c 20 22 78 5f 63 6f  nction(db, "x_co
7bf0: 75 6e 74 22 2c 20 30 2c 20 53 51 4c 49 54 45 5f  unt", 0, SQLITE_
7c00: 55 54 46 38 2c 20 30 2c 20 30 2c 0a 20 20 20 20  UTF8, 0, 0,.    
7c10: 20 20 74 31 43 6f 75 6e 74 53 74 65 70 2c 74 31    t1CountStep,t1
7c20: 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 29 3b 0a  CountFinalize);.
7c30: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
7c40: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
7c50: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
7c60: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 78 5f 63  unction(db, "x_c
7c70: 6f 75 6e 74 22 2c 20 31 2c 20 53 51 4c 49 54 45  ount", 1, SQLITE
7c80: 5f 55 54 46 38 2c 20 30 2c 20 30 2c 0a 20 20 20  _UTF8, 0, 0,.   
7c90: 20 20 20 20 20 74 31 43 6f 75 6e 74 53 74 65 70       t1CountStep
7ca0: 2c 74 31 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65  ,t1CountFinalize
7cb0: 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  );.  }.#ifndef S
7cc0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
7cd0: 43 41 54 45 44 0a 20 20 69 66 28 20 72 63 3d 3d  CATED.  if( rc==
7ce0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7cf0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
7d00: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
7d10: 2c 20 22 6c 65 67 61 63 79 5f 63 6f 75 6e 74 22  , "legacy_count"
7d20: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c  , 0, SQLITE_ANY,
7d30: 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 6c   0, 0,.        l
7d40: 65 67 61 63 79 43 6f 75 6e 74 53 74 65 70 2c 20  egacyCountStep, 
7d50: 6c 65 67 61 63 79 43 6f 75 6e 74 46 69 6e 61 6c  legacyCountFinal
7d60: 69 7a 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 23  ize.    );.  }.#
7d70: 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69  endif.  if( sqli
7d80: 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
7d90: 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
7da0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
7db0: 52 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  R;.  Tcl_SetResu
7dc0: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
7dd0: 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
7de0: 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  c), 0);.  return
7df0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
7e00: 2a 2a 20 55 73 61 67 65 3a 20 20 70 72 69 6e 74  ** Usage:  print
7e10: 66 20 54 45 58 54 0a 2a 2a 0a 2a 2a 20 53 65 6e  f TEXT.**.** Sen
7e20: 64 20 6f 75 74 70 75 74 20 74 6f 20 70 72 69 6e  d output to prin
7e30: 74 66 2e 20 20 55 73 65 20 74 68 69 73 20 72 61  tf.  Use this ra
7e40: 74 68 65 72 20 74 68 61 6e 20 70 75 74 73 20 74  ther than puts t
7e50: 6f 20 6d 65 72 67 65 20 74 68 65 20 6f 75 74 70  o merge the outp
7e60: 75 74 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72  ut.** in the cor
7e70: 72 65 63 74 20 73 65 71 75 65 6e 63 65 20 77 69  rect sequence wi
7e80: 74 68 20 64 65 62 75 67 67 69 6e 67 20 70 72 69  th debugging pri
7e90: 6e 74 66 73 20 69 6e 73 65 72 74 65 64 20 69 6e  ntfs inserted in
7ea0: 74 6f 20 43 20 63 6f 64 65 2e 0a 2a 2a 20 50 75  to C code..** Pu
7eb0: 74 73 20 75 73 65 73 20 61 20 73 65 70 61 72 61  ts uses a separa
7ec0: 74 65 20 62 75 66 66 65 72 20 61 6e 64 20 64 65  te buffer and de
7ed0: 62 75 67 67 69 6e 67 20 73 74 61 74 65 6d 65 6e  bugging statemen
7ee0: 74 73 20 77 69 6c 6c 20 62 65 20 6f 75 74 20 6f  ts will be out o
7ef0: 66 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 69 66  f.** sequence if
7f00: 20 69 74 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a   it is used..*/.
7f10: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
7f20: 70 72 69 6e 74 66 28 0a 20 20 76 6f 69 64 20 2a  printf(.  void *
7f30: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
7f40: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
7f50: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
7f60: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
7f70: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
7f80: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
7f90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
7fa0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
7fb0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
7fc0: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
7fd0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
7fe0: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
7ff0: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
8000: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
8010: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
8020: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
8030: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
8040: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 54  v[0],.       " T
8050: 45 58 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  EXT\"", 0);.    
8060: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8070: 3b 0a 20 20 7d 0a 20 20 70 72 69 6e 74 66 28 22  ;.  }.  printf("
8080: 25 73 5c 6e 22 2c 20 61 72 67 76 5b 31 5d 29 3b  %s\n", argv[1]);
8090: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
80a0: 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  ;.}..../*.** Usa
80b0: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge:  sqlite3_mpr
80c0: 69 6e 74 66 5f 69 6e 74 20 46 4f 52 4d 41 54 20  intf_int FORMAT 
80d0: 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 20  INTEGER INTEGER 
80e0: 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 43 61  INTEGER.**.** Ca
80f0: 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20  ll mprintf with 
8100: 74 68 72 65 65 20 69 6e 74 65 67 65 72 20 61 72  three integer ar
8110: 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69  guments.*/.stati
8120: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70  c int sqlite3_mp
8130: 72 69 6e 74 66 5f 69 6e 74 28 0a 20 20 76 6f 69  rintf_int(.  voi
8140: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
8150: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
8160: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
8170: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
8180: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
8190: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
81a0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
81b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
81c0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
81d0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
81e0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
81f0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
8200: 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20  .){.  int a[3], 
8210: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  i;.  char *z;.  
8220: 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20  if( argc!=5 ){. 
8230: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
8240: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
8250: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
8260: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
8270: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d  ],.       " FORM
8280: 41 54 20 49 4e 54 20 49 4e 54 20 49 4e 54 5c 22  AT INT INT INT\"
8290: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
82a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
82b0: 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 35 3b  .  for(i=2; i<5;
82c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54   i++){.    if( T
82d0: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
82e0: 2c 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d  , argv[i], &a[i-
82f0: 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  2]) ) return TCL
8300: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20  _ERROR;.  }.  z 
8310: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
8320: 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c  f(argv[1], a[0],
8330: 20 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a 20 20   a[1], a[2]);.  
8340: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8350: 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a  (interp, z, 0);.
8360: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
8370: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
8380: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
8390: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge:  sqlite3_mpr
83a0: 69 6e 74 66 5f 69 6e 74 36 34 20 46 4f 52 4d 41  intf_int64 FORMA
83b0: 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  T INTEGER INTEGE
83c0: 52 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20  R INTEGER.**.** 
83d0: 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74  Call mprintf wit
83e0: 68 20 74 68 72 65 65 20 36 34 2d 62 69 74 20 69  h three 64-bit i
83f0: 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73  nteger arguments
8400: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
8410: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
8420: 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  nt64(.  void *No
8430: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
8440: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
8450: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
8460: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
8470: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
8480: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
8490: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
84a0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
84b0: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
84c0: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
84d0: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
84e0: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
84f0: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
8500: 5f 69 6e 74 36 34 20 61 5b 33 5d 3b 0a 20 20 63  _int64 a[3];.  c
8510: 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72  har *z;.  if( ar
8520: 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=5 ){.    Tcl
8530: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
8540: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
8550: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
8560: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
8570: 20 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54      " FORMAT INT
8580: 20 49 4e 54 20 49 4e 54 5c 22 22 2c 20 30 29 3b   INT INT\"", 0);
8590: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
85a0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72  ERROR;.  }.  for
85b0: 28 69 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b  (i=2; i<5; i++){
85c0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
85d0: 41 74 6f 69 36 34 28 61 72 67 76 5b 69 5d 2c 20  Atoi64(argv[i], 
85e0: 26 61 5b 69 2d 32 5d 2c 20 31 30 30 30 30 30 30  &a[i-2], 1000000
85f0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 20 29  , SQLITE_UTF8) )
8600: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
8610: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
8620: 20 22 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f   "argument is no
8630: 74 20 61 20 76 61 6c 69 64 20 36 34 2d 62 69 74  t a valid 64-bit
8640: 20 69 6e 74 65 67 65 72 22 2c 20 30 29 3b 0a 20   integer", 0);. 
8650: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
8660: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d  ERROR;.    }.  }
8670: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  z = sqlite3_m
8680: 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20  printf(argv[1], 
8690: 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d  a[0], a[1], a[2]
86a0: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
86b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c  esult(interp, z,
86c0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
86d0: 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e  ree(z);.  return
86e0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
86f0: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
8700: 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67 20 46  3_mprintf_long F
8710: 4f 52 4d 41 54 20 49 4e 54 45 47 45 52 20 49 4e  ORMAT INTEGER IN
8720: 54 45 47 45 52 20 49 4e 54 45 47 45 52 0a 2a 2a  TEGER INTEGER.**
8730: 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66  .** Call mprintf
8740: 20 77 69 74 68 20 74 68 72 65 65 20 6c 6f 6e 67   with three long
8750: 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e   integer argumen
8760: 74 73 2e 20 20 20 54 68 69 73 20 6d 69 67 68 74  ts.   This might
8770: 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20   be the.** same 
8780: 61 73 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  as sqlite3_mprin
8790: 74 66 5f 69 6e 74 20 6f 72 20 73 71 6c 69 74 65  tf_int or sqlite
87a0: 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 2c  3_mprintf_int64,
87b0: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 0a 2a 2a   depending on.**
87c0: 20 70 6c 61 74 66 6f 72 6d 2e 0a 2a 2f 0a 73 74   platform..*/.st
87d0: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
87e0: 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67 28 0a 20  _mprintf_long(. 
87f0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
8800: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
8810: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
8820: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
8830: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
8840: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
8850: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
8860: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8870: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
8880: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
8890: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
88a0: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
88b0: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  t */.){.  int i;
88c0: 0a 20 20 6c 6f 6e 67 20 69 6e 74 20 61 5b 33 5d  .  long int a[3]
88d0: 3b 0a 20 20 69 6e 74 20 62 5b 33 5d 3b 0a 20 20  ;.  int b[3];.  
88e0: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61  char *z;.  if( a
88f0: 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63  rgc!=5 ){.    Tc
8900: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
8910: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
8920: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
8930: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
8940: 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e       " FORMAT IN
8950: 54 20 49 4e 54 20 49 4e 54 5c 22 22 2c 20 30 29  T INT INT\"", 0)
8960: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
8970: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f  _ERROR;.  }.  fo
8980: 72 28 69 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b 29  r(i=2; i<5; i++)
8990: 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  {.    if( Tcl_Ge
89a0: 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67  tInt(interp, arg
89b0: 76 5b 69 5d 2c 20 26 62 5b 69 2d 32 5d 29 20 29  v[i], &b[i-2]) )
89c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
89d0: 52 3b 0a 20 20 20 20 61 5b 69 2d 32 5d 20 3d 20  R;.    a[i-2] = 
89e0: 28 6c 6f 6e 67 20 69 6e 74 29 62 5b 69 2d 32 5d  (long int)b[i-2]
89f0: 3b 0a 20 20 20 20 61 5b 69 2d 32 5d 20 26 3d 20  ;.    a[i-2] &= 
8a00: 28 28 28 75 36 34 29 31 29 3c 3c 28 73 69 7a 65  (((u64)1)<<(size
8a10: 6f 66 28 69 6e 74 29 2a 38 29 29 2d 31 3b 0a 20  of(int)*8))-1;. 
8a20: 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33   }.  z = sqlite3
8a30: 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d  _mprintf(argv[1]
8a40: 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 5b  , a[0], a[1], a[
8a50: 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  2]);.  Tcl_Appen
8a60: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
8a70: 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  z, 0);.  sqlite3
8a80: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75  _free(z);.  retu
8a90: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
8aa0: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
8ab0: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 20  te3_mprintf_str 
8ac0: 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52 20 49  FORMAT INTEGER I
8ad0: 4e 54 45 47 45 52 20 53 54 52 49 4e 47 0a 2a 2a  NTEGER STRING.**
8ae0: 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66  .** Call mprintf
8af0: 20 77 69 74 68 20 74 77 6f 20 69 6e 74 65 67 65   with two intege
8b00: 72 20 61 72 67 75 6d 65 6e 74 73 20 61 6e 64 20  r arguments and 
8b10: 6f 6e 65 20 73 74 72 69 6e 67 20 61 72 67 75 6d  one string argum
8b20: 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ent.*/.static in
8b30: 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  t sqlite3_mprint
8b40: 66 5f 73 74 72 28 0a 20 20 76 6f 69 64 20 2a 4e  f_str(.  void *N
8b50: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
8b60: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
8b70: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
8b80: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
8b90: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
8ba0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
8bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8bc0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
8bd0: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
8be0: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
8bf0: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
8c00: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
8c10: 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a 20    int a[3], i;. 
8c20: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
8c30: 61 72 67 63 3c 34 20 7c 7c 20 61 72 67 63 3e 35  argc<4 || argc>5
8c40: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
8c50: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
8c60: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
8c70: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
8c80: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
8c90: 20 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20   FORMAT INT INT 
8ca0: 3f 53 54 52 49 4e 47 3f 5c 22 22 2c 20 30 29 3b  ?STRING?\"", 0);
8cb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
8cc0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72  ERROR;.  }.  for
8cd0: 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b  (i=2; i<4; i++){
8ce0: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
8cf0: 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76  Int(interp, argv
8d00: 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29 20  [i], &a[i-2]) ) 
8d10: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8d20: 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69  ;.  }.  z = sqli
8d30: 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76  te3_mprintf(argv
8d40: 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c  [1], a[0], a[1],
8d50: 20 61 72 67 63 3e 34 20 3f 20 61 72 67 76 5b 34   argc>4 ? argv[4
8d60: 5d 20 3a 20 4e 55 4c 4c 29 3b 0a 20 20 54 63 6c  ] : NULL);.  Tcl
8d70: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
8d80: 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73  terp, z, 0);.  s
8d90: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
8da0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
8db0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
8dc0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
8dd0: 74 66 5f 73 74 72 20 49 4e 54 45 47 45 52 20 46  tf_str INTEGER F
8de0: 4f 52 4d 41 54 20 49 4e 54 45 47 45 52 20 49 4e  ORMAT INTEGER IN
8df0: 54 45 47 45 52 20 53 54 52 49 4e 47 0a 2a 2a 0a  TEGER STRING.**.
8e00: 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20  ** Call mprintf 
8e10: 77 69 74 68 20 74 77 6f 20 69 6e 74 65 67 65 72  with two integer
8e20: 20 61 72 67 75 6d 65 6e 74 73 20 61 6e 64 20 6f   arguments and o
8e30: 6e 65 20 73 74 72 69 6e 67 20 61 72 67 75 6d 65  ne string argume
8e40: 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  nt.*/.static int
8e50: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
8e60: 66 5f 73 74 72 28 0a 20 20 76 6f 69 64 20 2a 4e  f_str(.  void *N
8e70: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
8e80: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
8e90: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
8ea0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
8eb0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
8ec0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
8ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8ee0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
8ef0: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
8f00: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
8f10: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
8f20: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
8f30: 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a 20    int a[3], i;. 
8f40: 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61 72 20 2a   int n;.  char *
8f50: 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 3c 35 20  z;.  if( argc<5 
8f60: 7c 7c 20 61 72 67 63 3e 36 20 29 7b 0a 20 20 20  || argc>6 ){.   
8f70: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8f80: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
8f90: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
8fa0: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
8fb0: 0a 20 20 20 20 20 20 20 22 20 49 4e 54 20 46 4f  .       " INT FO
8fc0: 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 3f 53 54  RMAT INT INT ?ST
8fd0: 52 49 4e 47 3f 5c 22 22 2c 20 30 29 3b 0a 20 20  RING?\"", 0);.  
8fe0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
8ff0: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63  OR;.  }.  if( Tc
9000: 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
9010: 20 61 72 67 76 5b 31 5d 2c 20 26 6e 29 20 29 20   argv[1], &n) ) 
9020: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9030: 3b 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20  ;.  if( n<0 ){. 
9040: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
9050: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 20 6d  ult(interp, "N m
9060: 75 73 74 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74  ust be non-negat
9070: 69 76 65 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  ive", 0);.    re
9080: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9090: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 33 3b 20 69    }.  for(i=3; i
90a0: 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  <5; i++){.    if
90b0: 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74  ( Tcl_GetInt(int
90c0: 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 61  erp, argv[i], &a
90d0: 5b 69 2d 33 5d 29 20 29 20 72 65 74 75 72 6e 20  [i-3]) ) return 
90e0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
90f0: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c   z = sqlite3_mal
9100: 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20 73 71  loc( n+1 );.  sq
9110: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
9120: 2c 20 7a 2c 20 61 72 67 76 5b 32 5d 2c 20 61 5b  , z, argv[2], a[
9130: 30 5d 2c 20 61 5b 31 5d 2c 20 61 72 67 63 3e 34  0], a[1], argc>4
9140: 20 3f 20 61 72 67 76 5b 35 5d 20 3a 20 4e 55 4c   ? argv[5] : NUL
9150: 4c 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  L);.  Tcl_Append
9160: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
9170: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
9180: 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72  free(z);.  retur
9190: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
91a0: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
91b0: 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c  e3_mprintf_doubl
91c0: 65 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52  e FORMAT INTEGER
91d0: 20 49 4e 54 45 47 45 52 20 44 4f 55 42 4c 45 0a   INTEGER DOUBLE.
91e0: 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e  **.** Call mprin
91f0: 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74 65  tf with two inte
9200: 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61 6e  ger arguments an
9210: 64 20 6f 6e 65 20 64 6f 75 62 6c 65 20 61 72 67  d one double arg
9220: 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20  ument.*/.static 
9230: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  int sqlite3_mpri
9240: 6e 74 66 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f  ntf_double(.  vo
9250: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
9260: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
9270: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
9280: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
9290: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
92a0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
92b0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
92c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
92d0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
92e0: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
92f0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
9300: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
9310: 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c  /.){.  int a[3],
9320: 20 69 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a   i;.  double r;.
9330: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28    char *z;.  if(
9340: 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20   argc!=5 ){.    
9350: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
9360: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
9370: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
9380: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
9390: 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20         " FORMAT 
93a0: 49 4e 54 20 49 4e 54 20 44 4f 55 42 4c 45 5c 22  INT INT DOUBLE\"
93b0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
93c0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
93d0: 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b  .  for(i=2; i<4;
93e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54   i++){.    if( T
93f0: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
9400: 2c 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d  , argv[i], &a[i-
9410: 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  2]) ) return TCL
9420: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
9430: 28 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 28  ( Tcl_GetDouble(
9440: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 34 5d 2c  interp, argv[4],
9450: 20 26 72 29 20 29 20 72 65 74 75 72 6e 20 54 43   &r) ) return TC
9460: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 20 3d 20 73  L_ERROR;.  z = s
9470: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
9480: 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b  rgv[1], a[0], a[
9490: 31 5d 2c 20 72 29 3b 0a 20 20 54 63 6c 5f 41 70  1], r);.  Tcl_Ap
94a0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
94b0: 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69  p, z, 0);.  sqli
94c0: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72  te3_free(z);.  r
94d0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
94e0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
94f0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
9500: 63 61 6c 65 64 20 46 4f 52 4d 41 54 20 44 4f 55  caled FORMAT DOU
9510: 42 4c 45 20 44 4f 55 42 4c 45 0a 2a 2a 0a 2a 2a  BLE DOUBLE.**.**
9520: 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69   Call mprintf wi
9530: 74 68 20 61 20 73 69 6e 67 6c 65 20 64 6f 75 62  th a single doub
9540: 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63  le argument whic
9550: 68 20 69 73 20 74 68 65 20 70 72 6f 64 75 63 74  h is the product
9560: 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20 61   of the.** two a
9570: 72 67 75 6d 65 6e 74 73 20 67 69 76 65 6e 20 61  rguments given a
9580: 62 6f 76 65 2e 20 20 54 68 69 73 20 69 73 20 75  bove.  This is u
9590: 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20  sed to generate 
95a0: 6f 76 65 72 66 6c 6f 77 20 61 6e 64 20 75 6e 64  overflow and und
95b0: 65 72 66 6c 6f 77 0a 2a 2a 20 64 6f 75 62 6c 65  erflow.** double
95c0: 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 74  s to test that t
95d0: 68 65 79 20 61 72 65 20 63 6f 6e 76 65 72 74 65  hey are converte
95e0: 64 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 73  d properly..*/.s
95f0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
9600: 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65 64  3_mprintf_scaled
9610: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
9620: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
9630: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
9640: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
9650: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
9660: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
9670: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
9680: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9690: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
96a0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
96b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
96c0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
96d0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ment */.){.  int
96e0: 20 69 3b 0a 20 20 64 6f 75 62 6c 65 20 72 5b 32   i;.  double r[2
96f0: 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ];.  char *z;.  
9700: 69 66 28 20 61 72 67 63 21 3d 34 20 29 7b 0a 20  if( argc!=4 ){. 
9710: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
9720: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
9730: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
9740: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
9750: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d  ],.       " FORM
9760: 41 54 20 44 4f 55 42 4c 45 20 44 4f 55 42 4c 45  AT DOUBLE DOUBLE
9770: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
9780: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9790: 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c   }.  for(i=2; i<
97a0: 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  4; i++){.    if(
97b0: 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 28 69   Tcl_GetDouble(i
97c0: 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20  nterp, argv[i], 
97d0: 26 72 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72  &r[i-2]) ) retur
97e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
97f0: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  z = sqlite3_m
9800: 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20  printf(argv[1], 
9810: 72 5b 30 5d 2a 72 5b 31 5d 29 3b 0a 20 20 54 63  r[0]*r[1]);.  Tc
9820: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
9830: 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20  nterp, z, 0);.  
9840: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
9850: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
9860: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
9870: 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  :  sqlite3_mprin
9880: 74 66 5f 73 74 72 6f 6e 6c 79 20 46 4f 52 4d 41  tf_stronly FORMA
9890: 54 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43  T STRING.**.** C
98a0: 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68  all mprintf with
98b0: 20 61 20 73 69 6e 67 6c 65 20 64 6f 75 62 6c 65   a single double
98c0: 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20   argument which 
98d0: 69 73 20 74 68 65 20 70 72 6f 64 75 63 74 20 6f  is the product o
98e0: 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20 61 72 67  f the.** two arg
98f0: 75 6d 65 6e 74 73 20 67 69 76 65 6e 20 61 62 6f  uments given abo
9900: 76 65 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  ve.  This is use
9910: 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 6f 76  d to generate ov
9920: 65 72 66 6c 6f 77 20 61 6e 64 20 75 6e 64 65 72  erflow and under
9930: 66 6c 6f 77 0a 2a 2a 20 64 6f 75 62 6c 65 73 20  flow.** doubles 
9940: 74 6f 20 74 65 73 74 20 74 68 61 74 20 74 68 65  to test that the
9950: 79 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20  y are converted 
9960: 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 73 74 61  properly..*/.sta
9970: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  tic int sqlite3_
9980: 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 28  mprintf_stronly(
9990: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
99a0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
99b0: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
99c0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
99d0: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
99e0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
99f0: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
9a00: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9a10: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
9a20: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
9a30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
9a40: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
9a50: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  ent */.){.  char
9a60: 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 21   *z;.  if( argc!
9a70: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
9a80: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
9a90: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
9aa0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
9ab0: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
9ac0: 20 22 20 46 4f 52 4d 41 54 20 53 54 52 49 4e 47   " FORMAT STRING
9ad0: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
9ae0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9af0: 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33   }.  z = sqlite3
9b00: 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d  _mprintf(argv[1]
9b10: 2c 20 61 72 67 76 5b 32 5d 29 3b 0a 20 20 54 63  , argv[2]);.  Tc
9b20: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
9b30: 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20  nterp, z, 0);.  
9b40: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
9b50: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
9b60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
9b70: 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  :  sqlite3_mprin
9b80: 74 66 5f 68 65 78 64 6f 75 62 6c 65 20 46 4f 52  tf_hexdouble FOR
9b90: 4d 41 54 20 48 45 58 0a 2a 2a 0a 2a 2a 20 43 61  MAT HEX.**.** Ca
9ba0: 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20  ll mprintf with 
9bb0: 61 20 73 69 6e 67 6c 65 20 64 6f 75 62 6c 65 20  a single double 
9bc0: 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69  argument which i
9bd0: 73 20 64 65 72 69 76 65 64 20 66 72 6f 6d 20 74  s derived from t
9be0: 68 65 0a 2a 2a 20 68 65 78 61 64 65 63 69 6d 61  he.** hexadecima
9bf0: 6c 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 6e  l encoding of an
9c00: 20 49 45 45 45 20 64 6f 75 62 6c 65 2e 0a 2a 2f   IEEE double..*/
9c10: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
9c20: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64  te3_mprintf_hexd
9c30: 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 4e  ouble(.  void *N
9c40: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
9c50: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
9c60: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
9c70: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
9c80: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
9c90: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
9ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9cb0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
9cc0: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
9cd0: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
9ce0: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
9cf0: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
9d00: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 64 6f 75    char *z;.  dou
9d10: 62 6c 65 20 72 3b 0a 20 20 75 6e 73 69 67 6e 65  ble r;.  unsigne
9d20: 64 20 69 6e 74 20 78 31 2c 20 78 32 3b 0a 20 20  d int x1, x2;.  
9d30: 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 20 64 3b  sqlite_uint64 d;
9d40: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29  .  if( argc!=3 )
9d50: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
9d60: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
9d70: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
9d80: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
9d90: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46  v[0],.       " F
9da0: 4f 52 4d 41 54 20 53 54 52 49 4e 47 5c 22 22 2c  ORMAT STRING\"",
9db0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
9dc0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
9dd0: 20 69 66 28 20 73 73 63 61 6e 66 28 61 72 67 76   if( sscanf(argv
9de0: 5b 32 5d 2c 20 22 25 30 38 78 25 30 38 78 22 2c  [2], "%08x%08x",
9df0: 20 26 78 32 2c 20 26 78 31 29 21 3d 32 20 29 7b   &x2, &x1)!=2 ){
9e00: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
9e10: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 32  esult(interp, "2
9e20: 6e 64 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75  nd argument shou
9e30: 6c 64 20 62 65 20 31 36 2d 63 68 61 72 61 63 74  ld be 16-charact
9e40: 65 72 73 20 6f 66 20 68 65 78 22 2c 20 30 29 3b  ers of hex", 0);
9e50: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
9e60: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 64 20 3d  ERROR;.  }.  d =
9e70: 20 78 32 3b 0a 20 20 64 20 3d 20 28 64 3c 3c 33   x2;.  d = (d<<3
9e80: 32 29 20 2b 20 78 31 3b 0a 20 20 6d 65 6d 63 70  2) + x1;.  memcp
9e90: 79 28 26 72 2c 20 26 64 2c 20 73 69 7a 65 6f 66  y(&r, &d, sizeof
9ea0: 28 72 29 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  (r));.  z = sqli
9eb0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76  te3_mprintf(argv
9ec0: 5b 31 5d 2c 20 72 29 3b 0a 20 20 54 63 6c 5f 41  [1], r);.  Tcl_A
9ed0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9ee0: 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c  rp, z, 0);.  sql
9ef0: 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
9f00: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
9f10: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
9f20: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68  qlite3_enable_sh
9f30: 61 72 65 64 5f 63 61 63 68 65 20 3f 42 4f 4f 4c  ared_cache ?BOOL
9f40: 45 41 4e 3f 0a 2a 2a 0a 2a 2f 0a 23 69 66 20 21  EAN?.**.*/.#if !
9f50: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
9f60: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
9f70: 29 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  ).static int tes
9f80: 74 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 28  t_enable_shared(
9f90: 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
9fa0: 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
9fb0: 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
9fc0: 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
9fd0: 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
9fe0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
9ff0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
a000: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
a010: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
a020: 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
a030: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a040: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
a050: 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
a060: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
a070: 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
a080: 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ents */.){.  int
a090: 20 72 63 3b 0a 20 20 69 6e 74 20 65 6e 61 62 6c   rc;.  int enabl
a0a0: 65 3b 0a 20 20 69 6e 74 20 72 65 74 20 3d 20 30  e;.  int ret = 0
a0b0: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
a0c0: 20 26 26 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20   && objc!=1 ){. 
a0d0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
a0e0: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
a0f0: 62 6a 76 2c 20 22 3f 42 4f 4f 4c 45 41 4e 3f 22  bjv, "?BOOLEAN?"
a100: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
a110: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
a120: 65 74 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  et = sqlite3Glob
a130: 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43  alConfig.sharedC
a140: 61 63 68 65 45 6e 61 62 6c 65 64 3b 0a 0a 20 20  acheEnabled;..  
a150: 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
a160: 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f     if( Tcl_GetBo
a170: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
a180: 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 65  erp, objv[1], &e
a190: 6e 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 20 20  nable) ){.      
a1a0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a1b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
a1c0: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
a1d0: 73 68 61 72 65 64 5f 63 61 63 68 65 28 65 6e 61  shared_cache(ena
a1e0: 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ble);.    if( rc
a1f0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
a200: 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75       Tcl_SetResu
a210: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
a220: 20 2a 29 73 71 6c 69 74 65 33 45 72 72 53 74 72   *)sqlite3ErrStr
a230: 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43  (rc), TCL_STATIC
a240: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
a250: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
a260: 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62  .  }.  Tcl_SetOb
a270: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
a280: 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62  Tcl_NewBooleanOb
a290: 6a 28 72 65 74 29 29 3b 0a 20 20 72 65 74 75 72  j(ret));.  retur
a2a0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  n TCL_OK;.}.#end
a2b0: 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  if..../*.** Usag
a2c0: 65 3a 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  e: sqlite3_exten
a2d0: 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73  ded_result_codes
a2e0: 20 20 20 44 42 20 20 20 20 42 4f 4f 4c 45 41 4e     DB    BOOLEAN
a2f0: 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
a300: 74 20 74 65 73 74 5f 65 78 74 65 6e 64 65 64 5f  t test_extended_
a310: 72 65 73 75 6c 74 5f 63 6f 64 65 73 28 0a 20 20  result_codes(.  
a320: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
a330: 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
a340: 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
a350: 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
a360: 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
a370: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
a380: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
a390: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
a3a0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
a3b0: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
a3c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
a3d0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
a3e0: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
a3f0: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
a400: 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
a410: 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 6e  s */.){.  int en
a420: 61 62 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 20  able;.  sqlite3 
a430: 2a 64 62 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  *db;..  if( objc
a440: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=3 ){.    Tcl_W
a450: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
a460: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
a470: 20 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20 20 20   BOOLEAN");.    
a480: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a490: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
a4a0: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
a4b0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
a4c0: 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
a4d0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a4e0: 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42  ;.  if( Tcl_GetB
a4f0: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
a500: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
a510: 65 6e 61 62 6c 65 29 20 29 20 72 65 74 75 72 6e  enable) ) return
a520: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71   TCL_ERROR;.  sq
a530: 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72  lite3_extended_r
a540: 65 73 75 6c 74 5f 63 6f 64 65 73 28 64 62 2c 20  esult_codes(db, 
a550: 65 6e 61 62 6c 65 29 3b 0a 20 20 72 65 74 75 72  enable);.  retur
a560: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
a570: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
a580: 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d  3_libversion_num
a590: 62 65 72 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  ber.**.*/.static
a5a0: 20 69 6e 74 20 74 65 73 74 5f 6c 69 62 76 65 72   int test_libver
a5b0: 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 0a 20 20 43  sion_number(.  C
a5c0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
a5d0: 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
a5e0: 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
a5f0: 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
a600: 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
a610: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
a620: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
a630: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
a640: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
a650: 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
a660: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
a670: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
a680: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
a690: 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
a6a0: 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
a6b0: 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 53 65 74   */.){.  Tcl_Set
a6c0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
a6d0: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
a6e0: 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
a6f0: 6f 6e 5f 6e 75 6d 62 65 72 28 29 29 29 3b 0a 20  on_number()));. 
a700: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
a710: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
a720: 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f  sqlite3_table_co
a730: 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 20 44 42  lumn_metadata DB
a740: 20 64 62 6e 61 6d 65 20 74 62 6c 6e 61 6d 65 20   dbname tblname 
a750: 63 6f 6c 6e 61 6d 65 0a 2a 2a 0a 2a 2f 0a 23 69  colname.**.*/.#i
a760: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
a770: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
a780: 54 41 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  TA.static int te
a790: 73 74 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  st_table_column_
a7a0: 6d 65 74 61 64 61 74 61 28 0a 20 20 43 6c 69 65  metadata(.  Clie
a7b0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
a7c0: 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
a7d0: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
a7e0: 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
a7f0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
a800: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
a810: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
a820: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
a830: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
a840: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
a850: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a860: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
a870: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
a880: 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
a890: 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
a8a0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
a8b0: 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
a8c0: 2a 7a 44 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68  *zDb;.  const ch
a8d0: 61 72 20 2a 7a 54 62 6c 3b 0a 20 20 63 6f 6e 73  ar *zTbl;.  cons
a8e0: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20  t char *zCol;.  
a8f0: 69 6e 74 20 72 63 3b 0a 20 20 54 63 6c 5f 4f 62  int rc;.  Tcl_Ob
a900: 6a 20 2a 70 52 65 74 3b 0a 0a 20 20 63 6f 6e 73  j *pRet;..  cons
a910: 74 20 63 68 61 72 20 2a 7a 44 61 74 61 74 79 70  t char *zDatatyp
a920: 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
a930: 2a 7a 43 6f 6c 6c 73 65 71 3b 0a 20 20 69 6e 74  *zCollseq;.  int
a940: 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 6e 74 20   notnull;.  int 
a950: 70 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20 69 6e  primarykey;.  in
a960: 74 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 3b  t autoincrement;
a970: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20  ..  if( objc!=5 
a980: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
a990: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
a9a0: 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 64 62 6e  1, objv, "DB dbn
a9b0: 61 6d 65 20 74 62 6c 6e 61 6d 65 20 63 6f 6c 6e  ame tblname coln
a9c0: 61 6d 65 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ame");.    retur
a9d0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
a9e0: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
a9f0: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
aa00: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
aa10: 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
aa20: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
aa30: 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  Db = Tcl_GetStri
aa40: 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7a  ng(objv[2]);.  z
aa50: 54 62 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Tbl = Tcl_GetStr
aa60: 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20  ing(objv[3]);.  
aa70: 7a 43 6f 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  zCol = Tcl_GetSt
aa80: 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 0a  ring(objv[4]);..
aa90: 20 20 69 66 28 20 73 74 72 6c 65 6e 28 7a 44 62    if( strlen(zDb
aaa0: 29 3d 3d 30 20 29 20 7a 44 62 20 3d 20 30 3b 0a  )==0 ) zDb = 0;.
aab0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
aac0: 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
aad0: 61 64 61 74 61 28 64 62 2c 20 7a 44 62 2c 20 7a  adata(db, zDb, z
aae0: 54 62 6c 2c 20 7a 43 6f 6c 2c 20 0a 20 20 20 20  Tbl, zCol, .    
aaf0: 20 20 26 7a 44 61 74 61 74 79 70 65 2c 20 26 7a    &zDatatype, &z
ab00: 43 6f 6c 6c 73 65 71 2c 20 26 6e 6f 74 6e 75 6c  Collseq, &notnul
ab10: 6c 2c 20 26 70 72 69 6d 61 72 79 6b 65 79 2c 20  l, &primarykey, 
ab20: 26 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 3b  &autoincrement);
ab30: 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
ab40: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  TE_OK ){.    Tcl
ab50: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
ab60: 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72  terp, sqlite3_er
ab70: 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20  rmsg(db), 0);.  
ab80: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
ab90: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 52 65 74 20  OR;.  }..  pRet 
aba0: 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a  = Tcl_NewObj();.
abb0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
abc0: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
abd0: 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  et, Tcl_NewStrin
abe0: 67 4f 62 6a 28 7a 44 61 74 61 74 79 70 65 2c 20  gObj(zDatatype, 
abf0: 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  -1));.  Tcl_List
ac00: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
ac10: 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  (0, pRet, Tcl_Ne
ac20: 77 53 74 72 69 6e 67 4f 62 6a 28 7a 43 6f 6c 6c  wStringObj(zColl
ac30: 73 65 71 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  seq, -1));.  Tcl
ac40: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
ac50: 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54  ement(0, pRet, T
ac60: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 6f 74  cl_NewIntObj(not
ac70: 6e 75 6c 6c 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  null));.  Tcl_Li
ac80: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
ac90: 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f  nt(0, pRet, Tcl_
aca0: 4e 65 77 49 6e 74 4f 62 6a 28 70 72 69 6d 61 72  NewIntObj(primar
acb0: 79 6b 65 79 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  ykey));.  Tcl_Li
acc0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
acd0: 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f  nt(0, pRet, Tcl_
ace0: 4e 65 77 49 6e 74 4f 62 6a 28 61 75 74 6f 69 6e  NewIntObj(autoin
acf0: 63 72 65 6d 65 6e 74 29 29 3b 0a 20 20 54 63 6c  crement));.  Tcl
ad00: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
ad10: 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 0a 20 20  terp, pRet);..  
ad20: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
ad30: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
ad40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
ad50: 52 42 4c 4f 42 0a 0a 73 74 61 74 69 63 20 69 6e  RBLOB..static in
ad60: 74 20 62 6c 6f 62 48 61 6e 64 6c 65 46 72 6f 6d  t blobHandleFrom
ad70: 4f 62 6a 28 0a 20 20 54 63 6c 5f 49 6e 74 65 72  Obj(.  Tcl_Inter
ad80: 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20 54 63  p *interp, .  Tc
ad90: 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 2c 0a 20 20 73  l_Obj *pObj,.  s
ada0: 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 2a 70 70  qlite3_blob **pp
adb0: 42 6c 6f 62 0a 29 7b 0a 20 20 63 68 61 72 20 2a  Blob.){.  char *
adc0: 7a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 7a  z;.  int n;..  z
add0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
ade0: 46 72 6f 6d 4f 62 6a 28 70 4f 62 6a 2c 20 26 6e  FromObj(pObj, &n
adf0: 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b  );.  if( n==0 ){
ae00: 0a 20 20 20 20 2a 70 70 42 6c 6f 62 20 3d 20 30  .    *ppBlob = 0
ae10: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
ae20: 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20  nt notUsed;.    
ae30: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e  Tcl_Channel chan
ae40: 6e 65 6c 3b 0a 20 20 20 20 43 6c 69 65 6e 74 44  nel;.    ClientD
ae50: 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61  ata instanceData
ae60: 3b 0a 20 20 20 20 0a 20 20 20 20 63 68 61 6e 6e  ;.    .    chann
ae70: 65 6c 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e  el = Tcl_GetChan
ae80: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 7a 2c 20 26  nel(interp, z, &
ae90: 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66  notUsed);.    if
aea0: 28 20 21 63 68 61 6e 6e 65 6c 20 29 20 72 65 74  ( !channel ) ret
aeb0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
aec0: 20 20 20 20 54 63 6c 5f 46 6c 75 73 68 28 63 68      Tcl_Flush(ch
aed0: 61 6e 6e 65 6c 29 3b 0a 20 20 20 20 54 63 6c 5f  annel);.    Tcl_
aee0: 53 65 65 6b 28 63 68 61 6e 6e 65 6c 2c 20 30 2c  Seek(channel, 0,
aef0: 20 53 45 45 4b 5f 53 45 54 29 3b 0a 0a 20 20 20   SEEK_SET);..   
af00: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 20 3d 20   instanceData = 
af10: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e  Tcl_GetChannelIn
af20: 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 6e  stanceData(chann
af30: 65 6c 29 3b 0a 20 20 20 20 2a 70 70 42 6c 6f 62  el);.    *ppBlob
af40: 20 3d 20 2a 28 28 73 71 6c 69 74 65 33 5f 62 6c   = *((sqlite3_bl
af50: 6f 62 20 2a 2a 29 69 6e 73 74 61 6e 63 65 44 61  ob **)instanceDa
af60: 74 61 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ta);.  }..  retu
af70: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
af80: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  .** sqlite3_blob
af90: 5f 62 79 74 65 73 20 20 43 48 41 4e 4e 45 4c 0a  _bytes  CHANNEL.
afa0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
afb0: 73 74 5f 62 6c 6f 62 5f 62 79 74 65 73 28 0a 20  st_blob_bytes(. 
afc0: 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
afd0: 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75  ntData, /* Not u
afe0: 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  sed */.  Tcl_Int
aff0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
b000: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
b010: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
b020: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
b030: 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
b040: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b050: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
b060: 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
b070: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
b080: 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
b090: 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
b0a0: 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62  ite3_blob *pBlob
b0b0: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
b0c0: 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20   .  if( objc!=2 
b0d0: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
b0e0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
b0f0: 31 2c 20 6f 62 6a 76 2c 20 22 43 48 41 4e 4e 45  1, objv, "CHANNE
b100: 4c 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  L");.    return 
b110: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
b120: 20 20 69 66 28 20 62 6c 6f 62 48 61 6e 64 6c 65    if( blobHandle
b130: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
b140: 6f 62 6a 76 5b 31 5d 2c 20 26 70 42 6c 6f 62 29  objv[1], &pBlob)
b150: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
b160: 52 4f 52 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73  ROR;.  nByte = s
b170: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65  qlite3_blob_byte
b180: 73 28 70 42 6c 6f 62 29 3b 0a 20 20 54 63 6c 5f  s(pBlob);.  Tcl_
b190: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
b1a0: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
b1b0: 62 6a 28 6e 42 79 74 65 29 29 3b 0a 0a 20 20 72  bj(nByte));..  r
b1c0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
b1d0: 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 62  ./*.** sqlite3_b
b1e0: 6c 6f 62 5f 63 6c 6f 73 65 20 20 43 48 41 4e 4e  lob_close  CHANN
b1f0: 45 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  EL.*/.static int
b200: 20 74 65 73 74 5f 62 6c 6f 62 5f 63 6c 6f 73 65   test_blob_close
b210: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
b220: 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f  lientData, /* No
b230: 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  t used */.  Tcl_
b240: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
b250: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
b260: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
b270: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
b280: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
b290: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
b2a0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
b2b0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
b2c0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
b2d0: 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
b2e0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
b2f0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42  sqlite3_blob *pB
b300: 6c 6f 62 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62  lob;.  .  if( ob
b310: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
b320: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
b330: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
b340: 43 48 41 4e 4e 45 4c 22 29 3b 0a 20 20 20 20 72  CHANNEL");.    r
b350: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b360: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 6c 6f 62  .  }..  if( blob
b370: 48 61 6e 64 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e  HandleFromObj(in
b380: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26  terp, objv[1], &
b390: 70 42 6c 6f 62 29 20 29 20 72 65 74 75 72 6e 20  pBlob) ) return 
b3a0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c  TCL_ERROR;.  sql
b3b0: 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28  ite3_blob_close(
b3c0: 70 42 6c 6f 62 29 3b 0a 0a 20 20 72 65 74 75 72  pBlob);..  retur
b3d0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
b3e0: 2a 2a 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f  ** sqlite3_blob_
b3f0: 72 65 61 64 20 20 43 48 41 4e 4e 45 4c 20 4f 46  read  CHANNEL OF
b400: 46 53 45 54 20 4e 0a 2a 2a 0a 2a 2a 20 20 20 54  FSET N.**.**   T
b410: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75  his command is u
b420: 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 65 20  sed to test the 
b430: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61  sqlite3_blob_rea
b440: 64 28 29 20 69 6e 20 77 61 79 73 20 74 68 61 74  d() in ways that
b450: 0a 2a 2a 20 20 20 74 68 65 20 54 63 6c 20 63 68  .**   the Tcl ch
b460: 61 6e 6e 65 6c 20 69 6e 74 65 72 66 61 63 65 20  annel interface 
b470: 64 6f 65 73 20 6e 6f 74 2e 20 54 68 65 20 66 69  does not. The fi
b480: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 73 68 6f  rst argument sho
b490: 75 6c 64 0a 2a 2a 20 20 20 62 65 20 74 68 65 20  uld.**   be the 
b4a0: 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 20  name of a valid 
b4b0: 63 68 61 6e 6e 65 6c 20 63 72 65 61 74 65 64 20  channel created 
b4c0: 62 79 20 74 68 65 20 5b 69 6e 63 72 62 6c 6f 62  by the [incrblob
b4d0: 5d 20 6d 65 74 68 6f 64 0a 2a 2a 20 20 20 6f 66  ] method.**   of
b4e0: 20 61 20 64 61 74 61 62 61 73 65 20 68 61 6e 64   a database hand
b4f0: 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  le. This functio
b500: 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f  n calls sqlite3_
b510: 62 6c 6f 62 5f 72 65 61 64 28 29 0a 2a 2a 20 20  blob_read().**  
b520: 20 74 6f 20 72 65 61 64 20 4e 20 62 79 74 65 73   to read N bytes
b530: 20 66 72 6f 6d 20 6f 66 66 73 65 74 20 4f 46 46   from offset OFF
b540: 53 45 54 20 66 72 6f 6d 20 74 68 65 20 75 6e 64  SET from the und
b550: 65 72 6c 79 69 6e 67 20 53 51 4c 69 74 65 0a 2a  erlying SQLite.*
b560: 2a 20 20 20 62 6c 6f 62 20 68 61 6e 64 6c 65 2e  *   blob handle.
b570: 0a 2a 2a 0a 2a 2a 20 20 20 4f 6e 20 73 75 63 63  .**.**   On succ
b580: 65 73 73 2c 20 61 20 62 79 74 65 2d 61 72 72 61  ess, a byte-arra
b590: 79 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e  y object contain
b5a0: 69 6e 67 20 74 68 65 20 72 65 61 64 20 64 61 74  ing the read dat
b5b0: 61 20 69 73 20 0a 2a 2a 20 20 20 72 65 74 75 72  a is .**   retur
b5c0: 6e 65 64 2e 20 4f 6e 20 66 61 69 6c 75 72 65 2c  ned. On failure,
b5d0: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
b5e0: 20 72 65 73 75 6c 74 20 69 73 20 73 65 74 20 74   result is set t
b5f0: 6f 20 74 68 65 0a 2a 2a 20 20 20 74 65 78 74 20  o the.**   text 
b600: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
b610: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 65  f the returned e
b620: 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20  rror code (i.e. 
b630: 22 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 29 0a  "SQLITE_NOMEM").
b640: 2a 2a 20 20 20 61 6e 64 20 61 20 54 63 6c 20 65  **   and a Tcl e
b650: 78 63 65 70 74 69 6f 6e 20 69 73 20 74 68 72 6f  xception is thro
b660: 77 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  wn..*/.static in
b670: 74 20 74 65 73 74 5f 62 6c 6f 62 5f 72 65 61 64  t test_blob_read
b680: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
b690: 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f  lientData, /* No
b6a0: 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  t used */.  Tcl_
b6b0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
b6c0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
b6d0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
b6e0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
b6f0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
b700: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
b710: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
b720: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
b730: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
b740: 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
b750: 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
b760: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42  sqlite3_blob *pB
b770: 6c 6f 62 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  lob;.  int nByte
b780: 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b  ;.  int iOffset;
b790: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
b7a0: 20 2a 7a 42 75 66 20 3d 20 30 3b 0a 20 20 69 6e   *zBuf = 0;.  in
b7b0: 74 20 72 63 3b 0a 20 20 0a 20 20 69 66 28 20 6f  t rc;.  .  if( o
b7c0: 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
b7d0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
b7e0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
b7f0: 22 43 48 41 4e 4e 45 4c 20 4f 46 46 53 45 54 20  "CHANNEL OFFSET 
b800: 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  N");.    return 
b810: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
b820: 20 20 69 66 28 20 62 6c 6f 62 48 61 6e 64 6c 65    if( blobHandle
b830: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
b840: 6f 62 6a 76 5b 31 5d 2c 20 26 70 42 6c 6f 62 29  objv[1], &pBlob)
b850: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
b860: 52 4f 52 3b 0a 20 20 69 66 28 20 54 43 4c 5f 4f  ROR;.  if( TCL_O
b870: 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  K!=Tcl_GetIntFro
b880: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
b890: 76 5b 32 5d 2c 20 26 69 4f 66 66 73 65 74 29 0a  v[2], &iOffset).
b8a0: 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63     || TCL_OK!=Tc
b8b0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
b8c0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
b8d0: 20 26 6e 42 79 74 65 29 0a 20 20 29 7b 20 0a 20   &nByte).  ){ . 
b8e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
b8f0: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
b900: 6e 42 79 74 65 3e 30 20 29 7b 0a 20 20 20 20 7a  nByte>0 ){.    z
b910: 42 75 66 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  Buf = (unsigned 
b920: 63 68 61 72 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63  char *)Tcl_Alloc
b930: 28 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72  (nByte);.  }.  r
b940: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
b950: 5f 72 65 61 64 28 70 42 6c 6f 62 2c 20 7a 42 75  _read(pBlob, zBu
b960: 66 2c 20 6e 42 79 74 65 2c 20 69 4f 66 66 73 65  f, nByte, iOffse
b970: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
b980: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
b990: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
b9a0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
b9b0: 79 74 65 41 72 72 61 79 4f 62 6a 28 7a 42 75 66  yteArrayObj(zBuf
b9c0: 2c 20 6e 42 79 74 65 29 29 3b 0a 20 20 7d 65 6c  , nByte));.  }el
b9d0: 73 65 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52  se{.    Tcl_SetR
b9e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
b9f0: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72 72  har *)sqlite3Err
ba00: 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 56 4f  Name(rc), TCL_VO
ba10: 4c 41 54 49 4c 45 29 3b 0a 20 20 7d 0a 20 20 54  LATILE);.  }.  T
ba20: 63 6c 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  cl_Free((char *)
ba30: 7a 42 75 66 29 3b 0a 0a 20 20 72 65 74 75 72 6e  zBuf);..  return
ba40: 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   (rc==SQLITE_OK 
ba50: 3f 20 54 43 4c 5f 4f 4b 20 3a 20 54 43 4c 5f 45  ? TCL_OK : TCL_E
ba60: 52 52 4f 52 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  RROR);.}../*.** 
ba70: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69  sqlite3_blob_wri
ba80: 74 65 20 43 48 41 4e 4e 45 4c 20 4f 46 46 53 45  te CHANNEL OFFSE
ba90: 54 20 44 41 54 41 20 3f 4e 44 41 54 41 3f 0a 2a  T DATA ?NDATA?.*
baa0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 63 6f 6d 6d  *.**   This comm
bab0: 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 74  and is used to t
bac0: 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f  est the sqlite3_
bad0: 62 6c 6f 62 5f 77 72 69 74 65 28 29 20 69 6e 20  blob_write() in 
bae0: 77 61 79 73 20 74 68 61 74 0a 2a 2a 20 20 20 74  ways that.**   t
baf0: 68 65 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 69  he Tcl channel i
bb00: 6e 74 65 72 66 61 63 65 20 64 6f 65 73 20 6e 6f  nterface does no
bb10: 74 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67  t. The first arg
bb20: 75 6d 65 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20  ument should.** 
bb30: 20 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66    be the name of
bb40: 20 61 20 76 61 6c 69 64 20 63 68 61 6e 6e 65 6c   a valid channel
bb50: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20   created by the 
bb60: 5b 69 6e 63 72 62 6c 6f 62 5d 20 6d 65 74 68 6f  [incrblob] metho
bb70: 64 0a 2a 2a 20 20 20 6f 66 20 61 20 64 61 74 61  d.**   of a data
bb80: 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 54 68 69  base handle. Thi
bb90: 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  s function calls
bba0: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72   sqlite3_blob_wr
bbb0: 69 74 65 28 29 0a 2a 2a 20 20 20 74 6f 20 77 72  ite().**   to wr
bbc0: 69 74 65 20 74 68 65 20 44 41 54 41 20 62 79 74  ite the DATA byt
bbd0: 65 2d 61 72 72 61 79 20 74 6f 20 74 68 65 20 75  e-array to the u
bbe0: 6e 64 65 72 6c 79 69 6e 67 20 53 51 4c 69 74 65  nderlying SQLite
bbf0: 20 62 6c 6f 62 20 68 61 6e 64 6c 65 2e 0a 2a 2a   blob handle..**
bc00: 20 20 20 61 74 20 6f 66 66 73 65 74 20 4f 46 46     at offset OFF
bc10: 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 4f 6e 20  SET..**.**   On 
bc20: 73 75 63 63 65 73 73 2c 20 61 6e 20 65 6d 70 74  success, an empt
bc30: 79 20 73 74 72 69 6e 67 20 69 73 20 72 65 74 75  y string is retu
bc40: 72 6e 65 64 2e 20 4f 6e 20 66 61 69 6c 75 72 65  rned. On failure
bc50: 2c 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  , the interprete
bc60: 72 0a 2a 2a 20 20 20 72 65 73 75 6c 74 20 69 73  r.**   result is
bc70: 20 73 65 74 20 74 6f 20 74 68 65 20 74 65 78 74   set to the text
bc80: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
bc90: 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  of the returned 
bca0: 65 72 72 6f 72 20 63 6f 64 65 20 0a 2a 2a 20 20  error code .**  
bcb0: 20 28 69 2e 65 2e 20 22 53 51 4c 49 54 45 5f 4e   (i.e. "SQLITE_N
bcc0: 4f 4d 45 4d 22 29 20 61 6e 64 20 61 20 54 63 6c  OMEM") and a Tcl
bcd0: 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 74 68   exception is th
bce0: 72 6f 77 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rown..*/.static 
bcf0: 69 6e 74 20 74 65 73 74 5f 62 6c 6f 62 5f 77 72  int test_blob_wr
bd00: 69 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  ite(.  ClientDat
bd10: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
bd20: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54   Not used */.  T
bd30: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
bd40: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
bd50: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
bd60: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
bd70: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
bd80: 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
bd90: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
bda0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
bdb0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
bdc0: 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
bdd0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
bde0: 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20  .  sqlite3_blob 
bdf0: 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 69 4f  *pBlob;.  int iO
be00: 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 72 63 3b  ffset;.  int rc;
be10: 0a 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ..  unsigned cha
be20: 72 20 2a 7a 42 75 66 3b 0a 20 20 69 6e 74 20 6e  r *zBuf;.  int n
be30: 42 75 66 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62  Buf;.  .  if( ob
be40: 6a 63 21 3d 34 20 26 26 20 6f 62 6a 63 21 3d 35  jc!=4 && objc!=5
be50: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
be60: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
be70: 20 31 2c 20 6f 62 6a 76 2c 20 22 43 48 41 4e 4e   1, objv, "CHANN
be80: 45 4c 20 4f 46 46 53 45 54 20 44 41 54 41 20 3f  EL OFFSET DATA ?
be90: 4e 44 41 54 41 3f 22 29 3b 0a 20 20 20 20 72 65  NDATA?");.    re
bea0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
beb0: 20 20 7d 0a 0a 20 20 69 66 28 20 62 6c 6f 62 48    }..  if( blobH
bec0: 61 6e 64 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74  andleFromObj(int
bed0: 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 70  erp, objv[1], &p
bee0: 42 6c 6f 62 29 20 29 20 72 65 74 75 72 6e 20 54  Blob) ) return T
bef0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
bf00: 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49  TCL_OK!=Tcl_GetI
bf10: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
bf20: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 4f 66 66  , objv[2], &iOff
bf30: 73 65 74 29 20 29 7b 20 0a 20 20 20 20 72 65 74  set) ){ .    ret
bf40: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
bf50: 20 7d 0a 0a 20 20 7a 42 75 66 20 3d 20 54 63 6c   }..  zBuf = Tcl
bf60: 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
bf70: 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e  mObj(objv[3], &n
bf80: 42 75 66 29 3b 0a 20 20 69 66 28 20 6f 62 6a 63  Buf);.  if( objc
bf90: 3d 3d 35 20 26 26 20 54 63 6c 5f 47 65 74 49 6e  ==5 && Tcl_GetIn
bfa0: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
bfb0: 20 6f 62 6a 76 5b 34 5d 2c 20 26 6e 42 75 66 29   objv[4], &nBuf)
bfc0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
bfd0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
bfe0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
bff0: 62 5f 77 72 69 74 65 28 70 42 6c 6f 62 2c 20 7a  b_write(pBlob, z
c000: 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66 73  Buf, nBuf, iOffs
c010: 65 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  et);.  if( rc!=S
c020: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c030: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
c040: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
c050: 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
c060: 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
c070: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28  .  }..  return (
c080: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
c090: 54 43 4c 5f 4f 4b 20 3a 20 54 43 4c 5f 45 52 52  TCL_OK : TCL_ERR
c0a0: 4f 52 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  OR);.}..static i
c0b0: 6e 74 20 74 65 73 74 5f 62 6c 6f 62 5f 72 65 6f  nt test_blob_reo
c0c0: 70 65 6e 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  pen(.  ClientDat
c0d0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
c0e0: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54   Not used */.  T
c0f0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
c100: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
c110: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
c120: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
c130: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
c140: 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
c150: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c160: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
c170: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
c180: 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
c190: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
c1a0: 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 69  .  Tcl_WideInt i
c1b0: 52 6f 77 69 64 3b 0a 20 20 73 71 6c 69 74 65 33  Rowid;.  sqlite3
c1c0: 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20  _blob *pBlob;.  
c1d0: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
c1e0: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
c1f0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
c200: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
c210: 22 43 48 41 4e 4e 45 4c 20 52 4f 57 49 44 22 29  "CHANNEL ROWID")
c220: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
c230: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
c240: 66 28 20 62 6c 6f 62 48 61 6e 64 6c 65 46 72 6f  f( blobHandleFro
c250: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
c260: 76 5b 31 5d 2c 20 26 70 42 6c 6f 62 29 20 29 20  v[1], &pBlob) ) 
c270: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
c280: 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 57  ;.  if( Tcl_GetW
c290: 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  ideIntFromObj(in
c2a0: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
c2b0: 69 52 6f 77 69 64 29 20 29 20 72 65 74 75 72 6e  iRowid) ) return
c2c0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
c2d0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
c2e0: 5f 72 65 6f 70 65 6e 28 70 42 6c 6f 62 2c 20 69  _reopen(pBlob, i
c2f0: 52 6f 77 69 64 29 3b 0a 20 20 69 66 28 20 72 63  Rowid);.  if( rc
c300: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
c310: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
c320: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
c330: 29 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28  )sqlite3ErrName(
c340: 72 63 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  rc), TCL_VOLATIL
c350: 45 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  E);.  }..  retur
c360: 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
c370: 20 3f 20 54 43 4c 5f 4f 4b 20 3a 20 54 43 4c 5f   ? TCL_OK : TCL_
c380: 45 52 52 4f 52 29 3b 0a 7d 0a 0a 23 65 6e 64 69  ERROR);.}..#endi
c390: 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  f../*.** Usage: 
c3a0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
c3b0: 6f 6c 6c 61 74 69 6f 6e 5f 76 32 20 44 42 2d 48  ollation_v2 DB-H
c3c0: 41 4e 44 4c 45 20 4e 41 4d 45 20 43 4d 50 2d 50  ANDLE NAME CMP-P
c3d0: 52 4f 43 20 44 45 4c 2d 50 52 4f 43 0a 2a 2a 0a  ROC DEL-PROC.**.
c3e0: 2a 2a 20 20 20 54 68 69 73 20 54 63 6c 20 70 72  **   This Tcl pr
c3f0: 6f 63 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  oc is used for t
c400: 65 73 74 69 6e 67 20 74 68 65 20 65 78 70 65 72  esting the exper
c410: 69 6d 65 6e 74 61 6c 0a 2a 2a 20 20 20 73 71 6c  imental.**   sql
c420: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
c430: 61 74 69 6f 6e 5f 76 32 28 29 20 69 6e 74 65 72  ation_v2() inter
c440: 66 61 63 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  face..*/.struct 
c450: 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 7b  TestCollationX {
c460: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
c470: 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a  nterp;.  Tcl_Obj
c480: 20 2a 70 43 6d 70 3b 0a 20 20 54 63 6c 5f 4f 62   *pCmp;.  Tcl_Ob
c490: 6a 20 2a 70 44 65 6c 3b 0a 7d 3b 0a 74 79 70 65  j *pDel;.};.type
c4a0: 64 65 66 20 73 74 72 75 63 74 20 54 65 73 74 43  def struct TestC
c4b0: 6f 6c 6c 61 74 69 6f 6e 58 20 54 65 73 74 43 6f  ollationX TestCo
c4c0: 6c 6c 61 74 69 6f 6e 58 3b 0a 73 74 61 74 69 63  llationX;.static
c4d0: 20 76 6f 69 64 20 74 65 73 74 43 72 65 61 74 65   void testCreate
c4e0: 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c 28 76 6f 69  CollationDel(voi
c4f0: 64 20 2a 70 43 74 78 29 7b 0a 20 20 54 65 73 74  d *pCtx){.  Test
c500: 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 70 20 3d 20  CollationX *p = 
c510: 28 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20  (TestCollationX 
c520: 2a 29 70 43 74 78 3b 0a 0a 20 20 69 6e 74 20 72  *)pCtx;..  int r
c530: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  c = Tcl_EvalObjE
c540: 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e  x(p->interp, p->
c550: 70 44 65 6c 2c 20 54 43 4c 5f 45 56 41 4c 5f 44  pDel, TCL_EVAL_D
c560: 49 52 45 43 54 7c 54 43 4c 5f 45 56 41 4c 5f 47  IRECT|TCL_EVAL_G
c570: 4c 4f 42 41 4c 29 3b 0a 20 20 69 66 28 20 72 63  LOBAL);.  if( rc
c580: 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20  !=TCL_OK ){.    
c590: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72  Tcl_BackgroundEr
c5a0: 72 6f 72 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a  ror(p->interp);.
c5b0: 20 20 7d 0a 0a 20 20 54 63 6c 5f 44 65 63 72 52    }..  Tcl_DecrR
c5c0: 65 66 43 6f 75 6e 74 28 70 2d 3e 70 43 6d 70 29  efCount(p->pCmp)
c5d0: 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
c5e0: 6f 75 6e 74 28 70 2d 3e 70 44 65 6c 29 3b 0a 20  ount(p->pDel);. 
c5f0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 28 76   sqlite3_free((v
c600: 6f 69 64 20 2a 29 70 29 3b 0a 7d 0a 73 74 61 74  oid *)p);.}.stat
c610: 69 63 20 69 6e 74 20 74 65 73 74 43 72 65 61 74  ic int testCreat
c620: 65 43 6f 6c 6c 61 74 69 6f 6e 43 6d 70 28 0a 20  eCollationCmp(. 
c630: 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69   void *pCtx,.  i
c640: 6e 74 20 6e 4c 65 66 74 2c 0a 20 20 63 6f 6e 73  nt nLeft,.  cons
c650: 74 20 76 6f 69 64 20 2a 7a 4c 65 66 74 2c 0a 20  t void *zLeft,. 
c660: 20 69 6e 74 20 6e 52 69 67 68 74 2c 0a 20 20 63   int nRight,.  c
c670: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 52 69 67 68  onst void *zRigh
c680: 74 0a 29 7b 0a 20 20 54 65 73 74 43 6f 6c 6c 61  t.){.  TestColla
c690: 74 69 6f 6e 58 20 2a 70 20 3d 20 28 54 65 73 74  tionX *p = (Test
c6a0: 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 29 70 43 74  CollationX *)pCt
c6b0: 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53  x;.  Tcl_Obj *pS
c6c0: 63 72 69 70 74 20 3d 20 54 63 6c 5f 44 75 70 6c  cript = Tcl_Dupl
c6d0: 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70 43 6d 70  icateObj(p->pCmp
c6e0: 29 3b 0a 20 20 69 6e 74 20 69 52 65 73 20 3d 20  );.  int iRes = 
c6f0: 30 3b 0a 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  0;..  Tcl_IncrRe
c700: 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b  fCount(pScript);
c710: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
c720: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
c730: 53 63 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53  Script, Tcl_NewS
c740: 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a  tringObj((char *
c750: 29 7a 4c 65 66 74 2c 20 6e 4c 65 66 74 29 29 3b  )zLeft, nLeft));
c760: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
c770: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
c780: 53 63 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53  Script, Tcl_NewS
c790: 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a  tringObj((char *
c7a0: 29 7a 52 69 67 68 74 2c 6e 52 69 67 68 74 29 29  )zRight,nRight))
c7b0: 3b 0a 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21  ;..  if( TCL_OK!
c7c0: 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70  =Tcl_EvalObjEx(p
c7d0: 2d 3e 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70  ->interp, pScrip
c7e0: 74 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45  t, TCL_EVAL_DIRE
c7f0: 43 54 7c 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42  CT|TCL_EVAL_GLOB
c800: 41 4c 29 0a 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b  AL).   || TCL_OK
c810: 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  !=Tcl_GetIntFrom
c820: 4f 62 6a 28 70 2d 3e 69 6e 74 65 72 70 2c 20 54  Obj(p->interp, T
c830: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
c840: 70 2d 3e 69 6e 74 65 72 70 29 2c 20 26 69 52 65  p->interp), &iRe
c850: 73 29 0a 20 20 29 7b 0a 20 20 20 20 54 63 6c 5f  s).  ){.    Tcl_
c860: 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28  BackgroundError(
c870: 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a  p->interp);.  }.
c880: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
c890: 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 0a 20 20  nt(pScript);..  
c8a0: 72 65 74 75 72 6e 20 69 52 65 73 3b 0a 7d 0a 73  return iRes;.}.s
c8b0: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63  tatic int test_c
c8c0: 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  reate_collation_
c8d0: 76 32 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  v2(.  ClientData
c8e0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
c8f0: 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63  Not used */.  Tc
c900: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
c910: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
c920: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
c930: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
c940: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
c950: 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
c960: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
c970: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
c980: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
c990: 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
c9a0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
c9b0: 20 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58    TestCollationX
c9c0: 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *p;.  sqlite3 *
c9d0: 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  db;.  int rc;.. 
c9e0: 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a   if( objc!=5 ){.
c9f0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
ca00: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
ca10: 6f 62 6a 76 2c 20 22 44 42 2d 48 41 4e 44 4c 45  objv, "DB-HANDLE
ca20: 20 4e 41 4d 45 20 43 4d 50 2d 50 52 4f 43 20 44   NAME CMP-PROC D
ca30: 45 4c 2d 50 52 4f 43 22 29 3b 0a 20 20 20 20 72  EL-PROC");.    r
ca40: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ca50: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
ca60: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
ca70: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
ca80: 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
ca90: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
caa0: 0a 0a 20 20 70 20 3d 20 28 54 65 73 74 43 6f 6c  ..  p = (TestCol
cab0: 6c 61 74 69 6f 6e 58 20 2a 29 73 71 6c 69 74 65  lationX *)sqlite
cac0: 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
cad0: 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 29 29  TestCollationX))
cae0: 3b 0a 20 20 70 2d 3e 70 43 6d 70 20 3d 20 6f 62  ;.  p->pCmp = ob
caf0: 6a 76 5b 33 5d 3b 0a 20 20 70 2d 3e 70 44 65 6c  jv[3];.  p->pDel
cb00: 20 3d 20 6f 62 6a 76 5b 34 5d 3b 0a 20 20 70 2d   = objv[4];.  p-
cb10: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
cb20: 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
cb30: 6f 75 6e 74 28 70 2d 3e 70 43 6d 70 29 3b 0a 20  ount(p->pCmp);. 
cb40: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
cb50: 74 28 70 2d 3e 70 44 65 6c 29 3b 0a 0a 20 20 72  t(p->pDel);..  r
cb60: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
cb70: 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28  te_collation_v2(
cb80: 64 62 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  db, Tcl_GetStrin
cb90: 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 31 36 2c 20  g(objv[2]), 16, 
cba0: 0a 20 20 20 20 20 20 28 76 6f 69 64 20 2a 29 70  .      (void *)p
cbb0: 2c 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c  , testCreateColl
cbc0: 61 74 69 6f 6e 43 6d 70 2c 20 74 65 73 74 43 72  ationCmp, testCr
cbd0: 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c  eateCollationDel
cbe0: 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  .  );.  if( rc!=
cbf0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 29 7b  SQLITE_MISUSE ){
cc00: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
cc10: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 73  esult(interp, "s
cc20: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
cc30: 6c 6c 61 74 65 5f 76 32 28 29 20 66 61 69 6c 65  llate_v2() faile
cc40: 64 20 74 6f 20 64 65 74 65 63 74 20 22 0a 20 20  d to detect ".  
cc50: 20 20 20 20 22 61 6e 20 69 6e 76 61 6c 69 64 20      "an invalid 
cc60: 65 6e 63 6f 64 69 6e 67 22 2c 20 28 63 68 61 72  encoding", (char
cc70: 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  *)0);.    return
cc80: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
cc90: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
cca0: 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  reate_collation_
ccb0: 76 32 28 64 62 2c 20 54 63 6c 5f 47 65 74 53 74  v2(db, Tcl_GetSt
ccc0: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 53  ring(objv[2]), S
ccd0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20  QLITE_UTF8, .   
cce0: 20 20 20 28 76 6f 69 64 20 2a 29 70 2c 20 74 65     (void *)p, te
ccf0: 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f  stCreateCollatio
cd00: 6e 43 6d 70 2c 20 74 65 73 74 43 72 65 61 74 65  nCmp, testCreate
cd10: 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c 0a 20 20 29  CollationDel.  )
cd20: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
cd30: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 53 41 47  K;.}../*.** USAG
cd40: 45 3a 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  E: sqlite3_creat
cd50: 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 44 42  e_function_v2 DB
cd60: 20 4e 41 4d 45 20 4e 41 52 47 20 45 4e 43 20 3f   NAME NARG ENC ?
cd70: 53 57 49 54 43 48 45 53 3f 0a 2a 2a 0a 2a 2a 20  SWITCHES?.**.** 
cd80: 41 76 61 69 6c 61 62 6c 65 20 73 77 69 74 63 68  Available switch
cd90: 65 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  es are:.**.**   
cda0: 2d 66 75 6e 63 20 20 20 20 53 43 52 49 50 54 0a  -func    SCRIPT.
cdb0: 2a 2a 20 20 20 2d 73 74 65 70 20 20 20 20 53 43  **   -step    SC
cdc0: 52 49 50 54 0a 2a 2a 20 20 20 2d 66 69 6e 61 6c  RIPT.**   -final
cdd0: 20 20 20 53 43 52 49 50 54 0a 2a 2a 20 20 20 2d     SCRIPT.**   -
cde0: 64 65 73 74 72 6f 79 20 53 43 52 49 50 54 0a 2a  destroy SCRIPT.*
cdf0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
ce00: 20 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56   CreateFunctionV
ce10: 32 20 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e  2 CreateFunction
ce20: 56 32 3b 0a 73 74 72 75 63 74 20 43 72 65 61 74  V2;.struct Creat
ce30: 65 46 75 6e 63 74 69 6f 6e 56 32 20 7b 0a 20 20  eFunctionV2 {.  
ce40: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
ce50: 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  rp;.  Tcl_Obj *p
ce60: 46 75 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Func;           
ce70: 20 20 20 20 20 20 2f 2a 20 53 63 72 69 70 74 20        /* Script 
ce80: 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76  for function inv
ce90: 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  ocation */.  Tcl
cea0: 5f 4f 62 6a 20 2a 70 53 74 65 70 3b 20 20 20 20  _Obj *pStep;    
ceb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cec0: 53 63 72 69 70 74 20 66 6f 72 20 61 67 67 2e 20  Script for agg. 
ced0: 73 74 65 70 20 69 6e 76 6f 63 61 74 69 6f 6e 20  step invocation 
cee0: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 46  */.  Tcl_Obj *pF
cef0: 69 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  inal;           
cf00: 20 20 20 20 20 2f 2a 20 53 63 72 69 70 74 20 66       /* Script f
cf10: 6f 72 20 61 67 67 2e 20 66 69 6e 61 6c 69 7a 61  or agg. finaliza
cf20: 74 69 6f 6e 20 69 6e 76 6f 63 61 74 69 6f 6e 20  tion invocation 
cf30: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 44  */.  Tcl_Obj *pD
cf40: 65 73 74 72 6f 79 3b 20 20 20 20 20 20 20 20 20  estroy;         
cf50: 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74       /* Destruct
cf60: 6f 72 20 73 63 72 69 70 74 20 2a 2f 0a 7d 3b 0a  or script */.};.
cf70: 73 74 61 74 69 63 20 76 6f 69 64 20 63 66 32 46  static void cf2F
cf80: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
cf90: 65 78 74 20 2a 63 74 78 2c 20 69 6e 74 20 6e 41  ext *ctx, int nA
cfa0: 72 67 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  rg, sqlite3_valu
cfb0: 65 20 2a 2a 61 41 72 67 29 7b 0a 7d 0a 73 74 61  e **aArg){.}.sta
cfc0: 74 69 63 20 76 6f 69 64 20 63 66 32 53 74 65 70  tic void cf2Step
cfd0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
cfe0: 20 2a 63 74 78 2c 20 69 6e 74 20 6e 41 72 67 2c   *ctx, int nArg,
cff0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
d000: 2a 61 41 72 67 29 7b 0a 7d 0a 73 74 61 74 69 63  *aArg){.}.static
d010: 20 76 6f 69 64 20 63 66 32 46 69 6e 61 6c 28 73   void cf2Final(s
d020: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
d030: 63 74 78 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76  ctx){.}.static v
d040: 6f 69 64 20 63 66 32 44 65 73 74 72 6f 79 28 76  oid cf2Destroy(v
d050: 6f 69 64 20 2a 70 55 73 65 72 29 7b 0a 20 20 43  oid *pUser){.  C
d060: 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 20  reateFunctionV2 
d070: 2a 70 20 3d 20 28 43 72 65 61 74 65 46 75 6e 63  *p = (CreateFunc
d080: 74 69 6f 6e 56 32 20 2a 29 70 55 73 65 72 3b 0a  tionV2 *)pUser;.
d090: 0a 20 20 69 66 28 20 70 2d 3e 69 6e 74 65 72 70  .  if( p->interp
d0a0: 20 26 26 20 70 2d 3e 70 44 65 73 74 72 6f 79 20   && p->pDestroy 
d0b0: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
d0c0: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d  Tcl_EvalObjEx(p-
d0d0: 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 70 44 65 73  >interp, p->pDes
d0e0: 74 72 6f 79 2c 20 30 29 3b 0a 20 20 20 20 69 66  troy, 0);.    if
d0f0: 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 54  ( rc!=TCL_OK ) T
d100: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72  cl_BackgroundErr
d110: 6f 72 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20  or(p->interp);. 
d120: 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 70 46 75   }..  if( p->pFu
d130: 6e 63 20 29 20 54 63 6c 5f 44 65 63 72 52 65 66  nc ) Tcl_DecrRef
d140: 43 6f 75 6e 74 28 70 2d 3e 70 46 75 6e 63 29 3b  Count(p->pFunc);
d150: 20 0a 20 20 69 66 28 20 70 2d 3e 70 53 74 65 70   .  if( p->pStep
d160: 20 29 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f   ) Tcl_DecrRefCo
d170: 75 6e 74 28 70 2d 3e 70 53 74 65 70 29 3b 20 0a  unt(p->pStep); .
d180: 20 20 69 66 28 20 70 2d 3e 70 46 69 6e 61 6c 20    if( p->pFinal 
d190: 29 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75  ) Tcl_DecrRefCou
d1a0: 6e 74 28 70 2d 3e 70 46 69 6e 61 6c 29 3b 20 0a  nt(p->pFinal); .
d1b0: 20 20 69 66 28 20 70 2d 3e 70 44 65 73 74 72 6f    if( p->pDestro
d1c0: 79 20 29 20 54 63 6c 5f 44 65 63 72 52 65 66 43  y ) Tcl_DecrRefC
d1d0: 6f 75 6e 74 28 70 2d 3e 70 44 65 73 74 72 6f 79  ount(p->pDestroy
d1e0: 29 3b 20 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  ); .  sqlite3_fr
d1f0: 65 65 28 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20  ee(p);.}.static 
d200: 69 6e 74 20 74 65 73 74 5f 63 72 65 61 74 65 5f  int test_create_
d210: 66 75 6e 63 74 69 6f 6e 5f 76 32 28 0a 20 20 43  function_v2(.  C
d220: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
d230: 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 2f  Data,          /
d240: 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20  * Not used */.  
d250: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
d260: 72 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rp,             
d270: 2f 2a 20 54 68 65 20 69 6e 76 6f 6b 69 6e 67 20  /* The invoking 
d280: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
d290: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
d2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
d2c0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
d2d0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
d2e0: 6f 62 6a 76 5b 5d 20 20 20 20 20 20 20 20 20 20  objv[]          
d2f0: 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
d300: 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
d310: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
d320: 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 3b 0a  st char *zFunc;.
d330: 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 69 6e    int nArg;.  in
d340: 74 20 65 6e 63 3b 0a 20 20 43 72 65 61 74 65 46  t enc;.  CreateF
d350: 75 6e 63 74 69 6f 6e 56 32 20 2a 70 3b 0a 20 20  unctionV2 *p;.  
d360: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b  int i;.  int rc;
d370: 0a 0a 20 20 73 74 72 75 63 74 20 45 6e 63 54 61  ..  struct EncTa
d380: 62 6c 65 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ble {.    const 
d390: 63 68 61 72 20 2a 7a 45 6e 63 3b 0a 20 20 20 20  char *zEnc;.    
d3a0: 69 6e 74 20 65 6e 63 3b 0a 20 20 7d 20 61 45 6e  int enc;.  } aEn
d3b0: 63 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 22 75 74  c[] = {.    {"ut
d3c0: 66 38 22 2c 20 20 20 20 53 51 4c 49 54 45 5f 55  f8",    SQLITE_U
d3d0: 54 46 38 20 7d 2c 0a 20 20 20 20 7b 22 75 74 66  TF8 },.    {"utf
d3e0: 31 36 22 2c 20 20 20 53 51 4c 49 54 45 5f 55 54  16",   SQLITE_UT
d3f0: 46 31 36 20 7d 2c 0a 20 20 20 20 7b 22 75 74 66  F16 },.    {"utf
d400: 31 36 6c 65 22 2c 20 53 51 4c 49 54 45 5f 55 54  16le", SQLITE_UT
d410: 46 31 36 4c 45 20 7d 2c 0a 20 20 20 20 7b 22 75  F16LE },.    {"u
d420: 74 66 31 36 62 65 22 2c 20 53 51 4c 49 54 45 5f  tf16be", SQLITE_
d430: 55 54 46 31 36 42 45 20 7d 2c 0a 20 20 20 20 7b  UTF16BE },.    {
d440: 22 61 6e 79 22 2c 20 20 20 20 20 53 51 4c 49 54  "any",     SQLIT
d450: 45 5f 41 4e 59 20 7d 2c 0a 20 20 20 20 7b 22 30  E_ANY },.    {"0
d460: 22 2c 20 30 20 7d 0a 20 20 7d 3b 0a 0a 20 20 69  ", 0 }.  };..  i
d470: 66 28 20 6f 62 6a 63 3c 35 20 7c 7c 20 28 6f 62  f( objc<5 || (ob
d480: 6a 63 25 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  jc%2)==0 ){.    
d490: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
d4a0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
d4b0: 2c 20 22 44 42 20 4e 41 4d 45 20 4e 41 52 47 20  , "DB NAME NARG 
d4c0: 45 4e 43 20 53 57 49 54 43 48 45 53 2e 2e 2e 22  ENC SWITCHES..."
d4d0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
d4e0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
d4f0: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
d500: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
d510: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
d520: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
d530: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 46 75 6e  CL_ERROR;.  zFun
d540: 63 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  c = Tcl_GetStrin
d550: 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66  g(objv[2]);.  if
d560: 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
d570: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
d580: 5b 33 5d 2c 20 26 6e 41 72 67 29 20 29 20 72 65  [3], &nArg) ) re
d590: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d5a0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64    if( Tcl_GetInd
d5b0: 65 78 46 72 6f 6d 4f 62 6a 53 74 72 75 63 74 28  exFromObjStruct(
d5c0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
d5d0: 20 61 45 6e 63 2c 20 73 69 7a 65 6f 66 28 61 45   aEnc, sizeof(aE
d5e0: 6e 63 5b 30 5d 29 2c 20 0a 20 20 20 20 20 20 20  nc[0]), .       
d5f0: 20 20 20 22 65 6e 63 6f 64 69 6e 67 22 2c 20 30     "encoding", 0
d600: 2c 20 26 65 6e 63 29 0a 20 20 29 7b 0a 20 20 20  , &enc).  ){.   
d610: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
d620: 52 3b 0a 20 20 7d 0a 20 20 65 6e 63 20 3d 20 61  R;.  }.  enc = a
d630: 45 6e 63 5b 65 6e 63 5d 2e 65 6e 63 3b 0a 0a 20  Enc[enc].enc;.. 
d640: 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c   p = sqlite3_mal
d650: 6c 6f 63 28 73 69 7a 65 6f 66 28 43 72 65 61 74  loc(sizeof(Creat
d660: 65 46 75 6e 63 74 69 6f 6e 56 32 29 29 3b 0a 20  eFunctionV2));. 
d670: 20 61 73 73 65 72 74 28 20 70 20 29 3b 0a 20 20   assert( p );.  
d680: 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
d690: 65 6f 66 28 43 72 65 61 74 65 46 75 6e 63 74 69  eof(CreateFuncti
d6a0: 6f 6e 56 32 29 29 3b 0a 20 20 70 2d 3e 69 6e 74  onV2));.  p->int
d6b0: 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 0a 20  erp = interp;.. 
d6c0: 20 66 6f 72 28 69 3d 35 3b 20 69 3c 6f 62 6a 63   for(i=5; i<objc
d6d0: 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 69 6e 74  ; i+=2){.    int
d6e0: 20 69 53 77 69 74 63 68 3b 0a 20 20 20 20 63 6f   iSwitch;.    co
d6f0: 6e 73 74 20 63 68 61 72 20 2a 61 7a 53 77 69 74  nst char *azSwit
d700: 63 68 5b 5d 20 3d 20 7b 22 2d 66 75 6e 63 22 2c  ch[] = {"-func",
d710: 20 22 2d 73 74 65 70 22 2c 20 22 2d 66 69 6e 61   "-step", "-fina
d720: 6c 22 2c 20 22 2d 64 65 73 74 72 6f 79 22 2c 20  l", "-destroy", 
d730: 30 7d 3b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f  0};.    if( Tcl_
d740: 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28  GetIndexFromObj(
d750: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 5d 2c  interp, objv[i],
d760: 20 61 7a 53 77 69 74 63 68 2c 20 22 73 77 69 74   azSwitch, "swit
d770: 63 68 22 2c 20 30 2c 20 26 69 53 77 69 74 63 68  ch", 0, &iSwitch
d780: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
d790: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
d7a0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
d7b0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  OR;.    }..    s
d7c0: 77 69 74 63 68 28 20 69 53 77 69 74 63 68 20 29  witch( iSwitch )
d7d0: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 30 3a 20  {.      case 0: 
d7e0: 70 2d 3e 70 46 75 6e 63 20 3d 20 6f 62 6a 76 5b  p->pFunc = objv[
d7f0: 69 2b 31 5d 3b 20 20 20 20 20 20 62 72 65 61 6b  i+1];      break
d800: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 31 3a 20  ;.      case 1: 
d810: 70 2d 3e 70 53 74 65 70 20 3d 20 6f 62 6a 76 5b  p->pStep = objv[
d820: 69 2b 31 5d 3b 20 20 20 20 20 20 62 72 65 61 6b  i+1];      break
d830: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 32 3a 20  ;.      case 2: 
d840: 70 2d 3e 70 46 69 6e 61 6c 20 3d 20 6f 62 6a 76  p->pFinal = objv
d850: 5b 69 2b 31 5d 3b 20 20 20 20 20 62 72 65 61 6b  [i+1];     break
d860: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 33 3a 20  ;.      case 3: 
d870: 70 2d 3e 70 44 65 73 74 72 6f 79 20 3d 20 6f 62  p->pDestroy = ob
d880: 6a 76 5b 69 2b 31 5d 3b 20 20 20 62 72 65 61 6b  jv[i+1];   break
d890: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
d8a0: 28 20 70 2d 3e 70 46 75 6e 63 20 29 20 70 2d 3e  ( p->pFunc ) p->
d8b0: 70 46 75 6e 63 20 3d 20 54 63 6c 5f 44 75 70 6c  pFunc = Tcl_Dupl
d8c0: 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70 46 75 6e  icateObj(p->pFun
d8d0: 63 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 53  c); .  if( p->pS
d8e0: 74 65 70 20 29 20 70 2d 3e 70 53 74 65 70 20 3d  tep ) p->pStep =
d8f0: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
d900: 6a 28 70 2d 3e 70 53 74 65 70 29 3b 20 0a 20 20  j(p->pStep); .  
d910: 69 66 28 20 70 2d 3e 70 46 69 6e 61 6c 20 29 20  if( p->pFinal ) 
d920: 70 2d 3e 70 46 69 6e 61 6c 20 3d 20 54 63 6c 5f  p->pFinal = Tcl_
d930: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d 3e  DuplicateObj(p->
d940: 70 46 69 6e 61 6c 29 3b 20 0a 20 20 69 66 28 20  pFinal); .  if( 
d950: 70 2d 3e 70 44 65 73 74 72 6f 79 20 29 20 70 2d  p->pDestroy ) p-
d960: 3e 70 44 65 73 74 72 6f 79 20 3d 20 54 63 6c 5f  >pDestroy = Tcl_
d970: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d 3e  DuplicateObj(p->
d980: 70 44 65 73 74 72 6f 79 29 3b 20 0a 0a 20 20 69  pDestroy); ..  i
d990: 66 28 20 70 2d 3e 70 46 75 6e 63 20 29 20 54 63  f( p->pFunc ) Tc
d9a0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
d9b0: 2d 3e 70 46 75 6e 63 29 3b 20 0a 20 20 69 66 28  ->pFunc); .  if(
d9c0: 20 70 2d 3e 70 53 74 65 70 20 29 20 54 63 6c 5f   p->pStep ) Tcl_
d9d0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e  IncrRefCount(p->
d9e0: 70 53 74 65 70 29 3b 20 0a 20 20 69 66 28 20 70  pStep); .  if( p
d9f0: 2d 3e 70 46 69 6e 61 6c 20 29 20 54 63 6c 5f 49  ->pFinal ) Tcl_I
da00: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70  ncrRefCount(p->p
da10: 46 69 6e 61 6c 29 3b 20 0a 20 20 69 66 28 20 70  Final); .  if( p
da20: 2d 3e 70 44 65 73 74 72 6f 79 20 29 20 54 63 6c  ->pDestroy ) Tcl
da30: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 2d  _IncrRefCount(p-
da40: 3e 70 44 65 73 74 72 6f 79 29 3b 20 0a 0a 20 20  >pDestroy); ..  
da50: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
da60: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28  ate_function_v2(
da70: 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c  db, zFunc, nArg,
da80: 20 65 6e 63 2c 20 28 76 6f 69 64 20 2a 29 70 2c   enc, (void *)p,
da90: 20 0a 20 20 20 20 20 20 28 70 2d 3e 70 46 75 6e   .      (p->pFun
daa0: 63 20 3f 20 63 66 32 46 75 6e 63 20 3a 20 30 29  c ? cf2Func : 0)
dab0: 2c 0a 20 20 20 20 20 20 28 70 2d 3e 70 53 74 65  ,.      (p->pSte
dac0: 70 20 3f 20 63 66 32 53 74 65 70 20 3a 20 30 29  p ? cf2Step : 0)
dad0: 2c 0a 20 20 20 20 20 20 28 70 2d 3e 70 46 69 6e  ,.      (p->pFin
dae0: 61 6c 20 3f 20 63 66 32 46 69 6e 61 6c 20 3a 20  al ? cf2Final : 
daf0: 30 29 2c 0a 20 20 20 20 20 20 63 66 32 44 65 73  0),.      cf2Des
db00: 74 72 6f 79 0a 20 20 29 3b 0a 20 20 69 66 28 20  troy.  );.  if( 
db10: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
db20: 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65  .    Tcl_ResetRe
db30: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
db40: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
db50: 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
db60: 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 30  e3ErrName(rc), 0
db70: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
db80: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
db90: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
dba0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
dbb0: 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e  lite3_load_exten
dbc0: 73 69 6f 6e 20 44 42 2d 48 41 4e 44 4c 45 20 46  sion DB-HANDLE F
dbd0: 49 4c 45 20 3f 50 52 4f 43 3f 0a 2a 2f 0a 73 74  ILE ?PROC?.*/.st
dbe0: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 6f  atic int test_lo
dbf0: 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 0a 20 20  ad_extension(.  
dc00: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
dc10: 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73  tData, /* Not us
dc20: 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
dc30: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
dc40: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
dc50: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
dc60: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
dc70: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
dc80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
dc90: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
dca0: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
dcb0: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
dcc0: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
dcd0: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f  nts */.){.  Tcl_
dce0: 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b  CmdInfo cmdInfo;
dcf0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
dd00: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
dd10: 20 2a 7a 44 62 3b 0a 20 20 63 68 61 72 20 2a 7a   *zDb;.  char *z
dd20: 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 50  File;.  char *zP
dd30: 72 6f 63 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  roc = 0;.  char 
dd40: 2a 7a 45 72 72 20 3d 20 30 3b 0a 0a 20 20 69 66  *zErr = 0;..  if
dd50: 28 20 6f 62 6a 63 21 3d 34 20 26 26 20 6f 62 6a  ( objc!=4 && obj
dd60: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
dd70: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
dd80: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
dd90: 42 2d 48 41 4e 44 4c 45 20 46 49 4c 45 20 3f 50  B-HANDLE FILE ?P
dda0: 52 4f 43 3f 22 29 3b 0a 20 20 20 20 72 65 74 75  ROC?");.    retu
ddb0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ddc0: 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65  }.  zDb = Tcl_Ge
ddd0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
dde0: 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f  ;.  zFile = Tcl_
ddf0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
de00: 5d 29 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d  ]);.  if( objc==
de10: 34 20 29 7b 0a 20 20 20 20 7a 50 72 6f 63 20 3d  4 ){.    zProc =
de20: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
de30: 62 6a 76 5b 33 5d 29 3b 0a 20 20 7d 0a 0a 20 20  bjv[3]);.  }..  
de40: 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 43  /* Extract the C
de50: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
de60: 20 66 72 6f 6d 20 74 68 65 20 54 63 6c 20 63 6f   from the Tcl co
de70: 6d 6d 61 6e 64 20 6e 61 6d 65 20 2a 2f 0a 20 20  mmand name */.  
de80: 69 66 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d  if( !Tcl_GetComm
de90: 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20  andInfo(interp, 
dea0: 7a 44 62 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29  zDb, &cmdInfo) )
deb0: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
dec0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
ded0: 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e  command not foun
dee0: 64 3a 20 22 2c 20 7a 44 62 2c 20 28 63 68 61 72  d: ", zDb, (char
def0: 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  *)0);.    return
df00: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
df10: 20 20 64 62 20 3d 20 28 28 73 74 72 75 63 74 20    db = ((struct 
df20: 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e 66  SqliteDb*)cmdInf
df30: 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61 29  o.objClientData)
df40: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 64  ->db;.  assert(d
df50: 62 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c 20 74  b);..  /* Call t
df60: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 43 20  he underlying C 
df70: 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 61 6e 20  function. If an 
df80: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
df90: 74 20 72 63 20 74 6f 20 0a 20 20 2a 2a 20 54 43  t rc to .  ** TC
dfa0: 4c 5f 45 52 52 4f 52 20 61 6e 64 20 6c 6f 61 64  L_ERROR and load
dfb0: 20 61 6e 79 20 65 72 72 6f 72 20 73 74 72 69 6e   any error strin
dfc0: 67 20 69 6e 74 6f 20 74 68 65 20 69 6e 74 65 72  g into the inter
dfd0: 70 72 65 74 65 72 2e 20 49 66 20 6e 6f 20 0a 20  preter. If no . 
dfe0: 20 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73   ** error occurs
dff0: 2c 20 73 65 74 20 72 63 20 74 6f 20 54 43 4c 5f  , set rc to TCL_
e000: 4f 4b 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  OK..  */.#ifdef 
e010: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
e020: 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 72 63 20  _EXTENSION.  rc 
e030: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
e040: 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33    zErr = sqlite3
e050: 5f 6d 70 72 69 6e 74 66 28 22 74 68 69 73 20 62  _mprintf("this b
e060: 75 69 6c 64 20 6f 6d 69 74 73 20 73 71 6c 69 74  uild omits sqlit
e070: 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  e3_load_extensio
e080: 6e 28 29 22 29 3b 0a 23 65 6c 73 65 0a 20 20 72  n()");.#else.  r
e090: 63 20 3d 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64  c = sqlite3_load
e0a0: 5f 65 78 74 65 6e 73 69 6f 6e 28 64 62 2c 20 7a  _extension(db, z
e0b0: 46 69 6c 65 2c 20 7a 50 72 6f 63 2c 20 26 7a 45  File, zProc, &zE
e0c0: 72 72 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  rr);.#endif.  if
e0d0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e0e0: 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
e0f0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72  sult(interp, zEr
e100: 72 20 3f 20 7a 45 72 72 20 3a 20 22 22 2c 20 54  r ? zErr : "", T
e110: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
e120: 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
e130: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
e140: 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a  c = TCL_OK;.  }.
e150: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
e160: 45 72 72 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Err);..  return 
e170: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  rc;.}../*.** Usa
e180: 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 6e 61 62  ge: sqlite3_enab
e190: 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  le_load_extensio
e1a0: 6e 20 44 42 2d 48 41 4e 44 4c 45 20 4f 4e 4f 46  n DB-HANDLE ONOF
e1b0: 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  F.*/.static int 
e1c0: 74 65 73 74 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64  test_enable_load
e1d0: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
e1e0: 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f  lientData, /* No
e1f0: 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  t used */.  Tcl_
e200: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
e210: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
e220: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
e230: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
e240: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
e250: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
e260: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
e270: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
e280: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
e290: 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
e2a0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
e2b0: 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49  Tcl_CmdInfo cmdI
e2c0: 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  nfo;.  sqlite3 *
e2d0: 64 62 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b  db;.  char *zDb;
e2e0: 0a 20 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a 0a 20  .  int onoff;.. 
e2f0: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
e300: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
e310: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
e320: 6f 62 6a 76 2c 20 22 44 42 2d 48 41 4e 44 4c 45  objv, "DB-HANDLE
e330: 20 4f 4e 4f 46 46 22 29 3b 0a 20 20 20 20 72 65   ONOFF");.    re
e340: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
e350: 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f    }.  zDb = Tcl_
e360: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
e370: 5d 29 3b 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63  ]);..  /* Extrac
e380: 74 20 74 68 65 20 43 20 64 61 74 61 62 61 73 65  t the C database
e390: 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 74 68 65   handle from the
e3a0: 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d   Tcl command nam
e3b0: 65 20 2a 2f 0a 20 20 69 66 28 20 21 54 63 6c 5f  e */.  if( !Tcl_
e3c0: 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69  GetCommandInfo(i
e3d0: 6e 74 65 72 70 2c 20 7a 44 62 2c 20 26 63 6d 64  nterp, zDb, &cmd
e3e0: 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c  Info) ){.    Tcl
e3f0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
e400: 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20 6e  terp, "command n
e410: 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 20 7a 44 62  ot found: ", zDb
e420: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
e430: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
e440: 52 3b 0a 20 20 7d 0a 20 20 64 62 20 3d 20 28 28  R;.  }.  db = ((
e450: 73 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 2a  struct SqliteDb*
e460: 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65  )cmdInfo.objClie
e470: 6e 74 44 61 74 61 29 2d 3e 64 62 3b 0a 20 20 61  ntData)->db;.  a
e480: 73 73 65 72 74 28 64 62 29 3b 0a 0a 20 20 2f 2a  ssert(db);..  /*
e490: 20 47 65 74 20 74 68 65 20 6f 6e 6f 66 66 20 70   Get the onoff p
e4a0: 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 66  arameter */.  if
e4b0: 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  ( Tcl_GetBoolean
e4c0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
e4d0: 6f 62 6a 76 5b 32 5d 2c 20 26 6f 6e 6f 66 66 29  objv[2], &onoff)
e4e0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
e4f0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 23  CL_ERROR;.  }..#
e500: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
e510: 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
e520: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
e530: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 74 68 69  ult(interp, "thi
e540: 73 20 62 75 69 6c 64 20 6f 6d 69 74 73 20 73 71  s build omits sq
e550: 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e  lite3_load_exten
e560: 73 69 6f 6e 28 29 22 29 3b 0a 20 20 72 65 74 75  sion()");.  retu
e570: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65  rn TCL_ERROR;.#e
e580: 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 5f 65 6e  lse.  sqlite3_en
e590: 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  able_load_extens
e5a0: 69 6f 6e 28 64 62 2c 20 6f 6e 6f 66 66 29 3b 0a  ion(db, onoff);.
e5b0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
e5c0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
e5d0: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 5f   Usage:  sqlite_
e5e0: 61 62 6f 72 74 0a 2a 2a 0a 2a 2a 20 53 68 75 74  abort.**.** Shut
e5f0: 64 6f 77 6e 20 74 68 65 20 70 72 6f 63 65 73 73  down the process
e600: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 54   immediately.  T
e610: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 63 6c 65  his is not a cle
e620: 61 6e 20 73 68 75 74 64 6f 77 6e 2e 0a 2a 2a 20  an shutdown..** 
e630: 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20  This command is 
e640: 75 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 65  used to test the
e650: 20 72 65 63 6f 76 65 72 61 62 69 6c 69 74 79 20   recoverability 
e660: 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 69 6e  of a database in
e670: 0a 2a 2a 20 74 68 65 20 65 76 65 6e 74 20 6f 66  .** the event of
e680: 20 61 20 70 72 6f 67 72 61 6d 20 63 72 61 73 68   a program crash
e690: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e6a0: 73 71 6c 69 74 65 5f 61 62 6f 72 74 28 0a 20 20  sqlite_abort(.  
e6b0: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
e6c0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
e6d0: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
e6e0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
e6f0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
e700: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
e710: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
e720: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
e730: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
e740: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
e750: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
e760: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
e770: 20 2a 2f 0a 29 7b 0a 23 69 66 20 64 65 66 69 6e   */.){.#if defin
e780: 65 64 28 5f 4d 53 43 5f 56 45 52 29 0a 20 20 2f  ed(_MSC_VER).  /
e790: 2a 20 57 65 20 64 6f 20 74 68 69 73 2c 20 6f 74  * We do this, ot
e7a0: 68 65 72 77 69 73 65 20 74 68 65 20 74 65 73 74  herwise the test
e7b0: 20 77 69 6c 6c 20 68 61 6c 74 20 77 69 74 68 20   will halt with 
e7c0: 61 20 70 6f 70 75 70 20 6d 65 73 73 61 67 65 0a  a popup message.
e7d0: 20 20 20 2a 20 74 68 61 74 20 77 65 20 68 61 76     * that we hav
e7e0: 65 20 74 6f 20 63 6c 69 63 6b 20 61 77 61 79 20  e to click away 
e7f0: 62 65 66 6f 72 65 20 74 68 65 20 74 65 73 74 20  before the test 
e800: 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 2e 0a 20  will continue.. 
e810: 20 20 2a 2f 0a 20 20 5f 73 65 74 5f 61 62 6f 72    */.  _set_abor
e820: 74 5f 62 65 68 61 76 69 6f 72 28 20 30 2c 20 5f  t_behavior( 0, _
e830: 43 41 4c 4c 5f 52 45 50 4f 52 54 46 41 55 4c 54  CALL_REPORTFAULT
e840: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 65 78 69   );.#endif.  exi
e850: 74 28 32 35 35 29 3b 0a 20 20 61 73 73 65 72 74  t(255);.  assert
e860: 28 20 69 6e 74 65 72 70 3d 3d 30 20 29 3b 20 20  ( interp==0 );  
e870: 20 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 61 6c   /* This will al
e880: 77 61 79 73 20 66 61 69 6c 20 2a 2f 0a 20 20 72  ways fail */.  r
e890: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
e8a0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
e8b0: 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20  wing routine is 
e8c0: 61 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 53  a user-defined S
e8d0: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 77 68 6f 73  QL function whos
e8e0: 65 20 70 75 72 70 6f 73 65 0a 2a 2a 20 69 73 20  e purpose.** is 
e8f0: 74 6f 20 74 65 73 74 20 74 68 65 20 73 71 6c 69  to test the sqli
e900: 74 65 5f 73 65 74 5f 72 65 73 75 6c 74 28 29 20  te_set_result() 
e910: 41 50 49 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  API..*/.static v
e920: 6f 69 64 20 74 65 73 74 46 75 6e 63 28 73 71 6c  oid testFunc(sql
e930: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
e940: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
e950: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
e960: 2a 61 72 67 76 29 7b 0a 20 20 77 68 69 6c 65 28  *argv){.  while(
e970: 20 61 72 67 63 3e 3d 32 20 29 7b 0a 20 20 20 20   argc>=2 ){.    
e980: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
e990: 30 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74  0 = (char*)sqlit
e9a0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
e9b0: 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20  gv[0]);.    if( 
e9c0: 7a 41 72 67 30 20 29 7b 0a 20 20 20 20 20 20 69  zArg0 ){.      i
e9d0: 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  f( 0==sqlite3Str
e9e0: 49 43 6d 70 28 7a 41 72 67 30 2c 20 22 69 6e 74  ICmp(zArg0, "int
e9f0: 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ") ){.        sq
ea00: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
ea10: 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65  (context, sqlite
ea20: 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76  3_value_int(argv
ea30: 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  [1]));.      }el
ea40: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  se if( sqlite3St
ea50: 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 69 6e 74  rICmp(zArg0,"int
ea60: 36 34 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  64")==0 ){.     
ea70: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
ea80: 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c  t_int64(context,
ea90: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
eaa0: 6e 74 36 34 28 61 72 67 76 5b 31 5d 29 29 3b 0a  nt64(argv[1]));.
eab0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
eac0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
ead0: 41 72 67 30 2c 22 73 74 72 69 6e 67 22 29 3d 3d  Arg0,"string")==
eae0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
eaf0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
eb00: 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a  (context, (char*
eb10: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
eb20: 65 78 74 28 61 72 67 76 5b 31 5d 29 2c 20 2d 31  ext(argv[1]), -1
eb30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51  ,.            SQ
eb40: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
eb50: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
eb60: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
eb70: 7a 41 72 67 30 2c 22 64 6f 75 62 6c 65 22 29 3d  zArg0,"double")=
eb80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
eb90: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75  lite3_result_dou
eba0: 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c  ble(context, sql
ebb0: 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
ebc0: 65 28 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20  e(argv[1]));.   
ebd0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
ebe0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67  ite3StrICmp(zArg
ebf0: 30 2c 22 6e 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a  0,"null")==0 ){.
ec00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
ec10: 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74  result_null(cont
ec20: 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ext);.      }els
ec30: 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
ec40: 49 43 6d 70 28 7a 41 72 67 30 2c 22 76 61 6c 75  ICmp(zArg0,"valu
ec50: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
ec60: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
ec70: 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20  _value(context, 
ec80: 61 72 67 76 5b 73 71 6c 69 74 65 33 5f 76 61 6c  argv[sqlite3_val
ec90: 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 5d  ue_int(argv[1])]
eca0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
ecb0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72          goto err
ecc0: 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  or_out;.      }.
ecd0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ece0: 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b   goto error_out;
ecf0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 72 67 63 20  .    }.    argc 
ed00: 2d 3d 20 32 3b 0a 20 20 20 20 61 72 67 76 20 2b  -= 2;.    argv +
ed10: 3d 20 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 2;.  }.  retur
ed20: 6e 3b 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20  n;..error_out:. 
ed30: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
ed40: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 22 66  error(context,"f
ed50: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 73 68  irst argument sh
ed60: 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a 20  ould be one of: 
ed70: 22 0a 20 20 20 20 20 20 22 69 6e 74 20 69 6e 74  ".      "int int
ed80: 36 34 20 73 74 72 69 6e 67 20 64 6f 75 62 6c 65  64 string double
ed90: 20 6e 75 6c 6c 20 76 61 6c 75 65 22 2c 20 2d 31   null value", -1
eda0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  );.}../*.** Usag
edb0: 65 3a 20 20 20 73 71 6c 69 74 65 5f 72 65 67 69  e:   sqlite_regi
edc0: 73 74 65 72 5f 74 65 73 74 5f 66 75 6e 63 74 69  ster_test_functi
edd0: 6f 6e 20 20 44 42 20 20 4e 41 4d 45 0a 2a 2a 0a  on  DB  NAME.**.
ede0: 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20  ** Register the 
edf0: 74 65 73 74 20 53 51 4c 20 66 75 6e 63 74 69 6f  test SQL functio
ee00: 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
ee10: 65 20 44 42 20 75 6e 64 65 72 20 74 68 65 20 6e  e DB under the n
ee20: 61 6d 65 20 4e 41 4d 45 2e 0a 2a 2f 0a 73 74 61  ame NAME..*/.sta
ee30: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 72 65 67  tic int test_reg
ee40: 69 73 74 65 72 5f 66 75 6e 63 28 0a 20 20 76 6f  ister_func(.  vo
ee50: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
ee60: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
ee70: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
ee80: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
ee90: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
eea0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
eeb0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
eec0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
eed0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
eee0: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
eef0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
ef00: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
ef10: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
ef20: 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
ef30: 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
ef40: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
ef50: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
ef60: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
ef70: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
ef80: 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44 42 20  ], .       " DB 
ef90: 46 55 4e 43 54 49 4f 4e 2d 4e 41 4d 45 22 2c 20  FUNCTION-NAME", 
efa0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
efb0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
efc0: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
efd0: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
efe0: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
eff0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
f000: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
f010: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 61 72  _function(db, ar
f020: 67 76 5b 32 5d 2c 20 2d 31 2c 20 53 51 4c 49 54  gv[2], -1, SQLIT
f030: 45 5f 55 54 46 38 2c 20 30 2c 20 0a 20 20 20 20  E_UTF8, 0, .    
f040: 20 20 74 65 73 74 46 75 6e 63 2c 20 30 2c 20 30    testFunc, 0, 0
f050: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
f060: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
f070: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73  Result(interp, s
f080: 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29  qlite3ErrStr(rc)
f090: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
f0a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
f0b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
f0c0: 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
f0d0: 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72   db, rc) ) retur
f0e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
f0f0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
f100: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
f110: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20  qlite3_finalize 
f120: 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 46 69 6e   STMT .**.** Fin
f130: 61 6c 69 7a 65 20 61 20 73 74 61 74 65 6d 65 6e  alize a statemen
f140: 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61  t handle..*/.sta
f150: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 66 69 6e  tic int test_fin
f160: 61 6c 69 7a 65 28 0a 20 20 76 6f 69 64 20 2a 20  alize(.  void * 
f170: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
f180: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
f190: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
f1a0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
f1b0: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
f1c0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
f1d0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
f1e0: 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a 0a 20 20  te3 *db = 0;..  
f1f0: 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
f200: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
f210: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
f220: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
f230: 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
f240: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
f250: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
f260: 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30  0), " <STMT>", 0
f270: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
f280: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
f290: 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
f2a0: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
f2b0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
f2c0: 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
f2d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
f2e0: 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
f2f0: 20 20 20 64 62 20 3d 20 53 74 6d 74 54 6f 44 62     db = StmtToDb
f300: 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 72  (pStmt);.  }.  r
f310: 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  c = sqlite3_fina
f320: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 54  lize(pStmt);.  T
f330: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
f340: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
f350: 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
f360: 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28  L_STATIC);.  if(
f370: 20 64 62 20 26 26 20 73 71 6c 69 74 65 33 54 65   db && sqlite3Te
f380: 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
f390: 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
f3a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
f3b0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
f3c0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
f3d0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
f3e0: 74 75 73 20 20 53 54 4d 54 20 20 43 4f 44 45 20  tus  STMT  CODE 
f3f0: 20 52 45 53 45 54 46 4c 41 47 0a 2a 2a 0a 2a 2a   RESETFLAG.**.**
f400: 20 47 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   Get the value o
f410: 66 20 61 20 73 74 61 74 75 73 20 63 6f 75 6e 74  f a status count
f420: 65 72 20 66 72 6f 6d 20 61 20 73 74 61 74 65 6d  er from a statem
f430: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
f440: 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 73 74 61  nt test_stmt_sta
f450: 74 75 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  tus(.  void * cl
f460: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
f470: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
f480: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
f490: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
f4a0: 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 69 56 61  v[].){.  int iVa
f4b0: 6c 75 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6f 70  lue;.  int i, op
f4c0: 2c 20 72 65 73 65 74 46 6c 61 67 3b 0a 20 20 63  , resetFlag;.  c
f4d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61  onst char *zOpNa
f4e0: 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  me;.  sqlite3_st
f4f0: 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 73 74  mt *pStmt;..  st
f500: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
f510: 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  t {.    const ch
f520: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  ar *zName;.    i
f530: 6e 74 20 6f 70 3b 0a 20 20 7d 20 61 4f 70 5b 5d  nt op;.  } aOp[]
f540: 20 3d 20 7b 0a 20 20 20 20 7b 20 22 53 51 4c 49   = {.    { "SQLI
f550: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55  TE_STMTSTATUS_FU
f560: 4c 4c 53 43 41 4e 5f 53 54 45 50 22 2c 20 20 20  LLSCAN_STEP",   
f570: 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
f580: 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 20  S_FULLSCAN_STEP 
f590: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
f5a0: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f  TE_STMTSTATUS_SO
f5b0: 52 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  RT",            
f5c0: 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
f5d0: 53 5f 53 4f 52 54 20 20 20 20 20 20 20 20 20 20  S_SORT          
f5e0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
f5f0: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55  TE_STMTSTATUS_AU
f600: 54 4f 49 4e 44 45 58 22 2c 20 20 20 20 20 20 20  TOINDEX",       
f610: 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
f620: 53 5f 41 55 54 4f 49 4e 44 45 58 20 20 20 20 20  S_AUTOINDEX     
f630: 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 66 28 20    },.  };.  if( 
f640: 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
f650: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
f660: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
f670: 20 22 53 54 4d 54 20 50 41 52 41 4d 45 54 45 52   "STMT PARAMETER
f680: 20 52 45 53 45 54 46 4c 41 47 22 29 3b 0a 20 20   RESETFLAG");.  
f690: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
f6a0: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
f6b0: 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
f6c0: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
f6d0: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
f6e0: 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
f6f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4f 70 4e 61  L_ERROR;.  zOpNa
f700: 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  me = Tcl_GetStri
f710: 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 66  ng(objv[2]);.  f
f720: 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
f730: 69 7a 65 28 61 4f 70 29 3b 20 69 2b 2b 29 7b 0a  ize(aOp); i++){.
f740: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
f750: 4f 70 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4f 70  Op[i].zName, zOp
f760: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
f770: 20 20 6f 70 20 3d 20 61 4f 70 5b 69 5d 2e 6f 70    op = aOp[i].op
f780: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
f790: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69     }.  }.  if( i
f7a0: 3e 3d 41 72 72 61 79 53 69 7a 65 28 61 4f 70 29  >=ArraySize(aOp)
f7b0: 20 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f   ){.    if( Tcl_
f7c0: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
f7d0: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
f7e0: 6f 70 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  op) ) return TCL
f7f0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
f800: 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  ( Tcl_GetBoolean
f810: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
f820: 6f 62 6a 76 5b 33 5d 2c 20 26 72 65 73 65 74 46  objv[3], &resetF
f830: 6c 61 67 29 20 29 20 72 65 74 75 72 6e 20 54 43  lag) ) return TC
f840: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 56 61 6c 75  L_ERROR;.  iValu
f850: 65 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  e = sqlite3_stmt
f860: 5f 73 74 61 74 75 73 28 70 53 74 6d 74 2c 20 6f  _status(pStmt, o
f870: 70 2c 20 72 65 73 65 74 46 6c 61 67 29 3b 0a 20  p, resetFlag);. 
f880: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
f890: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
f8a0: 77 49 6e 74 4f 62 6a 28 69 56 61 6c 75 65 29 29  wIntObj(iValue))
f8b0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
f8c0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
f8d0: 65 3a 20 20 73 71 6c 69 74 65 33 5f 6e 65 78 74  e:  sqlite3_next
f8e0: 5f 73 74 6d 74 20 20 44 42 20 20 53 54 4d 54 0a  _stmt  DB  STMT.
f8f0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
f900: 20 6e 65 78 74 20 73 74 61 74 6d 65 6e 74 20 69   next statment i
f910: 6e 20 73 65 71 75 65 6e 63 65 20 61 66 74 65 72  n sequence after
f920: 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63   STMT..*/.static
f930: 20 69 6e 74 20 74 65 73 74 5f 6e 65 78 74 5f 73   int test_next_s
f940: 74 6d 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  tmt(.  void * cl
f950: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
f960: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
f970: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
f980: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
f990: 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
f9a0: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
f9b0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 30 3b  sqlite3 *db = 0;
f9c0: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d  .  char zBuf[50]
f9d0: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
f9e0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
f9f0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
fa00: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
fa10: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
fa20: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
fa30: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
fa40: 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 53 54  [0], 0), " DB ST
fa50: 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  MT", 0);.    ret
fa60: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
fa70: 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 44 62 50   }..  if( getDbP
fa80: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
fa90: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
faa0: 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
fab0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
fac0: 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
fad0: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
fae0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
faf0: 32 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  2]), &pStmt) ) r
fb00: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
fb10: 0a 20 20 70 53 74 6d 74 20 3d 20 73 71 6c 69 74  .  pStmt = sqlit
fb20: 65 33 5f 6e 65 78 74 5f 73 74 6d 74 28 64 62 2c  e3_next_stmt(db,
fb30: 20 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 70   pStmt);.  if( p
fb40: 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20  Stmt ){.    if( 
fb50: 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50  sqlite3TestMakeP
fb60: 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70  ointerStr(interp
fb70: 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29  , zBuf, pStmt) )
fb80: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
fb90: 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  R;.    Tcl_Appen
fba0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
fbb0: 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  zBuf, 0);.  }.  
fbc0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
fbd0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
fbe0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 72 65 61  sqlite3_stmt_rea
fbf0: 64 6f 6e 6c 79 20 20 53 54 4d 54 0a 2a 2a 0a 2a  donly  STMT.**.*
fc00: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
fc10: 20 53 54 4d 54 20 69 73 20 61 20 4e 55 4c 4c 20   STMT is a NULL 
fc20: 70 6f 69 6e 74 65 72 20 6f 72 20 61 20 70 6f 69  pointer or a poi
fc30: 6e 74 65 72 20 74 6f 20 61 20 73 74 61 74 65 6d  nter to a statem
fc40: 65 6e 74 0a 2a 2a 20 74 68 61 74 20 69 73 20 67  ent.** that is g
fc50: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6c 65 61  uaranteed to lea
fc60: 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ve the database 
fc70: 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73  unmodified..*/.s
fc80: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
fc90: 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 28 0a 20 20  tmt_readonly(.  
fca0: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
fcb0: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
fcc0: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
fcd0: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
fce0: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
fcf0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
fd00: 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b  pStmt;.  int rc;
fd10: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
fd20: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
fd30: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
fd40: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
fd50: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
fd60: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
fd70: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
fd80: 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 22 2c  0], 0), " STMT",
fd90: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
fda0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
fdb0: 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
fdc0: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
fdd0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
fde0: 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
fdf0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
fe00: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
fe10: 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 28 70 53  stmt_readonly(pS
fe20: 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  tmt);.  Tcl_SetO
fe30: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
fe40: 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f   Tcl_NewBooleanO
fe50: 62 6a 28 72 63 29 29 3b 0a 20 20 72 65 74 75 72  bj(rc));.  retur
fe60: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
fe70: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
fe80: 65 33 5f 73 74 6d 74 5f 62 75 73 79 20 20 53 54  e3_stmt_busy  ST
fe90: 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  MT.**.** Return 
fea0: 74 72 75 65 20 69 66 20 53 54 4d 54 20 69 73 20  true if STMT is 
feb0: 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74  a non-NULL point
fec0: 65 72 20 74 6f 20 61 20 73 74 61 74 65 6d 65 6e  er to a statemen
fed0: 74 0a 2a 2a 20 74 68 61 74 20 68 61 73 20 62 65  t.** that has be
fee0: 65 6e 20 73 74 65 70 70 65 64 20 62 75 74 20 6e  en stepped but n
fef0: 6f 74 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e  ot to completion
ff00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ff10: 74 65 73 74 5f 73 74 6d 74 5f 62 75 73 79 28 0a  test_stmt_busy(.
ff20: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
ff30: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
ff40: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
ff50: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
ff60: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
ff70: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
ff80: 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72   *pStmt;.  int r
ff90: 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
ffa0: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
ffb0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
ffc0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
ffd0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
ffe0: 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
fff0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
10000 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54  v[0], 0), " STMT
10010 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
10020 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
10030 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
10040 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
10050 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
10060 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
10070 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
10080 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
10090 33 5f 73 74 6d 74 5f 62 75 73 79 28 70 53 74 6d  3_stmt_busy(pStm
100a0 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  t);.  Tcl_SetObj
100b0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
100c0 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a  cl_NewBooleanObj
100d0 28 72 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  (rc));.  return 
100e0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
100f0 20 55 73 61 67 65 3a 20 20 75 73 65 73 5f 73 74   Usage:  uses_st
10100 6d 74 5f 6a 6f 75 72 6e 61 6c 20 20 53 54 4d 54  mt_journal  STMT
10110 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  .**.** Return tr
10120 75 65 20 69 66 20 53 54 4d 54 20 75 73 65 73 20  ue if STMT uses 
10130 61 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  a statement jour
10140 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nal..*/.static i
10150 6e 74 20 75 73 65 73 5f 73 74 6d 74 5f 6a 6f 75  nt uses_stmt_jou
10160 72 6e 61 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63  rnal(.  void * c
10170 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
10180 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
10190 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
101a0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
101b0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
101c0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a  3_stmt *pStmt;..
101d0 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
101e0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
101f0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
10200 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
10210 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
10220 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
10230 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
10240 2c 20 30 29 2c 20 22 20 53 54 4d 54 22 2c 20 30  , 0), " STMT", 0
10250 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
10260 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
10270 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
10280 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
10290 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
102a0 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
102b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
102c0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 72 65   sqlite3_stmt_re
102d0 61 64 6f 6e 6c 79 28 70 53 74 6d 74 29 3b 0a 20  adonly(pStmt);. 
102e0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
102f0 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
10300 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 28 28 56 64  wBooleanObj(((Vd
10310 62 65 20 2a 29 70 53 74 6d 74 29 2d 3e 75 73 65  be *)pStmt)->use
10320 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 29 29 3b 0a  sStmtJournal));.
10330 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
10340 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  .}.../*.** Usage
10350 3a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74  :  sqlite3_reset
10360 20 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65    STMT .**.** Re
10370 73 65 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  set a statement 
10380 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
10390 63 20 69 6e 74 20 74 65 73 74 5f 72 65 73 65 74  c int test_reset
103a0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
103b0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
103c0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
103d0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
103e0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
103f0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
10400 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
10410 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
10420 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
10430 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
10440 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
10450 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
10460 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
10470 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
10480 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53  bjv[0], 0), " <S
10490 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72  TMT>", 0);.    r
104a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
104b0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
104c0 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
104d0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
104e0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
104f0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
10500 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
10510 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
10520 6d 74 29 3b 0a 20 20 69 66 28 20 70 53 74 6d 74  mt);.  if( pStmt
10530 20 26 26 20 73 71 6c 69 74 65 33 54 65 73 74 45   && sqlite3TestE
10540 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53  rrCode(interp, S
10550 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20  tmtToDb(pStmt), 
10560 72 63 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  rc) ){.    retur
10570 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
10580 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
10590 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
105a0 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
105b0 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 2f  , TCL_STATIC);./
105c0 2a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  *.  if( rc ){.  
105d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
105e0 4f 52 3b 0a 20 20 7d 0a 2a 2f 0a 20 20 72 65 74  OR;.  }.*/.  ret
105f0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
10600 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
10610 69 74 65 33 5f 65 78 70 69 72 65 64 20 53 54 4d  ite3_expired STM
10620 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T .**.** Return 
10630 54 52 55 45 20 69 66 20 61 20 72 65 63 6f 6d 70  TRUE if a recomp
10640 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ilation of the s
10650 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65 63 6f  tatement is reco
10660 6d 6d 65 6e 64 65 64 2e 0a 2a 2f 0a 73 74 61 74  mmended..*/.stat
10670 69 63 20 69 6e 74 20 74 65 73 74 5f 65 78 70 69  ic int test_expi
10680 72 65 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  red(.  void * cl
10690 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
106a0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
106b0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
106c0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
106d0 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53  v[].){.#ifndef S
106e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
106f0 43 41 54 45 44 0a 20 20 73 71 6c 69 74 65 33 5f  CATED.  sqlite3_
10700 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
10710 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
10720 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
10730 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
10740 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
10750 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
10760 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
10770 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
10780 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30 29  ), " <STMT>", 0)
10790 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
107a0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
107b0 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
107c0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
107d0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
107e0 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
107f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
10800 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
10810 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
10820 6f 6f 6c 65 61 6e 4f 62 6a 28 73 71 6c 69 74 65  ooleanObj(sqlite
10830 33 5f 65 78 70 69 72 65 64 28 70 53 74 6d 74 29  3_expired(pStmt)
10840 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  ));.#endif.  ret
10850 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
10860 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
10870 69 74 65 33 5f 74 72 61 6e 73 66 65 72 5f 62 69  ite3_transfer_bi
10880 6e 64 69 6e 67 73 20 46 52 4f 4d 53 54 4d 54 20  ndings FROMSTMT 
10890 54 4f 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 54 72 61  TOSTMT.**.** Tra
108a0 6e 73 66 65 72 20 61 6c 6c 20 62 69 6e 64 69 6e  nsfer all bindin
108b0 67 73 20 66 72 6f 6d 20 46 52 4f 4d 53 54 4d 54  gs from FROMSTMT
108c0 20 6f 76 65 72 20 74 6f 20 54 4f 53 54 4d 54 0a   over to TOSTMT.
108d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
108e0 73 74 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e 64  st_transfer_bind
108f0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
10900 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
10910 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
10920 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
10930 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
10940 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
10950 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
10960 45 44 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ED.  sqlite3_stm
10970 74 20 2a 70 53 74 6d 74 31 2c 20 2a 70 53 74 6d  t *pStmt1, *pStm
10980 74 32 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  t2;.  if( objc!=
10990 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
109a0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
109b0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
109c0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
109d0 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
109e0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
109f0 76 5b 30 5d 2c 20 30 29 2c 20 22 20 46 52 4f 4d  v[0], 0), " FROM
10a00 2d 53 54 4d 54 20 54 4f 2d 53 54 4d 54 22 2c 20  -STMT TO-STMT", 
10a10 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
10a20 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
10a30 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
10a40 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
10a50 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
10a60 29 2c 20 26 70 53 74 6d 74 31 29 29 20 72 65 74  ), &pStmt1)) ret
10a70 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10a80 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
10a90 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
10aa0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
10ab0 5d 29 2c 20 26 70 53 74 6d 74 32 29 29 20 72 65  ]), &pStmt2)) re
10ac0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10ad0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
10ae0 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20 20 20  lt(interp, .    
10af0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
10b00 71 6c 69 74 65 33 5f 74 72 61 6e 73 66 65 72 5f  qlite3_transfer_
10b10 62 69 6e 64 69 6e 67 73 28 70 53 74 6d 74 31 2c  bindings(pStmt1,
10b20 70 53 74 6d 74 32 29 29 29 3b 0a 23 65 6e 64 69  pStmt2)));.#endi
10b30 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  f.  return TCL_O
10b40 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
10b50 65 3a 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  e:  sqlite3_chan
10b60 67 65 73 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74  ges DB.**.** Ret
10b70 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
10b80 66 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 74  f changes made t
10b90 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  o the database b
10ba0 79 20 74 68 65 20 6c 61 73 74 20 53 51 4c 0a 2a  y the last SQL.*
10bb0 2a 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2f 0a  * execution..*/.
10bc0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
10bd0 63 68 61 6e 67 65 73 28 0a 20 20 76 6f 69 64 20  changes(.  void 
10be0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
10bf0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
10c00 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
10c10 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
10c20 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
10c30 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
10c40 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
10c50 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
10c60 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
10c70 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
10c80 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 54 63 6c   \"",.       Tcl
10c90 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
10ca0 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a  0]), " DB", 0);.
10cb0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
10cc0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
10cd0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
10ce0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
10cf0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
10d00 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
10d10 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  RROR;.  Tcl_SetO
10d20 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
10d30 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
10d40 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 64  qlite3_changes(d
10d50 62 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  b)));.  return T
10d60 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
10d70 54 68 69 73 20 69 73 20 74 68 65 20 22 73 74 61  This is the "sta
10d80 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 22 20  tic_bind_value" 
10d90 74 68 61 74 20 76 61 72 69 61 62 6c 65 73 20 61  that variables a
10da0 72 65 20 62 6f 75 6e 64 20 74 6f 20 77 68 65 6e  re bound to when
10db0 0a 2a 2a 20 74 68 65 20 46 4c 41 47 20 6f 70 74  .** the FLAG opt
10dc0 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 5f 62  ion of sqlite3_b
10dd0 69 6e 64 20 69 73 20 22 73 74 61 74 69 63 22 0a  ind is "static".
10de0 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
10df0 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69  sqlite_static_bi
10e00 6e 64 5f 76 61 6c 75 65 20 3d 20 30 3b 0a 73 74  nd_value = 0;.st
10e10 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f  atic int sqlite_
10e20 73 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74  static_bind_nbyt
10e30 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 55 73  e = 0;../*.** Us
10e40 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 62 69  age:  sqlite3_bi
10e50 6e 64 20 20 56 4d 20 20 49 44 58 20 20 56 41 4c  nd  VM  IDX  VAL
10e60 55 45 20 20 46 4c 41 47 53 0a 2a 2a 0a 2a 2a 20  UE  FLAGS.**.** 
10e70 53 65 74 73 20 74 68 65 20 76 61 6c 75 65 20 6f  Sets the value o
10e80 66 20 74 68 65 20 49 44 58 2d 74 68 20 6f 63 63  f the IDX-th occ
10e90 75 72 72 65 6e 63 65 20 6f 66 20 22 3f 22 20 69  urrence of "?" i
10ea0 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
10eb0 51 4c 0a 2a 2a 20 73 74 72 69 6e 67 2e 20 20 56  QL.** string.  V
10ec0 41 4c 55 45 20 69 73 20 74 68 65 20 6e 65 77 20  ALUE is the new 
10ed0 76 61 6c 75 65 2e 20 20 49 66 20 46 4c 41 47 53  value.  If FLAGS
10ee0 3d 3d 22 6e 75 6c 6c 22 20 74 68 65 6e 20 56 41  =="null" then VA
10ef0 4c 55 45 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65  LUE is.** ignore
10f00 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  d and the value 
10f10 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20  is set to NULL. 
10f20 20 49 66 20 46 4c 41 47 53 3d 3d 22 73 74 61 74   If FLAGS=="stat
10f30 69 63 22 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ic" then.** the 
10f40 76 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20  value is set to 
10f50 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73  the value of a s
10f60 74 61 74 69 63 20 76 61 72 69 61 62 6c 65 20 6e  tatic variable n
10f70 61 6d 65 64 0a 2a 2a 20 22 73 71 6c 69 74 65 5f  amed.** "sqlite_
10f80 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75  static_bind_valu
10f90 65 22 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d 22  e".  If FLAGS=="
10fa0 6e 6f 72 6d 61 6c 22 20 74 68 65 6e 20 61 20 63  normal" then a c
10fb0 6f 70 79 0a 2a 2a 20 6f 66 20 74 68 65 20 56 41  opy.** of the VA
10fc0 4c 55 45 20 69 73 20 6d 61 64 65 2e 20 20 49 66  LUE is made.  If
10fd0 20 46 4c 41 47 53 3d 3d 22 62 6c 6f 62 31 30 22   FLAGS=="blob10"
10fe0 20 74 68 65 6e 20 61 20 56 41 4c 55 45 20 69 73   then a VALUE is
10ff0 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 20 61   ignored.** an a
11000 20 31 30 2d 62 79 74 65 20 62 6c 6f 62 20 22 61   10-byte blob "a
11010 62 63 5c 30 30 30 78 79 7a 5c 30 30 30 70 71 22  bc\000xyz\000pq"
11020 20 69 73 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f   is inserted..*/
11030 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
11040 5f 62 69 6e 64 28 0a 20 20 76 6f 69 64 20 2a 4e  _bind(.  void *N
11050 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
11060 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
11070 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
11080 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
11090 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
110a0 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
110b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
110c0 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
110d0 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
110e0 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
110f0 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
11100 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
11110 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
11120 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b  pStmt;.  int rc;
11130 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 66  .  int idx;.  if
11140 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20  ( argc!=5 ){.   
11150 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
11160 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
11170 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
11180 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
11190 20 0a 20 20 20 20 20 20 20 22 20 56 4d 20 49 44   .       " VM ID
111a0 58 20 56 41 4c 55 45 20 28 6e 75 6c 6c 7c 73 74  X VALUE (null|st
111b0 61 74 69 63 7c 6e 6f 72 6d 61 6c 29 5c 22 22 2c  atic|normal)\"",
111c0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
111d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
111e0 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
111f0 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
11200 5b 31 5d 2c 20 26 70 53 74 6d 74 29 20 29 20 72  [1], &pStmt) ) r
11210 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11220 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
11230 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32  t(interp, argv[2
11240 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72  ], &idx) ) retur
11250 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
11260 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34  f( strcmp(argv[4
11270 5d 2c 22 6e 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a  ],"null")==0 ){.
11280 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11290 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74  _bind_null(pStmt
112a0 2c 20 69 64 78 29 3b 0a 20 20 7d 65 6c 73 65 20  , idx);.  }else 
112b0 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
112c0 34 5d 2c 22 73 74 61 74 69 63 22 29 3d 3d 30 20  4],"static")==0 
112d0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
112e0 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
112f0 74 6d 74 2c 20 69 64 78 2c 20 73 71 6c 69 74 65  tmt, idx, sqlite
11300 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c  _static_bind_val
11310 75 65 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 7d 65  ue, -1, 0);.  }e
11320 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
11330 72 67 76 5b 34 5d 2c 22 73 74 61 74 69 63 2d 6e  rgv[4],"static-n
11340 62 79 74 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20  bytes")==0 ){.  
11350 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
11360 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  ind_text(pStmt, 
11370 69 64 78 2c 20 73 71 6c 69 74 65 5f 73 74 61 74  idx, sqlite_stat
11380 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 0a 20  ic_bind_value,. 
11390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113b0 20 20 20 20 20 20 73 71 6c 69 74 65 5f 73 74 61        sqlite_sta
113c0 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65 2c 20  tic_bind_nbyte, 
113d0 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  0);.  }else if( 
113e0 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22  strcmp(argv[4],"
113f0 6e 6f 72 6d 61 6c 22 29 3d 3d 30 20 29 7b 0a 20  normal")==0 ){. 
11400 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
11410 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
11420 20 69 64 78 2c 20 61 72 67 76 5b 33 5d 2c 20 2d   idx, argv[3], -
11430 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
11440 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ENT);.  }else if
11450 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d  ( strcmp(argv[4]
11460 2c 22 62 6c 6f 62 31 30 22 29 3d 3d 30 20 29 7b  ,"blob10")==0 ){
11470 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
11480 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d  3_bind_text(pStm
11490 74 2c 20 69 64 78 2c 20 22 61 62 63 5c 30 30 30  t, idx, "abc\000
114a0 78 79 7a 5c 30 30 30 70 71 22 2c 20 31 30 2c 20  xyz\000pq", 10, 
114b0 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
114c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c    }else{.    Tcl
114d0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
114e0 74 65 72 70 2c 20 22 34 74 68 20 61 72 67 75 6d  terp, "4th argum
114f0 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 22 0a  ent should be ".
11500 20 20 20 20 20 20 20 20 22 5c 22 6e 75 6c 6c 5c          "\"null\
11510 22 20 6f 72 20 5c 22 73 74 61 74 69 63 5c 22 20  " or \"static\" 
11520 6f 72 20 5c 22 6e 6f 72 6d 61 6c 5c 22 22 2c 20  or \"normal\"", 
11530 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
11540 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
11550 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
11560 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53  rrCode(interp, S
11570 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20  tmtToDb(pStmt), 
11580 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
11590 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
115a0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75   ){.    char zBu
115b0 66 5b 35 30 5d 3b 0a 20 20 20 20 73 70 72 69 6e  f[50];.    sprin
115c0 74 66 28 7a 42 75 66 2c 20 22 28 25 64 29 20 22  tf(zBuf, "(%d) "
115d0 2c 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41  , rc);.    Tcl_A
115e0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
115f0 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65  rp, zBuf, sqlite
11600 33 45 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b  3ErrStr(rc), 0);
11610 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
11620 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
11630 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23  urn TCL_OK;.}..#
11640 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11650 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 55  IT_UTF16./*.** U
11660 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 63  sage: add_test_c
11670 6f 6c 6c 61 74 65 20 3c 64 62 20 70 74 72 3e 20  ollate <db ptr> 
11680 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e  <utf8> <utf16le>
11690 20 3c 75 74 66 31 36 62 65 3e 0a 2a 2a 0a 2a 2a   <utf16be>.**.**
116a0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
116b0 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 74  s used to test t
116c0 68 61 74 20 53 51 4c 69 74 65 20 73 65 6c 65 63  hat SQLite selec
116d0 74 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 63  ts the correct c
116e0 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 73 65 71 75  ollation.** sequ
116f0 65 6e 63 65 20 63 61 6c 6c 62 61 63 6b 20 77 68  ence callback wh
11700 65 6e 20 6d 75 6c 74 69 70 6c 65 20 76 65 72 73  en multiple vers
11710 69 6f 6e 73 20 28 66 6f 72 20 64 69 66 66 65 72  ions (for differ
11720 65 6e 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  ent text encodin
11730 67 73 29 0a 2a 2a 20 61 72 65 20 61 76 61 69 6c  gs).** are avail
11740 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  able..**.** Call
11750 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
11760 20 72 65 67 69 73 74 65 72 73 20 74 68 65 20 63   registers the c
11770 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
11780 65 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  e "test_collate"
11790 0a 2a 2a 20 77 69 74 68 20 64 61 74 61 62 61 73  .** with databas
117a0 65 20 68 61 6e 64 6c 65 20 3c 64 62 3e 2e 20 54  e handle <db>. T
117b0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
117c0 6e 74 20 6d 75 73 74 20 62 65 20 61 20 6c 69 73  nt must be a lis
117d0 74 20 6f 66 20 74 68 72 65 65 0a 2a 2a 20 62 6f  t of three.** bo
117e0 6f 6c 65 61 6e 20 76 61 6c 75 65 73 2e 20 49 66  olean values. If
117f0 20 74 68 65 20 66 69 72 73 74 20 69 73 20 74 72   the first is tr
11800 75 65 2c 20 74 68 65 6e 20 61 20 76 65 72 73 69  ue, then a versi
11810 6f 6e 20 6f 66 20 74 65 73 74 5f 63 6f 6c 6c 61  on of test_colla
11820 74 65 20 69 73 0a 2a 2a 20 72 65 67 69 73 74 65  te is.** registe
11830 72 65 64 20 66 6f 72 20 55 54 46 2d 38 2c 20 69  red for UTF-8, i
11840 66 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20  f the second is 
11850 74 72 75 65 2c 20 61 20 76 65 72 73 69 6f 6e 20  true, a version 
11860 69 73 20 72 65 67 69 73 74 65 72 65 64 20 66 6f  is registered fo
11870 72 0a 2a 2a 20 55 54 46 2d 31 36 6c 65 2c 20 69  r.** UTF-16le, i
11880 66 20 74 68 65 20 74 68 69 72 64 20 69 73 20 74  f the third is t
11890 72 75 65 2c 20 61 20 55 54 46 2d 31 36 62 65 20  rue, a UTF-16be 
118a0 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c  version is avail
118b0 61 62 6c 65 2e 0a 2a 2a 20 50 72 65 76 69 6f 75  able..** Previou
118c0 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 65  s versions of te
118d0 73 74 5f 63 6f 6c 6c 61 74 65 20 61 72 65 20 64  st_collate are d
118e0 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  eleted..**.** Th
118f0 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
11900 65 6e 63 65 20 74 65 73 74 5f 63 6f 6c 6c 61 74  ence test_collat
11910 65 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  e is implemented
11920 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 0a   by calling the.
11930 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c  ** following TCL
11940 20 73 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20   script:.**.**  
11950 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 3c   "test_collate <
11960 65 6e 63 3e 20 3c 6c 68 73 3e 20 3c 72 68 73 3e  enc> <lhs> <rhs>
11970 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20 3c 6c 68 73  ".**.** The <lhs
11980 3e 20 61 6e 64 20 3c 72 68 73 3e 20 61 72 65 20  > and <rhs> are 
11990 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 20 62  the two values b
119a0 65 69 6e 67 20 63 6f 6d 70 61 72 65 64 2c 20 65  eing compared, e
119b0 6e 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 2e  ncoded in UTF-8.
119c0 0a 2a 2a 20 54 68 65 20 3c 65 6e 63 3e 20 70 61  .** The <enc> pa
119d0 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 65  rameter is the e
119e0 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 63  ncoding of the c
119f0 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  ollation functio
11a00 6e 20 74 68 61 74 0a 2a 2a 20 53 51 4c 69 74 65  n that.** SQLite
11a10 20 73 65 6c 65 63 74 65 64 20 74 6f 20 63 61 6c   selected to cal
11a20 6c 2e 20 54 68 65 20 54 43 4c 20 74 65 73 74 20  l. The TCL test 
11a30 73 63 72 69 70 74 20 69 6d 70 6c 65 6d 65 6e 74  script implement
11a40 73 20 74 68 65 0a 2a 2a 20 22 74 65 73 74 5f 63  s the.** "test_c
11a50 6f 6c 6c 61 74 65 22 20 70 72 6f 63 2e 0a 2a 2a  ollate" proc..**
11a60 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68  .** Note that th
11a70 69 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 77 6f 72  is will only wor
11a80 6b 20 77 69 74 68 20 6f 6e 65 20 69 6e 74 65 70  k with one intep
11a90 72 65 74 65 72 20 61 74 20 61 20 74 69 6d 65 2c  reter at a time,
11aa0 20 61 73 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72   as the.** inter
11ab0 70 20 70 6f 69 6e 74 65 72 20 74 6f 20 75 73 65  p pointer to use
11ac0 20 77 68 65 6e 20 65 76 61 6c 75 61 74 69 6e 67   when evaluating
11ad0 20 74 68 65 20 54 43 4c 20 73 63 72 69 70 74 20   the TCL script 
11ae0 69 73 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  is stored in.** 
11af0 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65  pTestCollateInte
11b00 72 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 63  rp..*/.static Tc
11b10 6c 5f 49 6e 74 65 72 70 2a 20 70 54 65 73 74 43  l_Interp* pTestC
11b20 6f 6c 6c 61 74 65 49 6e 74 65 72 70 3b 0a 73 74  ollateInterp;.st
11b30 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f  atic int test_co
11b40 6c 6c 61 74 65 5f 66 75 6e 63 28 0a 20 20 76 6f  llate_func(.  vo
11b50 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74  id *pCtx, .  int
11b60 20 6e 41 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20   nA, const void 
11b70 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42 2c 20 63  *zA,.  int nB, c
11b80 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29 7b  onst void *zB.){
11b90 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
11ba0 20 3d 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49   = pTestCollateI
11bb0 6e 74 65 72 70 3b 0a 20 20 69 6e 74 20 65 6e 63  nterp;.  int enc
11bc0 69 6e 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f  in = SQLITE_PTR_
11bd0 54 4f 5f 49 4e 54 28 70 43 74 78 29 3b 0a 20 20  TO_INT(pCtx);.  
11be0 69 6e 74 20 72 65 73 3b 0a 20 20 69 6e 74 20 6e  int res;.  int n
11bf0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  ;..  sqlite3_val
11c00 75 65 20 2a 70 56 61 6c 3b 0a 20 20 54 63 6c 5f  ue *pVal;.  Tcl_
11c10 4f 62 6a 20 2a 70 58 3b 0a 0a 20 20 70 58 20 3d  Obj *pX;..  pX =
11c20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
11c30 6a 28 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  j("test_collate"
11c40 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  , -1);.  Tcl_Inc
11c50 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 0a  rRefCount(pX);..
11c60 20 20 73 77 69 74 63 68 28 20 65 6e 63 69 6e 20    switch( encin 
11c70 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
11c80 54 45 5f 55 54 46 38 3a 0a 20 20 20 20 20 20 54  TE_UTF8:.      T
11c90 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
11ca0 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c  Element(i,pX,Tcl
11cb0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55  _NewStringObj("U
11cc0 54 46 2d 38 22 2c 2d 31 29 29 3b 0a 20 20 20 20  TF-8",-1));.    
11cd0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
11ce0 65 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  e SQLITE_UTF16LE
11cf0 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74  :.      Tcl_List
11d00 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
11d10 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72  (i,pX,Tcl_NewStr
11d20 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 4c 45  ingObj("UTF-16LE
11d30 22 2c 2d 31 29 29 3b 0a 20 20 20 20 20 20 62 72  ",-1));.      br
11d40 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
11d50 4c 49 54 45 5f 55 54 46 31 36 42 45 3a 0a 20 20  LITE_UTF16BE:.  
11d60 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
11d70 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70  ppendElement(i,p
11d80 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  X,Tcl_NewStringO
11d90 62 6a 28 22 55 54 46 2d 31 36 42 45 22 2c 2d 31  bj("UTF-16BE",-1
11da0 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ));.      break;
11db0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
11dc0 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20      assert(0);. 
11dd0 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 65 67   }..  sqlite3Beg
11de0 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
11df0 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74  ;.  pVal = sqlit
11e00 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20  e3ValueNew(0);. 
11e10 20 69 66 28 20 70 56 61 6c 20 29 7b 0a 20 20 20   if( pVal ){.   
11e20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
11e30 53 74 72 28 70 56 61 6c 2c 20 6e 41 2c 20 7a 41  Str(pVal, nA, zA
11e40 2c 20 65 6e 63 69 6e 2c 20 53 51 4c 49 54 45 5f  , encin, SQLITE_
11e50 53 54 41 54 49 43 29 3b 0a 20 20 20 20 6e 20 3d  STATIC);.    n =
11e60 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
11e70 79 74 65 73 28 70 56 61 6c 29 3b 0a 20 20 20 20  ytes(pVal);.    
11e80 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
11e90 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 0a 20  dElement(i,pX,. 
11ea0 20 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74         Tcl_NewSt
11eb0 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73  ringObj((char*)s
11ec0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
11ed0 74 28 70 56 61 6c 29 2c 6e 29 29 3b 0a 20 20 20  t(pVal),n));.   
11ee0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
11ef0 53 74 72 28 70 56 61 6c 2c 20 6e 42 2c 20 7a 42  Str(pVal, nB, zB
11f00 2c 20 65 6e 63 69 6e 2c 20 53 51 4c 49 54 45 5f  , encin, SQLITE_
11f10 53 54 41 54 49 43 29 3b 0a 20 20 20 20 6e 20 3d  STATIC);.    n =
11f20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
11f30 79 74 65 73 28 70 56 61 6c 29 3b 0a 20 20 20 20  ytes(pVal);.    
11f40 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
11f50 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 0a 20  dElement(i,pX,. 
11f60 20 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74         Tcl_NewSt
11f70 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73  ringObj((char*)s
11f80 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
11f90 74 28 70 56 61 6c 29 2c 6e 29 29 3b 0a 20 20 20  t(pVal),n));.   
11fa0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
11fb0 65 28 70 56 61 6c 29 3b 0a 20 20 7d 0a 20 20 73  e(pVal);.  }.  s
11fc0 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
11fd0 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 54 63 6c 5f  alloc();..  Tcl_
11fe0 45 76 61 6c 4f 62 6a 45 78 28 69 2c 20 70 58 2c  EvalObjEx(i, pX,
11ff0 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52   0);.  Tcl_DecrR
12000 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54  efCount(pX);.  T
12010 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
12020 28 69 2c 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  (i, Tcl_GetObjRe
12030 73 75 6c 74 28 69 29 2c 20 26 72 65 73 29 3b 0a  sult(i), &res);.
12040 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
12050 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
12060 63 6f 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64 20  collate(.  void 
12070 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
12080 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
12090 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
120a0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
120b0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
120c0 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
120d0 76 61 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  val;.  sqlite3_v
120e0 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e  alue *pVal;.  in
120f0 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
12100 63 21 3d 35 20 29 20 67 6f 74 6f 20 62 61 64 5f  c!=5 ) goto bad_
12110 61 72 67 73 3b 0a 20 20 70 54 65 73 74 43 6f 6c  args;.  pTestCol
12120 6c 61 74 65 49 6e 74 65 72 70 20 3d 20 69 6e 74  lateInterp = int
12130 65 72 70 3b 0a 20 20 69 66 28 20 67 65 74 44 62  erp;.  if( getDb
12140 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
12150 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
12160 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
12170 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12180 0a 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d  ..  if( TCL_OK!=
12190 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
121a0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
121b0 6a 76 5b 32 5d 2c 20 26 76 61 6c 29 20 29 20 72  jv[2], &val) ) r
121c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
121d0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
121e0 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
121f0 28 64 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61  (db, "test_colla
12200 74 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  te", SQLITE_UTF8
12210 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28 76 6f  , .          (vo
12220 69 64 20 2a 29 53 51 4c 49 54 45 5f 55 54 46 38  id *)SQLITE_UTF8
12230 2c 20 76 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61  , val?test_colla
12240 74 65 5f 66 75 6e 63 3a 30 29 3b 0a 20 20 69 66  te_func:0);.  if
12250 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
12260 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f 69  ){.    const voi
12270 64 20 2a 7a 55 74 66 31 36 3b 0a 20 20 20 20 69  d *zUtf16;.    i
12280 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47  f( TCL_OK!=Tcl_G
12290 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
122a0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
122b0 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e  , &val) ) return
122c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
122d0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
122e0 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62  ate_collation(db
122f0 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  , "test_collate"
12300 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  , SQLITE_UTF16LE
12310 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  , .            (
12320 76 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f 55 54  void *)SQLITE_UT
12330 46 31 36 4c 45 2c 20 76 61 6c 3f 74 65 73 74 5f  F16LE, val?test_
12340 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b  collate_func:0);
12350 0a 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21  .    if( TCL_OK!
12360 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46  =Tcl_GetBooleanF
12370 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
12380 62 6a 76 5b 34 5d 2c 20 26 76 61 6c 29 20 29 20  bjv[4], &val) ) 
12390 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
123a0 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20 69 66 28  ;..#if 0.    if(
123b0 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63   sqlite3_iMalloc
123c0 46 61 69 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20  Fail>0 ){.      
123d0 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46  sqlite3_iMallocF
123e0 61 69 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 23 65 6e  ail++;.    }.#en
123f0 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  dif.    sqlite3_
12400 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
12410 6d 75 74 65 78 29 3b 0a 20 20 20 20 70 56 61 6c  mutex);.    pVal
12420 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
12430 65 77 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69  ew(db);.    sqli
12440 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70  te3ValueSetStr(p
12450 56 61 6c 2c 20 2d 31 2c 20 22 74 65 73 74 5f 63  Val, -1, "test_c
12460 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f  ollate", SQLITE_
12470 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41  UTF8, SQLITE_STA
12480 54 49 43 29 3b 0a 20 20 20 20 7a 55 74 66 31 36  TIC);.    zUtf16
12490 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54   = sqlite3ValueT
124a0 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49 54 45  ext(pVal, SQLITE
124b0 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20  _UTF16NATIVE);. 
124c0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
124d0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
124e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
124f0 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
12500 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12510 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
12520 6f 6e 31 36 28 64 62 2c 20 7a 55 74 66 31 36 2c  on16(db, zUtf16,
12530 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c   SQLITE_UTF16BE,
12540 20 0a 20 20 20 20 20 20 20 20 20 20 28 76 6f 69   .          (voi
12550 64 20 2a 29 53 51 4c 49 54 45 5f 55 54 46 31 36  d *)SQLITE_UTF16
12560 42 45 2c 20 76 61 6c 3f 74 65 73 74 5f 63 6f 6c  BE, val?test_col
12570 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b 0a 20 20  late_func:0);.  
12580 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
12590 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
125a0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
125b0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
125c0 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71  x);.  }.  if( sq
125d0 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
125e0 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
125f0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
12600 52 4f 52 3b 0a 20 20 0a 20 20 69 66 28 20 72 63  ROR;.  .  if( rc
12610 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
12620 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
12630 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
12640 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20  te3ErrName(rc), 
12650 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
12660 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
12670 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a  return TCL_OK;..
12680 62 61 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f  bad_args:.  Tcl_
12690 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
126a0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
126b0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
126c0 22 2c 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74  ",.      Tcl_Get
126d0 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
126e0 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 44 42  jv[0], 0), " <DB
126f0 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c  > <utf8> <utf16l
12700 65 3e 20 3c 75 74 66 31 36 62 65 3e 22 2c 20 30  e> <utf16be>", 0
12710 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
12720 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ERROR;.}../*.** 
12730 57 68 65 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69  When the collati
12740 6f 6e 20 6e 65 65 64 65 64 20 63 61 6c 6c 62 61  on needed callba
12750 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 72  ck is invoked, r
12760 65 63 6f 72 64 20 74 68 65 20 6e 61 6d 65 20 6f  ecord the name o
12770 66 20 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  f .** the reques
12780 74 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  ted collating fu
12790 6e 63 74 69 6f 6e 20 68 65 72 65 2e 20 20 54 68  nction here.  Th
127a0 65 20 72 65 63 6f 72 64 65 64 20 6e 61 6d 65 20  e recorded name 
127b0 69 73 20 6c 69 6e 6b 65 64 0a 2a 2a 20 74 6f 20  is linked.** to 
127c0 61 20 54 43 4c 20 76 61 72 69 61 62 6c 65 20 61  a TCL variable a
127d0 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20  nd used to make 
127e0 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65  sure that the re
127f0 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f  quested collatio
12800 6e 0a 2a 2a 20 6e 61 6d 65 20 69 73 20 63 6f 72  n.** name is cor
12810 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rect..*/.static 
12820 63 68 61 72 20 7a 4e 65 65 64 65 64 43 6f 6c 6c  char zNeededColl
12830 61 74 69 6f 6e 5b 32 30 30 5d 3b 0a 73 74 61 74  ation[200];.stat
12840 69 63 20 63 68 61 72 20 2a 70 7a 4e 65 65 64 65  ic char *pzNeede
12850 64 43 6f 6c 6c 61 74 69 6f 6e 20 3d 20 7a 4e 65  dCollation = zNe
12860 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 3b 0a 0a  ededCollation;..
12870 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20 77 68  ./*.** Called wh
12880 65 6e 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  en a collating s
12890 65 71 75 65 6e 63 65 20 69 73 20 6e 65 65 64 65  equence is neede
128a0 64 2e 20 20 52 65 67 69 73 74 65 72 65 64 20 75  d.  Registered u
128b0 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  sing.** sqlite3_
128c0 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64  collation_needed
128d0 31 36 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  16()..*/.static 
128e0 76 6f 69 64 20 74 65 73 74 5f 63 6f 6c 6c 61 74  void test_collat
128f0 65 5f 6e 65 65 64 65 64 5f 63 62 28 0a 20 20 76  e_needed_cb(.  v
12900 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 73 71  oid *pCtx, .  sq
12910 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74  lite3 *db,.  int
12920 20 65 54 65 78 74 52 65 70 2c 0a 20 20 63 6f 6e   eTextRep,.  con
12930 73 74 20 76 6f 69 64 20 2a 70 4e 61 6d 65 0a 29  st void *pName.)
12940 7b 0a 20 20 69 6e 74 20 65 6e 63 20 3d 20 45 4e  {.  int enc = EN
12950 43 28 64 62 29 3b 0a 20 20 69 6e 74 20 69 3b 0a  C(db);.  int i;.
12960 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 66 6f 72    char *z;.  for
12970 28 7a 20 3d 20 28 63 68 61 72 2a 29 70 4e 61 6d  (z = (char*)pNam
12980 65 2c 20 69 3d 30 3b 20 2a 7a 20 7c 7c 20 7a 5b  e, i=0; *z || z[
12990 31 5d 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66  1]; z++){.    if
129a0 28 20 2a 7a 20 29 20 7a 4e 65 65 64 65 64 43 6f  ( *z ) zNeededCo
129b0 6c 6c 61 74 69 6f 6e 5b 69 2b 2b 5d 20 3d 20 2a  llation[i++] = *
129c0 7a 3b 0a 20 20 7d 0a 20 20 7a 4e 65 65 64 65 64  z;.  }.  zNeeded
129d0 43 6f 6c 6c 61 74 69 6f 6e 5b 69 5d 20 3d 20 30  Collation[i] = 0
129e0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61  ;.  sqlite3_crea
129f0 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20  te_collation(.  
12a00 20 20 20 20 64 62 2c 20 22 74 65 73 74 5f 63 6f      db, "test_co
12a10 6c 6c 61 74 65 22 2c 20 45 4e 43 28 64 62 29 2c  llate", ENC(db),
12a20 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
12a30 54 52 28 65 6e 63 29 2c 20 74 65 73 74 5f 63 6f  TR(enc), test_co
12a40 6c 6c 61 74 65 5f 66 75 6e 63 29 3b 0a 7d 0a 0a  llate_func);.}..
12a50 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64 64  /*.** Usage: add
12a60 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65  _test_collate_ne
12a70 65 64 65 64 20 44 42 0a 2a 2f 0a 73 74 61 74 69  eded DB.*/.stati
12a80 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 6c 61  c int test_colla
12a90 74 65 5f 6e 65 65 64 65 64 28 0a 20 20 76 6f 69  te_needed(.  voi
12aa0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
12ab0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
12ac0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
12ad0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
12ae0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
12af0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
12b00 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
12b10 63 21 3d 32 20 29 20 67 6f 74 6f 20 62 61 64 5f  c!=2 ) goto bad_
12b20 61 72 67 73 3b 0a 20 20 69 66 28 20 67 65 74 44  args;.  if( getD
12b30 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
12b40 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
12b50 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
12b60 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12b70 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
12b80 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65  _collation_neede
12b90 64 31 36 28 64 62 2c 20 30 2c 20 74 65 73 74 5f  d16(db, 0, test_
12ba0 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 5f 63  collate_needed_c
12bb0 62 29 3b 0a 20 20 7a 4e 65 65 64 65 64 43 6f 6c  b);.  zNeededCol
12bc0 6c 61 74 69 6f 6e 5b 30 5d 20 3d 20 30 3b 0a 20  lation[0] = 0;. 
12bd0 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
12be0 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
12bf0 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
12c00 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
12c10 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 62 61  turn TCL_OK;..ba
12c20 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 57 72  d_args:.  Tcl_Wr
12c30 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
12c40 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22  p, 1, objv, "DB"
12c50 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
12c60 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ERROR;.}../*.** 
12c70 74 63 6c 63 6d 64 3a 20 20 20 61 64 64 5f 61 6c  tclcmd:   add_al
12c80 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c  ignment_test_col
12c90 6c 61 74 69 6f 6e 73 20 20 44 42 0a 2a 2a 0a 2a  lations  DB.**.*
12ca0 2a 20 41 64 64 20 74 77 6f 20 6e 65 77 20 63 6f  * Add two new co
12cb0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
12cc0 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
12cd0 65 20 44 42 0a 2a 2a 0a 2a 2a 20 20 20 20 20 75  e DB.**.**     u
12ce0 74 66 31 36 5f 61 6c 69 67 6e 65 64 0a 2a 2a 20  tf16_aligned.** 
12cf0 20 20 20 20 75 74 66 31 36 5f 75 6e 61 6c 69 67      utf16_unalig
12d00 6e 65 64 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 63  ned.**.** Both c
12d10 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
12d20 65 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 20  es use the same 
12d30 73 6f 72 74 20 6f 72 64 65 72 20 61 73 20 42 49  sort order as BI
12d40 4e 41 52 59 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c  NARY..** The onl
12d50 79 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 20  y difference is 
12d60 74 68 61 74 20 74 68 65 20 75 74 66 31 36 5f 61  that the utf16_a
12d70 6c 69 67 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67  ligned collating
12d80 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 69 73 20  .** sequence is 
12d90 64 65 63 6c 61 72 65 64 20 77 69 74 68 20 74 68  declared with th
12da0 65 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41  e SQLITE_UTF16_A
12db0 4c 49 47 4e 45 44 20 66 6c 61 67 2e 0a 2a 2a 20  LIGNED flag..** 
12dc0 42 6f 74 68 20 63 6f 6c 6c 61 74 69 6e 67 20 66  Both collating f
12dd0 75 6e 63 74 69 6f 6e 73 20 69 6e 63 72 65 6d 65  unctions increme
12de0 6e 74 20 74 68 65 20 75 6e 61 6c 69 67 6e 65 64  nt the unaligned
12df0 20 75 74 66 31 36 20 63 6f 75 6e 74 65 72 0a 2a   utf16 counter.*
12e00 2a 20 77 68 65 6e 65 76 65 72 20 74 68 65 79 20  * whenever they 
12e10 73 65 65 20 61 20 73 74 72 69 6e 67 20 74 68 61  see a string tha
12e20 74 20 62 65 67 69 6e 73 20 6f 6e 20 61 6e 20 6f  t begins on an o
12e30 64 64 20 62 79 74 65 20 62 6f 75 6e 64 61 72 79  dd byte boundary
12e40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12e50 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67  unaligned_string
12e60 5f 63 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 73 74  _counter = 0;.st
12e70 61 74 69 63 20 69 6e 74 20 61 6c 69 67 6e 6d 65  atic int alignme
12e80 6e 74 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76 6f  ntCollFunc(.  vo
12e90 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69  id *NotUsed,.  i
12ea0 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
12eb0 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69  void *pKey1,.  i
12ec0 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20  nt nKey2, const 
12ed0 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20  void *pKey2.){. 
12ee0 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e 20   int rc, n;.  n 
12ef0 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20  = nKey1<nKey2 ? 
12f00 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20  nKey1 : nKey2;. 
12f10 20 69 66 28 20 6e 4b 65 79 31 3e 30 20 26 26 20   if( nKey1>0 && 
12f20 31 3d 3d 28 31 26 28 53 51 4c 49 54 45 5f 50 54  1==(1&(SQLITE_PT
12f30 52 5f 54 4f 5f 49 4e 54 28 70 4b 65 79 31 29 29  R_TO_INT(pKey1))
12f40 29 20 29 20 75 6e 61 6c 69 67 6e 65 64 5f 73 74  ) ) unaligned_st
12f50 72 69 6e 67 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a  ring_counter++;.
12f60 20 20 69 66 28 20 6e 4b 65 79 32 3e 30 20 26 26    if( nKey2>0 &&
12f70 20 31 3d 3d 28 31 26 28 53 51 4c 49 54 45 5f 50   1==(1&(SQLITE_P
12f80 54 52 5f 54 4f 5f 49 4e 54 28 70 4b 65 79 32 29  TR_TO_INT(pKey2)
12f90 29 29 20 29 20 75 6e 61 6c 69 67 6e 65 64 5f 73  )) ) unaligned_s
12fa0 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 2b 2b 3b  tring_counter++;
12fb0 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70  .  rc = memcmp(p
12fc0 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29 3b  Key1, pKey2, n);
12fd0 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a  .  if( rc==0 ){.
12fe0 20 20 20 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d      rc = nKey1 -
12ff0 20 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65   nKey2;.  }.  re
13000 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69  turn rc;.}.stati
13010 63 20 69 6e 74 20 61 64 64 5f 61 6c 69 67 6e 6d  c int add_alignm
13020 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69  ent_test_collati
13030 6f 6e 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ons(.  void * cl
13040 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
13050 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
13060 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
13070 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
13080 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
13090 20 2a 64 62 3b 0a 20 20 69 66 28 20 6f 62 6a 63   *db;.  if( objc
130a0 3e 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20 67  >=2 ){.    if( g
130b0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
130c0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
130d0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
130e0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
130f0 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ROR;.    sqlite3
13100 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
13110 6e 28 64 62 2c 20 22 75 74 66 31 36 5f 75 6e 61  n(db, "utf16_una
13120 6c 69 67 6e 65 64 22 2c 20 53 51 4c 49 54 45 5f  ligned", SQLITE_
13130 55 54 46 31 36 2c 20 0a 20 20 20 20 20 20 20 20  UTF16, .        
13140 30 2c 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c  0, alignmentColl
13150 46 75 6e 63 29 3b 0a 20 20 20 20 73 71 6c 69 74  Func);.    sqlit
13160 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
13170 69 6f 6e 28 64 62 2c 20 22 75 74 66 31 36 5f 61  ion(db, "utf16_a
13180 6c 69 67 6e 65 64 22 2c 20 53 51 4c 49 54 45 5f  ligned", SQLITE_
13190 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 2c 20 0a  UTF16_ALIGNED, .
131a0 20 20 20 20 20 20 20 20 30 2c 20 61 6c 69 67 6e          0, align
131b0 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b 0a 20  mentCollFunc);. 
131c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
131d0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
131e0 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
131f0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 29 20 2a  TE_OMIT_UTF16) *
13200 2f 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  /../*.** Usage: 
13210 61 64 64 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f  add_test_functio
13220 6e 20 3c 64 62 20 70 74 72 3e 20 3c 75 74 66 38  n <db ptr> <utf8
13230 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66  > <utf16le> <utf
13240 31 36 62 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  16be>.**.** This
13250 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
13260 64 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  d to test that S
13270 51 4c 69 74 65 20 73 65 6c 65 63 74 73 20 74 68  QLite selects th
13280 65 20 63 6f 72 72 65 63 74 20 75 73 65 72 0a 2a  e correct user.*
13290 2a 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 62  * function callb
132a0 61 63 6b 20 77 68 65 6e 20 6d 75 6c 74 69 70 6c  ack when multipl
132b0 65 20 76 65 72 73 69 6f 6e 73 20 28 66 6f 72 20  e versions (for 
132c0 64 69 66 66 65 72 65 6e 74 20 74 65 78 74 20 65  different text e
132d0 6e 63 6f 64 69 6e 67 73 29 0a 2a 2a 20 61 72 65  ncodings).** are
132e0 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
132f0 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  * Calling this r
13300 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73  outine registers
13310 20 75 70 20 74 6f 20 74 68 72 65 65 20 76 65 72   up to three ver
13320 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 75 73 65  sions of the use
13330 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 22 74  r function.** "t
13340 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 20 77 69  est_function" wi
13350 74 68 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  th database hand
13360 6c 65 20 3c 64 62 3e 2e 20 20 49 66 20 74 68 65  le <db>.  If the
13370 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
13380 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65   is.** true, the
13390 6e 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  n a version of t
133a0 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 69 73 20  est_function is 
133b0 72 65 67 69 73 74 65 72 65 64 20 66 6f 72 20 55  registered for U
133c0 54 46 2d 38 2c 20 69 66 20 74 68 65 0a 2a 2a 20  TF-8, if the.** 
133d0 74 68 69 72 64 20 69 73 20 74 72 75 65 2c 20 61  third is true, a
133e0 20 76 65 72 73 69 6f 6e 20 69 73 20 72 65 67 69   version is regi
133f0 73 74 65 72 65 64 20 66 6f 72 20 55 54 46 2d 31  stered for UTF-1
13400 36 6c 65 2c 20 69 66 20 74 68 65 20 66 6f 75 72  6le, if the four
13410 74 68 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 61  th is.** true, a
13420 20 55 54 46 2d 31 36 62 65 20 76 65 72 73 69 6f   UTF-16be versio
13430 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20  n is available. 
13440 20 50 72 65 76 69 6f 75 73 20 76 65 72 73 69 6f   Previous versio
13450 6e 73 20 6f 66 0a 2a 2a 20 74 65 73 74 5f 66 75  ns of.** test_fu
13460 6e 63 74 69 6f 6e 20 61 72 65 20 64 65 6c 65 74  nction are delet
13470 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 75 73  ed..**.** The us
13480 65 72 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  er function is i
13490 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 61  mplemented by ca
134a0 6c 6c 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  lling the follow
134b0 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74 3a 0a  ing TCL script:.
134c0 2a 2a 0a 2a 2a 20 20 20 22 74 65 73 74 5f 66 75  **.**   "test_fu
134d0 6e 63 74 69 6f 6e 20 3c 65 6e 63 3e 20 3c 61 72  nction <enc> <ar
134e0 67 3e 22 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65 20  g>".**.** Where 
134f0 3c 65 6e 63 3e 20 69 73 20 6f 6e 65 20 6f 66 20  <enc> is one of 
13500 55 54 46 2d 38 2c 20 55 54 46 2d 31 36 4c 45 20  UTF-8, UTF-16LE 
13510 6f 72 20 55 54 46 31 36 42 45 2c 20 61 6e 64 20  or UTF16BE, and 
13520 3c 61 72 67 3e 20 69 73 20 74 68 65 0a 2a 2a 20  <arg> is the.** 
13530 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20  single argument 
13540 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 53 51  passed to the SQ
13550 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20  L function. The 
13560 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
13570 79 0a 2a 2a 20 74 68 65 20 54 43 4c 20 73 63 72  y.** the TCL scr
13580 69 70 74 20 69 73 20 75 73 65 64 20 61 73 20 74  ipt is used as t
13590 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
135a0 6f 66 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74  of the SQL funct
135b0 69 6f 6e 2e 20 49 74 0a 2a 2a 20 69 73 20 70 61  ion. It.** is pa
135c0 73 73 65 64 20 74 6f 20 53 51 4c 69 74 65 20 75  ssed to SQLite u
135d0 73 69 6e 67 20 55 54 46 2d 31 36 42 45 20 66 6f  sing UTF-16BE fo
135e0 72 20 61 20 55 54 46 2d 38 20 74 65 73 74 5f 66  r a UTF-8 test_f
135f0 75 6e 63 74 69 6f 6e 28 29 2c 20 55 54 46 2d 38  unction(), UTF-8
13600 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 2d 31 36  .** for a UTF-16
13610 4c 45 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  LE test_function
13620 28 29 2c 20 61 6e 64 20 55 54 46 2d 31 36 4c 45  (), and UTF-16LE
13630 20 66 6f 72 20 61 6e 20 69 6d 70 6c 65 6d 65 6e   for an implemen
13640 74 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 70  tation that.** p
13650 72 65 66 65 72 73 20 55 54 46 2d 31 36 42 45 2e  refers UTF-16BE.
13660 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
13670 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 73 74  TE_OMIT_UTF16.st
13680 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 66  atic void test_f
13690 75 6e 63 74 69 6f 6e 5f 75 74 66 38 28 0a 20 20  unction_utf8(.  
136a0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
136b0 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41  *pCtx, .  int nA
136c0 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  rg,.  sqlite3_va
136d0 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
136e0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
136f0 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  rp;.  Tcl_Obj *p
13700 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  X;.  sqlite3_val
13710 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65  ue *pVal;.  inte
13720 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70  rp = (Tcl_Interp
13730 20 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   *)sqlite3_user_
13740 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20 70 58  data(pCtx);.  pX
13750 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
13760 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e 63 74 69  Obj("test_functi
13770 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f  on", -1);.  Tcl_
13780 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29  IncrRefCount(pX)
13790 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
137a0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
137b0 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77  erp, pX, Tcl_New
137c0 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 38  StringObj("UTF-8
137d0 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  ", -1));.  Tcl_L
137e0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
137f0 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20  ent(interp, pX, 
13800 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  .      Tcl_NewSt
13810 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73  ringObj((char*)s
13820 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
13830 74 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29  t(argv[0]), -1))
13840 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  ;.  Tcl_EvalObjE
13850 78 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 30 29  x(interp, pX, 0)
13860 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
13870 6f 75 6e 74 28 70 58 29 3b 0a 20 20 73 71 6c 69  ount(pX);.  sqli
13880 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
13890 70 43 74 78 2c 20 54 63 6c 5f 47 65 74 53 74 72  pCtx, Tcl_GetStr
138a0 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ingResult(interp
138b0 29 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52  ), -1, SQLITE_TR
138c0 41 4e 53 49 45 4e 54 29 3b 0a 20 20 70 56 61 6c  ANSIENT);.  pVal
138d0 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
138e0 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  ew(0);.  sqlite3
138f0 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c  ValueSetStr(pVal
13900 2c 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72  , -1, Tcl_GetStr
13910 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ingResult(interp
13920 29 2c 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45  ), .      SQLITE
13930 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54  _UTF8, SQLITE_ST
13940 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33  ATIC);.  sqlite3
13950 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36 62 65  _result_text16be
13960 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76  (pCtx, sqlite3_v
13970 61 6c 75 65 5f 74 65 78 74 31 36 62 65 28 70 56  alue_text16be(pV
13980 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53  al),.      -1, S
13990 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
139a0 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
139b0 46 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 73 74  Free(pVal);.}.st
139c0 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 66  atic void test_f
139d0 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 6c 65 28  unction_utf16le(
139e0 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
139f0 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74  xt *pCtx, .  int
13a00 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33   nArg,.  sqlite3
13a10 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
13a20 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
13a30 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a  nterp;.  Tcl_Obj
13a40 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f   *pX;.  sqlite3_
13a50 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69  value *pVal;.  i
13a60 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74  nterp = (Tcl_Int
13a70 65 72 70 20 2a 29 73 71 6c 69 74 65 33 5f 75 73  erp *)sqlite3_us
13a80 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20  er_data(pCtx);. 
13a90 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72   pX = Tcl_NewStr
13aa0 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e  ingObj("test_fun
13ab0 63 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54  ction", -1);.  T
13ac0 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
13ad0 70 58 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  pX);.  Tcl_ListO
13ae0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
13af0 69 6e 74 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f  interp, pX, Tcl_
13b00 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54  NewStringObj("UT
13b10 46 2d 31 36 4c 45 22 2c 20 2d 31 29 29 3b 0a 20  F-16LE", -1));. 
13b20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
13b30 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
13b40 2c 20 70 58 2c 20 0a 20 20 20 20 20 20 54 63 6c  , pX, .      Tcl
13b50 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
13b60 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
13b70 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
13b80 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76  , -1));.  Tcl_Ev
13b90 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20  alObjEx(interp, 
13ba0 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65  pX, 0);.  Tcl_De
13bb0 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a  crRefCount(pX);.
13bc0 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
13bd0 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73  ValueNew(0);.  s
13be0 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
13bf0 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54 63 6c 5f  r(pVal, -1, Tcl_
13c00 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
13c10 69 6e 74 65 72 70 29 2c 20 0a 20 20 20 20 20 20  interp), .      
13c20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
13c30 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73  ITE_STATIC);.  s
13c40 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
13c50 78 74 28 70 43 74 78 2c 28 63 68 61 72 2a 29 73  xt(pCtx,(char*)s
13c60 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
13c70 74 28 70 56 61 6c 29 2c 2d 31 2c 53 51 4c 49 54  t(pVal),-1,SQLIT
13c80 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
13c90 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
13ca0 28 70 56 61 6c 29 3b 0a 7d 0a 73 74 61 74 69 63  (pVal);.}.static
13cb0 20 76 6f 69 64 20 74 65 73 74 5f 66 75 6e 63 74   void test_funct
13cc0 69 6f 6e 5f 75 74 66 31 36 62 65 28 0a 20 20 73  ion_utf16be(.  s
13cd0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
13ce0 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72  pCtx, .  int nAr
13cf0 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  g,.  sqlite3_val
13d00 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54  ue **argv.){.  T
13d10 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
13d20 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58  p;.  Tcl_Obj *pX
13d30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ;.  sqlite3_valu
13d40 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72  e *pVal;.  inter
13d50 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70 20  p = (Tcl_Interp 
13d60 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  *)sqlite3_user_d
13d70 61 74 61 28 70 43 74 78 29 3b 0a 20 20 70 58 20  ata(pCtx);.  pX 
13d80 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
13d90 62 6a 28 22 74 65 73 74 5f 66 75 6e 63 74 69 6f  bj("test_functio
13da0 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49  n", -1);.  Tcl_I
13db0 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b  ncrRefCount(pX);
13dc0 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
13dd0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
13de0 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53  rp, pX, Tcl_NewS
13df0 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36  tringObj("UTF-16
13e00 42 45 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  BE", -1));.  Tcl
13e10 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
13e20 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58  ement(interp, pX
13e30 2c 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77  , .      Tcl_New
13e40 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a  StringObj((char*
13e50 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
13e60 65 78 74 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31  ext(argv[0]), -1
13e70 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62  ));.  Tcl_EvalOb
13e80 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 58 2c 20  jEx(interp, pX, 
13e90 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  0);.  Tcl_DecrRe
13ea0 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 70 56  fCount(pX);.  pV
13eb0 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  al = sqlite3Valu
13ec0 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74  eNew(0);.  sqlit
13ed0 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56  e3ValueSetStr(pV
13ee0 61 6c 2c 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53  al, -1, Tcl_GetS
13ef0 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65  tringResult(inte
13f00 72 70 29 2c 20 0a 20 20 20 20 20 20 53 51 4c 49  rp), .      SQLI
13f10 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
13f20 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74  STATIC);.  sqlit
13f30 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36  e3_result_text16
13f40 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76  (pCtx, sqlite3_v
13f50 61 6c 75 65 5f 74 65 78 74 31 36 6c 65 28 70 56  alue_text16le(pV
13f60 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53  al),.      -1, S
13f70 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
13f80 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
13f90 6c 74 5f 74 65 78 74 31 36 62 65 28 70 43 74 78  lt_text16be(pCtx
13fa0 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  , sqlite3_value_
13fb0 74 65 78 74 31 36 6c 65 28 70 56 61 6c 29 2c 0a  text16le(pVal),.
13fc0 20 20 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45        -1, SQLITE
13fd0 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73  _TRANSIENT);.  s
13fe0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
13ff0 78 74 31 36 6c 65 28 70 43 74 78 2c 20 73 71 6c  xt16le(pCtx, sql
14000 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
14010 36 6c 65 28 70 56 61 6c 29 2c 0a 20 20 20 20 20  6le(pVal),.     
14020 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
14030 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65  SIENT);.  sqlite
14040 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
14050 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
14060 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
14070 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
14080 73 74 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 76  st_function(.  v
14090 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
140a0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
140b0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
140c0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
140d0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
140e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
140f0 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74  IT_UTF16.  sqlit
14100 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 76 61  e3 *db;.  int va
14110 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  l;..  if( objc!=
14120 35 20 29 20 67 6f 74 6f 20 62 61 64 5f 61 72 67  5 ) goto bad_arg
14130 73 3b 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f  s;.  if( getDbPo
14140 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
14150 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
14160 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
14170 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
14180 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
14190 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
141a0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
141b0 5b 32 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74  [2], &val) ) ret
141c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
141d0 20 69 66 28 20 76 61 6c 20 29 7b 0a 20 20 20 20   if( val ){.    
141e0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
141f0 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74 65 73  unction(db, "tes
14200 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 31 2c 20  t_function", 1, 
14210 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20  SQLITE_UTF8, .  
14220 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 74 65        interp, te
14230 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 38  st_function_utf8
14240 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  , 0, 0);.  }.  i
14250 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47  f( TCL_OK!=Tcl_G
14260 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
14270 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
14280 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e  , &val) ) return
14290 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
142a0 28 20 76 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c  ( val ){.    sql
142b0 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
142c0 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 66  tion(db, "test_f
142d0 75 6e 63 74 69 6f 6e 22 2c 20 31 2c 20 53 51 4c  unction", 1, SQL
142e0 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 0a 20 20  ITE_UTF16LE, .  
142f0 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 74 65        interp, te
14300 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31  st_function_utf1
14310 36 6c 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  6le, 0, 0);.  }.
14320 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
14330 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
14340 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
14350 5b 34 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74  [4], &val) ) ret
14360 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
14370 20 69 66 28 20 76 61 6c 20 29 7b 0a 20 20 20 20   if( val ){.    
14380 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
14390 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74 65 73  unction(db, "tes
143a0 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 31 2c 20  t_function", 1, 
143b0 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20  SQLITE_UTF16BE, 
143c0 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c  .        interp,
143d0 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75   test_function_u
143e0 74 66 31 36 62 65 2c 20 30 2c 20 30 29 3b 0a 20  tf16be, 0, 0);. 
143f0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
14400 5f 4f 4b 3b 0a 62 61 64 5f 61 72 67 73 3a 0a 20  _OK;.bad_args:. 
14410 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
14420 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
14430 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
14440 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 54 63  be \"",.      Tc
14450 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
14460 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
14470 22 20 3c 44 42 3e 20 3c 75 74 66 38 3e 20 3c 75  " <DB> <utf8> <u
14480 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36 62 65  tf16le> <utf16be
14490 3e 22 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f  >", 0);.#endif /
144a0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
144b0 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  F16 */.  return 
144c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a  TCL_ERROR;.}../*
144d0 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 20 20 20  .** Usage:      
144e0 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
144f0 65 72 72 73 74 72 20 3c 65 72 72 20 63 6f 64 65  errstr <err code
14500 3e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 61  >.**.** Test tha
14510 74 20 74 68 65 20 65 6e 67 6c 69 73 68 20 6c 61  t the english la
14520 6e 67 75 61 67 65 20 73 74 72 69 6e 67 20 65 71  nguage string eq
14530 75 69 76 61 6c 65 6e 74 73 20 66 6f 72 20 73 71  uivalents for sq
14540 6c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 73  lite error codes
14550 0a 2a 2a 20 61 72 65 20 73 61 6e 65 2e 20 54 68  .** are sane. Th
14560 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  e parameter is a
14570 6e 20 69 6e 74 65 67 65 72 20 72 65 70 72 65 73  n integer repres
14580 65 6e 74 69 6e 67 20 61 6e 20 73 71 6c 69 74 65  enting an sqlite
14590 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20   error code..** 
145a0 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20  The result is a 
145b0 6c 69 73 74 20 6f 66 20 74 77 6f 20 65 6c 65 6d  list of two elem
145c0 65 6e 74 73 2c 20 74 68 65 20 73 74 72 69 6e 67  ents, the string
145d0 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
145e0 6f 66 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 20  of the.** error 
145f0 63 6f 64 65 20 61 6e 64 20 74 68 65 20 65 6e 67  code and the eng
14600 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78  lish language ex
14610 70 6c 61 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  planation..*/.st
14620 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72  atic int test_er
14630 72 73 74 72 28 0a 20 20 76 6f 69 64 20 2a 20 63  rstr(.  void * c
14640 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
14650 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
14660 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
14670 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
14680 6a 76 5b 5d 0a 29 7b 0a 20 20 63 68 61 72 20 2a  jv[].){.  char *
14690 7a 43 6f 64 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  zCode;.  int i;.
146a0 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b    if( objc!=1 ){
146b0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
146c0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
146d0 20 6f 62 6a 76 2c 20 22 3c 65 72 72 6f 72 20 63   objv, "<error c
146e0 6f 64 65 3e 22 29 3b 0a 20 20 7d 0a 0a 20 20 7a  ode>");.  }..  z
146f0 43 6f 64 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Code = Tcl_GetSt
14700 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20  ring(objv[1]);. 
14710 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 30 30 3b   for(i=0; i<200;
14720 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 30   i++){.    if( 0
14730 3d 3d 73 74 72 63 6d 70 28 74 31 45 72 72 6f 72  ==strcmp(t1Error
14740 4e 61 6d 65 28 69 29 2c 20 7a 43 6f 64 65 29 20  Name(i), zCode) 
14750 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 54  ) break;.  }.  T
14760 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
14770 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
14780 69 74 65 33 45 72 72 53 74 72 28 69 29 2c 20 30  ite3ErrStr(i), 0
14790 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
147a0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
147b0 67 65 3a 20 20 20 20 62 72 65 61 6b 70 6f 69 6e  ge:    breakpoin
147c0 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  t.**.** This rou
147d0 74 69 6e 65 20 65 78 69 73 74 73 20 66 6f 72 20  tine exists for 
147e0 6f 6e 65 20 70 75 72 70 6f 73 65 20 2d 20 74 6f  one purpose - to
147f0 20 70 72 6f 76 69 64 65 20 61 20 70 6c 61 63 65   provide a place
14800 20 74 6f 20 70 75 74 20 61 0a 2a 2a 20 62 72 65   to put a.** bre
14810 61 6b 70 6f 69 6e 74 20 77 69 74 68 20 47 44 42  akpoint with GDB
14820 20 74 68 61 74 20 63 61 6e 20 62 65 20 74 72 69   that can be tri
14830 67 67 65 72 65 64 20 75 73 69 6e 67 20 54 43 4c  ggered using TCL
14840 20 63 6f 64 65 2e 20 20 54 68 65 20 75 73 65 0a   code.  The use.
14850 2a 2a 20 66 6f 72 20 74 68 69 73 20 69 73 20 77  ** for this is w
14860 68 65 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72  hen a particular
14870 20 74 65 73 74 20 66 61 69 6c 73 20 6f 6e 20 28   test fails on (
14880 73 61 79 29 20 74 68 65 20 31 34 38 35 74 68 20  say) the 1485th 
14890 69 74 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e  iteration..** In
148a0 20 74 68 65 20 54 43 4c 20 74 65 73 74 20 73 63   the TCL test sc
148b0 72 69 70 74 2c 20 77 65 20 63 61 6e 20 61 64 64  ript, we can add
148c0 20 63 6f 64 65 20 6c 69 6b 65 20 74 68 69 73 3a   code like this:
148d0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 69 66 20 7b 24  .**.**     if {$
148e0 69 3d 3d 31 34 38 35 7d 20 62 72 65 61 6b 70 6f  i==1485} breakpo
148f0 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 72  int.**.** Then r
14900 75 6e 20 74 65 73 74 66 69 78 74 75 72 65 20 69  un testfixture i
14910 6e 20 74 68 65 20 64 65 62 75 67 67 65 72 20 61  n the debugger a
14920 6e 64 20 77 61 69 74 20 66 6f 72 20 74 68 65 20  nd wait for the 
14930 62 72 65 61 6b 70 6f 69 6e 74 20 74 6f 0a 2a 2a  breakpoint to.**
14940 20 66 69 72 65 2e 20 20 54 68 65 6e 20 61 64 64   fire.  Then add
14950 69 74 69 6f 6e 61 6c 20 62 72 65 61 6b 70 6f 69  itional breakpoi
14960 6e 74 73 20 63 61 6e 20 62 65 20 73 65 74 20 74  nts can be set t
14970 6f 20 74 72 61 63 65 20 64 6f 77 6e 20 74 68 65  o trace down the
14980 20 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   bug..*/.static 
14990 69 6e 74 20 74 65 73 74 5f 62 72 65 61 6b 70 6f  int test_breakpo
149a0 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  int(.  void *Not
149b0 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
149c0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
149d0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
149e0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
149f0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
14a00 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
14a10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
14a20 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
14a30 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
14a40 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
14a50 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
14a60 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
14a70 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20  return TCL_OK;  
14a80 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
14a90 68 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  hing */.}../*.**
14aa0 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
14ab0 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 20  3_bind_zeroblob 
14ac0 20 53 54 4d 54 20 49 44 58 20 4e 0a 2a 2a 0a 2a   STMT IDX N.**.*
14ad0 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74  * Test the sqlit
14ae0 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62  e3_bind_zeroblob
14af0 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d   interface.  STM
14b00 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20  T is a prepared 
14b10 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 49 44  statement..** ID
14b20 58 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  X is the index o
14b30 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20  f a wildcard in 
14b40 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
14b50 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  tement.  This co
14b60 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61  mmand.** binds a
14b70 20 4e 2d 62 79 74 65 20 7a 65 72 6f 2d 66 69 6c   N-byte zero-fil
14b80 6c 65 64 20 42 4c 4f 42 20 74 6f 20 74 68 65 20  led BLOB to the 
14b90 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61  wildcard..*/.sta
14ba0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
14bb0 64 5f 7a 65 72 6f 62 6c 6f 62 28 0a 20 20 76 6f  d_zeroblob(.  vo
14bc0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
14bd0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
14be0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
14bf0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
14c00 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
14c10 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
14c20 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  tmt;.  int idx;.
14c30 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 72    int n;.  int r
14c40 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
14c50 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  4 ){.    Tcl_Wro
14c60 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
14c70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54  , 1, objv, "STMT
14c80 20 49 44 58 20 4e 22 29 3b 0a 20 20 20 20 72 65   IDX N");.    re
14c90 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14ca0 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
14cb0 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
14cc0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
14cd0 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
14ce0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
14cf0 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
14d00 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
14d10 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
14d20 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
14d30 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
14d40 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
14d50 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
14d60 2c 20 26 6e 29 20 29 20 72 65 74 75 72 6e 20 54  , &n) ) return T
14d70 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
14d80 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a  = sqlite3_bind_z
14d90 65 72 6f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69  eroblob(pStmt, i
14da0 64 78 2c 20 6e 29 3b 0a 20 20 69 66 28 20 73 71  dx, n);.  if( sq
14db0 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
14dc0 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44  (interp, StmtToD
14dd0 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20  b(pStmt), rc) ) 
14de0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14df0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
14e00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
14e10 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
14e20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
14e30 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
14e40 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
14e50 69 6e 64 5f 69 6e 74 20 20 53 54 4d 54 20 4e 20  ind_int  STMT N 
14e60 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74  VALUE.**.** Test
14e70 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e   the sqlite3_bin
14e80 64 5f 69 6e 74 20 69 6e 74 65 72 66 61 63 65 2e  d_int interface.
14e90 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70    STMT is a prep
14ea0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
14eb0 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65  ** N is the inde
14ec0 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20  x of a wildcard 
14ed0 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
14ee0 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73  statement.  This
14ef0 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64   command.** bind
14f00 73 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  s a 32-bit integ
14f10 65 72 20 56 41 4c 55 45 20 74 6f 20 74 68 61 74  er VALUE to that
14f20 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74   wildcard..*/.st
14f30 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69  atic int test_bi
14f40 6e 64 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a  nd_int(.  void *
14f50 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
14f60 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
14f70 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
14f80 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
14f90 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
14fa0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
14fb0 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e  .  int idx;.  in
14fc0 74 20 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72  t value;.  int r
14fd0 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
14fe0 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
14ff0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
15000 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
15010 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
15020 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
15030 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
15040 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54  v[0], 0), " STMT
15050 20 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20   N VALUE", 0);. 
15060 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
15070 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
15080 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
15090 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
150a0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
150b0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
150c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
150d0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
150e0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
150f0 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75  2], &idx) ) retu
15100 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15110 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
15120 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
15130 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20 29  jv[3], &value) )
15140 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
15150 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
15160 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d  e3_bind_int(pStm
15170 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 29 3b 0a  t, idx, value);.
15180 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
15190 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
151a0 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29   StmtToDb(pStmt)
151b0 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
151c0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
151d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
151e0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
151f0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65  ERROR;.  }..  re
15200 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
15210 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
15220 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
15230 36 34 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45  64  STMT N VALUE
15240 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20  .**.** Test the 
15250 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
15260 36 34 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53  64 interface.  S
15270 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65  TMT is a prepare
15280 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  d statement..** 
15290 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  N is the index o
152a0 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20  f a wildcard in 
152b0 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
152c0 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  tement.  This co
152d0 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61  mmand.** binds a
152e0 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
152f0 56 41 4c 55 45 20 74 6f 20 74 68 61 74 20 77 69  VALUE to that wi
15300 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69  ldcard..*/.stati
15310 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f  c int test_bind_
15320 69 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 20  int64(.  void * 
15330 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
15340 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
15350 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
15360 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
15370 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
15380 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
15390 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 54 63 6c    int idx;.  Tcl
153a0 5f 57 69 64 65 49 6e 74 20 76 61 6c 75 65 3b 0a  _WideInt value;.
153b0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
153c0 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
153d0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
153e0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
153f0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
15400 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
15410 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
15420 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
15430 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 22   " STMT N VALUE"
15440 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
15450 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
15460 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
15470 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
15480 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
15490 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
154a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
154b0 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
154c0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
154d0 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29  , objv[2], &idx)
154e0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
154f0 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
15500 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a  etWideIntFromObj
15510 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
15520 2c 20 26 76 61 6c 75 65 29 20 29 20 72 65 74 75  , &value) ) retu
15530 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
15540 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69   rc = sqlite3_bi
15550 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  nd_int64(pStmt, 
15560 69 64 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69  idx, value);.  i
15570 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
15580 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74  rCode(interp, St
15590 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72  mtToDb(pStmt), r
155a0 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
155b0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21  ERROR;.  if( rc!
155c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
155d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
155e0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  OR;.  }..  retur
155f0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  n TCL_OK;.}.../*
15600 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
15610 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65  ite3_bind_double
15620 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a 2a    STMT N VALUE.*
15630 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71  *.** Test the sq
15640 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c  lite3_bind_doubl
15650 65 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54  e interface.  ST
15660 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64  MT is a prepared
15670 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e   statement..** N
15680 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
15690 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74   a wildcard in t
156a0 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
156b0 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d  ement.  This com
156c0 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20  mand.** binds a 
156d0 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 56  64-bit integer V
156e0 41 4c 55 45 20 74 6f 20 74 68 61 74 20 77 69 6c  ALUE to that wil
156f0 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  dcard..*/.static
15700 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 64   int test_bind_d
15710 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 20  ouble(.  void * 
15720 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
15730 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
15740 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
15750 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
15760 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
15770 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
15780 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 64 6f 75    int idx;.  dou
15790 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20 69 6e 74  ble value;.  int
157a0 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61   rc;.  const cha
157b0 72 20 2a 7a 56 61 6c 3b 0a 20 20 69 6e 74 20 69  r *zVal;.  int i
157c0 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
157d0 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f   struct {.    co
157e0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
157f0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
15800 74 68 65 20 73 70 65 63 69 61 6c 20 66 6c 6f 61  the special floa
15810 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
15820 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64   */.    unsigned
15830 20 69 6e 74 20 69 55 70 70 65 72 3b 20 20 20 2f   int iUpper;   /
15840 2a 20 55 70 70 65 72 20 33 32 20 62 69 74 73 20  * Upper 32 bits 
15850 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  */.    unsigned 
15860 69 6e 74 20 69 4c 6f 77 65 72 3b 20 20 20 2f 2a  int iLower;   /*
15870 20 4c 6f 77 65 72 20 33 32 20 62 69 74 73 20 2a   Lower 32 bits *
15880 2f 0a 20 20 7d 20 61 53 70 65 63 69 61 6c 46 70  /.  } aSpecialFp
15890 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 20 22 4e  [] = {.    {  "N
158a0 61 4e 22 2c 20 20 20 20 20 20 30 78 37 66 66 66  aN",      0x7fff
158b0 66 66 66 66 2c 20 30 78 66 66 66 66 66 66 66 66  ffff, 0xffffffff
158c0 20 7d 2c 0a 20 20 20 20 7b 20 20 22 53 4e 61 4e   },.    {  "SNaN
158d0 22 2c 20 20 20 20 20 30 78 37 66 66 37 66 66 66  ",     0x7ff7fff
158e0 66 2c 20 30 78 66 66 66 66 66 66 66 66 20 7d 2c  f, 0xffffffff },
158f0 0a 20 20 20 20 7b 20 20 22 2d 4e 61 4e 22 2c 20  .    {  "-NaN", 
15900 20 20 20 20 30 78 66 66 66 66 66 66 66 66 2c 20      0xffffffff, 
15910 30 78 66 66 66 66 66 66 66 66 20 7d 2c 0a 20 20  0xffffffff },.  
15920 20 20 7b 20 20 22 2d 53 4e 61 4e 22 2c 20 20 20    {  "-SNaN",   
15930 20 30 78 66 66 66 37 66 66 66 66 2c 20 30 78 66   0xfff7ffff, 0xf
15940 66 66 66 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b  fffffff },.    {
15950 20 20 22 2b 49 6e 66 22 2c 20 20 20 20 20 30 78    "+Inf",     0x
15960 37 66 66 30 30 30 30 30 2c 20 30 78 30 30 30 30  7ff00000, 0x0000
15970 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 20 22  0000 },.    {  "
15980 2d 49 6e 66 22 2c 20 20 20 20 20 30 78 66 66 66  -Inf",     0xfff
15990 30 30 30 30 30 2c 20 30 78 30 30 30 30 30 30 30  00000, 0x0000000
159a0 30 20 7d 2c 0a 20 20 20 20 7b 20 20 22 45 70 73  0 },.    {  "Eps
159b0 69 6c 6f 6e 22 2c 20 20 30 78 30 30 30 30 30 30  ilon",  0x000000
159c0 30 30 2c 20 30 78 30 30 30 30 30 30 30 31 20 7d  00, 0x00000001 }
159d0 2c 0a 20 20 20 20 7b 20 20 22 2d 45 70 73 69 6c  ,.    {  "-Epsil
159e0 6f 6e 22 2c 20 30 78 38 30 30 30 30 30 30 30 2c  on", 0x80000000,
159f0 20 30 78 30 30 30 30 30 30 30 31 20 7d 2c 0a 20   0x00000001 },. 
15a00 20 20 20 7b 20 20 22 4e 61 4e 30 22 2c 20 20 20     {  "NaN0",   
15a10 20 20 30 78 37 66 66 38 30 30 30 30 2c 20 30 78    0x7ff80000, 0x
15a20 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20  00000000 },.    
15a30 7b 20 20 22 2d 4e 61 4e 30 22 2c 20 20 20 20 30  {  "-NaN0",    0
15a40 78 66 66 66 38 30 30 30 30 2c 20 30 78 30 30 30  xfff80000, 0x000
15a50 30 30 30 30 30 20 7d 2c 0a 20 20 7d 3b 0a 0a 20  00000 },.  };.. 
15a60 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
15a70 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
15a80 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
15a90 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
15aa0 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
15ab0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
15ac0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
15ad0 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41   0), " STMT N VA
15ae0 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  LUE", 0);.    re
15af0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15b00 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
15b10 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
15b20 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
15b30 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
15b40 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
15b50 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
15b60 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
15b70 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
15b80 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
15b90 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 49  L_ERROR;..  /* I
15ba0 6e 74 65 72 63 65 70 74 20 74 68 65 20 73 74 72  ntercept the str
15bb0 69 6e 67 20 22 4e 61 4e 22 20 61 6e 64 20 67 65  ing "NaN" and ge
15bc0 6e 65 72 61 74 65 20 61 20 4e 61 4e 20 76 61 6c  nerate a NaN val
15bd0 75 65 20 66 6f 72 20 69 74 2e 0a 20 20 2a 2a 20  ue for it..  ** 
15be0 41 6c 6c 20 6f 74 68 65 72 20 73 74 72 69 6e 67  All other string
15bf0 73 20 61 72 65 20 70 61 73 73 65 64 20 74 68 72  s are passed thr
15c00 6f 75 67 68 20 74 6f 20 54 63 6c 5f 47 65 74 44  ough to Tcl_GetD
15c10 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 29 2e 0a  oubleFromObj()..
15c20 20 20 2a 2a 20 54 63 6c 5f 47 65 74 44 6f 75 62    ** Tcl_GetDoub
15c30 6c 65 46 72 6f 6d 4f 62 6a 28 29 20 73 68 6f 75  leFromObj() shou
15c40 6c 64 20 75 6e 64 65 72 73 74 61 6e 64 20 22 4e  ld understand "N
15c50 61 4e 22 20 62 75 74 20 73 6f 6d 65 20 76 65 72  aN" but some ver
15c60 73 69 6f 6e 73 0a 20 20 2a 2a 20 63 6f 6e 74 61  sions.  ** conta
15c70 69 6e 20 61 20 62 75 67 2e 0a 20 20 2a 2f 0a 20  in a bug..  */. 
15c80 20 7a 56 61 6c 20 3d 20 54 63 6c 5f 47 65 74 53   zVal = Tcl_GetS
15c90 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a  tring(objv[3]);.
15ca0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
15cb0 65 6f 66 28 61 53 70 65 63 69 61 6c 46 70 29 2f  eof(aSpecialFp)/
15cc0 73 69 7a 65 6f 66 28 61 53 70 65 63 69 61 6c 46  sizeof(aSpecialF
15cd0 70 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  p[0]); i++){.   
15ce0 20 69 66 28 20 73 74 72 63 6d 70 28 61 53 70 65   if( strcmp(aSpe
15cf0 63 69 61 6c 46 70 5b 69 5d 2e 7a 4e 61 6d 65 2c  cialFp[i].zName,
15d00 20 7a 56 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20   zVal)==0 ){.   
15d10 20 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36     sqlite3_uint6
15d20 34 20 78 3b 0a 20 20 20 20 20 20 78 20 3d 20 61  4 x;.      x = a
15d30 53 70 65 63 69 61 6c 46 70 5b 69 5d 2e 69 55 70  SpecialFp[i].iUp
15d40 70 65 72 3b 0a 20 20 20 20 20 20 78 20 3c 3c 3d  per;.      x <<=
15d50 20 33 32 3b 0a 20 20 20 20 20 20 78 20 7c 3d 20   32;.      x |= 
15d60 61 53 70 65 63 69 61 6c 46 70 5b 69 5d 2e 69 4c  aSpecialFp[i].iL
15d70 6f 77 65 72 3b 0a 20 20 20 20 20 20 61 73 73 65  ower;.      asse
15d80 72 74 28 20 73 69 7a 65 6f 66 28 76 61 6c 75 65  rt( sizeof(value
15d90 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 61 73  )==8 );.      as
15da0 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d  sert( sizeof(x)=
15db0 3d 38 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  =8 );.      memc
15dc0 70 79 28 26 76 61 6c 75 65 2c 20 26 78 2c 20 38  py(&value, &x, 8
15dd0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
15de0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
15df0 69 3e 3d 73 69 7a 65 6f 66 28 61 53 70 65 63 69  i>=sizeof(aSpeci
15e00 61 6c 46 70 29 2f 73 69 7a 65 6f 66 28 61 53 70  alFp)/sizeof(aSp
15e10 65 63 69 61 6c 46 70 5b 30 5d 29 20 26 26 0a 20  ecialFp[0]) &&. 
15e20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 44          Tcl_GetD
15e30 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74  oubleFromObj(int
15e40 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76  erp, objv[3], &v
15e50 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 72 65 74  alue) ){.    ret
15e60 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
15e70 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
15e80 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70 53  3_bind_double(pS
15e90 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 29  tmt, idx, value)
15ea0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
15eb0 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
15ec0 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d  p, StmtToDb(pStm
15ed0 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  t), rc) ) return
15ee0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
15ef0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15f00 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
15f10 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
15f20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
15f30 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
15f40 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
15f50 6c 6c 20 20 53 54 4d 54 20 4e 0a 2a 2a 0a 2a 2a  ll  STMT N.**.**
15f60 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65   Test the sqlite
15f70 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 69 6e 74 65  3_bind_null inte
15f80 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20  rface.  STMT is 
15f90 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
15fa0 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68  ment..** N is th
15fb0 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c  e index of a wil
15fc0 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65  dcard in the pre
15fd0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
15fe0 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a    This command.*
15ff0 2a 20 62 69 6e 64 73 20 61 20 4e 55 4c 4c 20 74  * binds a NULL t
16000 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e 0a  o the wildcard..
16010 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
16020 73 74 5f 62 69 6e 64 5f 6e 75 6c 6c 28 0a 20 20  st_bind_null(.  
16030 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
16040 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
16050 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
16060 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
16070 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
16080 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
16090 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78  pStmt;.  int idx
160a0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
160b0 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
160c0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
160d0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
160e0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
160f0 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
16100 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
16110 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
16120 29 2c 20 22 20 53 54 4d 54 20 4e 22 2c 20 30 29  ), " STMT N", 0)
16130 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
16140 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
16150 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
16160 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
16170 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
16180 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
16190 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
161a0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
161b0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
161c0 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72  jv[2], &idx) ) r
161d0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
161e0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
161f0 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74  _bind_null(pStmt
16200 2c 20 69 64 78 29 3b 0a 20 20 69 66 28 20 73 71  , idx);.  if( sq
16210 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
16220 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44  (interp, StmtToD
16230 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20  b(pStmt), rc) ) 
16240 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16250 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
16260 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
16270 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16280 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
16290 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
162a0 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
162b0 69 6e 64 5f 74 65 78 74 20 20 53 54 4d 54 20 4e  ind_text  STMT N
162c0 20 53 54 52 49 4e 47 20 42 59 54 45 53 0a 2a 2a   STRING BYTES.**
162d0 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c  .** Test the sql
162e0 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 20 69  ite3_bind_text i
162f0 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20  nterface.  STMT 
16300 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74  is a prepared st
16310 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73  atement..** N is
16320 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
16330 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20  wildcard in the 
16340 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
16350 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e  nt.  This comman
16360 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 55 54 46  d.** binds a UTF
16370 2d 38 20 73 74 72 69 6e 67 20 53 54 52 49 4e 47  -8 string STRING
16380 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64   to the wildcard
16390 2e 20 20 54 68 65 20 73 74 72 69 6e 67 20 69 73  .  The string is
163a0 20 42 59 54 45 53 20 62 79 74 65 73 0a 2a 2a 20   BYTES bytes.** 
163b0 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  long..*/.static 
163c0 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 74 65  int test_bind_te
163d0 78 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  xt(.  void * cli
163e0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
163f0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
16400 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
16410 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
16420 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
16430 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
16440 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 62 79  nt idx;.  int by
16450 74 65 73 3b 0a 20 20 63 68 61 72 20 2a 76 61 6c  tes;.  char *val
16460 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ue;.  int rc;.. 
16470 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a   if( objc!=5 ){.
16480 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
16490 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
164a0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
164b0 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
164c0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
164d0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
164e0 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41   0), " STMT N VA
164f0 4c 55 45 20 42 59 54 45 53 22 2c 20 30 29 3b 0a  LUE BYTES", 0);.
16500 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
16510 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
16520 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
16530 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
16540 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
16550 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
16560 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
16570 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
16580 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
16590 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74  [2], &idx) ) ret
165a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
165b0 20 76 61 6c 75 65 20 3d 20 28 63 68 61 72 2a 29   value = (char*)
165c0 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
165d0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
165e0 20 26 62 79 74 65 73 29 3b 0a 20 20 69 66 28 20   &bytes);.  if( 
165f0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
16600 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34  j(interp, objv[4
16610 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74  ], &bytes) ) ret
16620 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
16630 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
16640 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  ind_text(pStmt, 
16650 69 64 78 2c 20 76 61 6c 75 65 2c 20 62 79 74 65  idx, value, byte
16660 73 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  s, SQLITE_TRANSI
16670 45 4e 54 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  ENT);.  if( sqli
16680 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
16690 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28  nterp, StmtToDb(
166a0 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65  pStmt), rc) ) re
166b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
166c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
166d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  _OK ){.    Tcl_A
166e0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
166f0 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  rp, sqlite3ErrNa
16700 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  me(rc), 0);.    
16710 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16720 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
16730 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
16740 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
16750 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 20 3f 2d  3_bind_text16 ?-
16760 73 74 61 74 69 63 3f 20 53 54 4d 54 20 4e 20 53  static? STMT N S
16770 54 52 49 4e 47 20 42 59 54 45 53 0a 2a 2a 0a 2a  TRING BYTES.**.*
16780 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74  * Test the sqlit
16790 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 20 69  e3_bind_text16 i
167a0 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20  nterface.  STMT 
167b0 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74  is a prepared st
167c0 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73  atement..** N is
167d0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
167e0 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20  wildcard in the 
167f0 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
16800 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e  nt.  This comman
16810 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 55 54 46  d.** binds a UTF
16820 2d 31 36 20 73 74 72 69 6e 67 20 53 54 52 49 4e  -16 string STRIN
16830 47 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72  G to the wildcar
16840 64 2e 20 20 54 68 65 20 73 74 72 69 6e 67 20 69  d.  The string i
16850 73 20 42 59 54 45 53 20 62 79 74 65 73 0a 2a 2a  s BYTES bytes.**
16860 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63   long..*/.static
16870 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 74   int test_bind_t
16880 65 78 74 31 36 28 0a 20 20 76 6f 69 64 20 2a 20  ext16(.  void * 
16890 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
168a0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
168b0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
168c0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
168d0 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66  bjv[].){.#ifndef
168e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
168f0 31 36 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  16.  sqlite3_stm
16900 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
16910 69 64 78 3b 0a 20 20 69 6e 74 20 62 79 74 65 73  idx;.  int bytes
16920 3b 0a 20 20 63 68 61 72 20 2a 76 61 6c 75 65 3b  ;.  char *value;
16930 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 76 6f  .  int rc;..  vo
16940 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a  id (*xDel)(void*
16950 29 20 3d 20 28 6f 62 6a 63 3d 3d 36 3f 53 51 4c  ) = (objc==6?SQL
16960 49 54 45 5f 53 54 41 54 49 43 3a 53 51 4c 49 54  ITE_STATIC:SQLIT
16970 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
16980 54 63 6c 5f 4f 62 6a 20 2a 6f 53 74 6d 74 20 20  Tcl_Obj *oStmt  
16990 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 34 5d    = objv[objc-4]
169a0 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 4e 20  ;.  Tcl_Obj *oN 
169b0 20 20 20 20 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a        = objv[obj
169c0 63 2d 33 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  c-3];.  Tcl_Obj 
169d0 2a 6f 53 74 72 69 6e 67 20 20 3d 20 6f 62 6a 76  *oString  = objv
169e0 5b 6f 62 6a 63 2d 32 5d 3b 0a 20 20 54 63 6c 5f  [objc-2];.  Tcl_
169f0 4f 62 6a 20 2a 6f 42 79 74 65 73 20 20 20 3d 20  Obj *oBytes   = 
16a00 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 0a 20  objv[objc-1];.. 
16a10 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20   if( objc!=5 && 
16a20 6f 62 6a 63 21 3d 36 29 7b 0a 20 20 20 20 54 63  objc!=6){.    Tc
16a30 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
16a40 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
16a50 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
16a60 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
16a70 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
16a80 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
16a90 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 20 42 59   STMT N VALUE BY
16aa0 54 45 53 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  TES", 0);.    re
16ab0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
16ac0 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
16ad0 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
16ae0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
16af0 6f 53 74 6d 74 29 2c 20 26 70 53 74 6d 74 29 20  oStmt), &pStmt) 
16b00 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
16b10 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
16b20 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
16b30 72 70 2c 20 6f 4e 2c 20 26 69 64 78 29 20 29 20  rp, oN, &idx) ) 
16b40 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16b50 3b 0a 20 20 76 61 6c 75 65 20 3d 20 28 63 68 61  ;.  value = (cha
16b60 72 2a 29 54 63 6c 5f 47 65 74 42 79 74 65 41 72  r*)Tcl_GetByteAr
16b70 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 53 74 72 69  rayFromObj(oStri
16b80 6e 67 2c 20 30 29 3b 0a 20 20 69 66 28 20 54 63  ng, 0);.  if( Tc
16b90 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
16ba0 69 6e 74 65 72 70 2c 20 6f 42 79 74 65 73 2c 20  interp, oBytes, 
16bb0 26 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e  &bytes) ) return
16bc0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
16bd0 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
16be0 5f 74 65 78 74 31 36 28 70 53 74 6d 74 2c 20 69  _text16(pStmt, i
16bf0 64 78 2c 20 28 76 6f 69 64 20 2a 29 76 61 6c 75  dx, (void *)valu
16c00 65 2c 20 62 79 74 65 73 2c 20 78 44 65 6c 29 3b  e, bytes, xDel);
16c10 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
16c20 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
16c30 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74  , StmtToDb(pStmt
16c40 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  ), rc) ) return 
16c50 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
16c60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16c70 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
16c80 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73  Result(interp, s
16c90 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
16ca0 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ), 0);.    retur
16cb0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
16cc0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
16cd0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
16ce0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
16cf0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
16d00 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
16d10 5f 62 6c 6f 62 20 3f 2d 73 74 61 74 69 63 3f 20  _blob ?-static? 
16d20 53 54 4d 54 20 4e 20 44 41 54 41 20 42 59 54 45  STMT N DATA BYTE
16d30 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65  S.**.** Test the
16d40 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
16d50 6f 62 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53  ob interface.  S
16d60 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65  TMT is a prepare
16d70 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  d statement..** 
16d80 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  N is the index o
16d90 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20  f a wildcard in 
16da0 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
16db0 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  tement.  This co
16dc0 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61  mmand.** binds a
16dd0 20 42 4c 4f 42 20 74 6f 20 74 68 65 20 77 69 6c   BLOB to the wil
16de0 64 63 61 72 64 2e 20 20 54 68 65 20 42 4c 4f 42  dcard.  The BLOB
16df0 20 69 73 20 42 59 54 45 53 20 62 79 74 65 73 20   is BYTES bytes 
16e00 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  in size..*/.stat
16e10 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
16e20 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20  _blob(.  void * 
16e30 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
16e40 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
16e50 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
16e60 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
16e70 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
16e80 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
16e90 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74    int idx;.  int
16ea0 20 62 79 74 65 73 3b 0a 20 20 63 68 61 72 20 2a   bytes;.  char *
16eb0 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b  value;.  int rc;
16ec0 0a 20 20 73 71 6c 69 74 65 33 5f 64 65 73 74 72  .  sqlite3_destr
16ed0 75 63 74 6f 72 5f 74 79 70 65 20 78 44 65 73 74  uctor_type xDest
16ee0 72 75 63 74 6f 72 20 3d 20 53 51 4c 49 54 45 5f  ructor = SQLITE_
16ef0 54 52 41 4e 53 49 45 4e 54 3b 0a 0a 20 20 69 66  TRANSIENT;..  if
16f00 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a  ( objc!=5 && obj
16f10 63 21 3d 36 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=6 ){.    Tcl_
16f20 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
16f30 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
16f40 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
16f50 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
16f60 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
16f70 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53  objv[0], 0), " S
16f80 54 4d 54 20 4e 20 44 41 54 41 20 42 59 54 45 53  TMT N DATA BYTES
16f90 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
16fa0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
16fb0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 36 20  ..  if( objc==6 
16fc0 29 7b 0a 20 20 20 20 78 44 65 73 74 72 75 63 74  ){.    xDestruct
16fd0 6f 72 20 3d 20 53 51 4c 49 54 45 5f 53 54 41 54  or = SQLITE_STAT
16fe0 49 43 3b 0a 20 20 20 20 6f 62 6a 76 2b 2b 3b 0a  IC;.    objv++;.
16ff0 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
17000 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
17010 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
17020 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
17030 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
17040 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
17050 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
17060 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
17070 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
17080 4c 5f 45 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65  L_ERROR;.  value
17090 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
170a0 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 69 66 28  (objv[3]);.  if(
170b0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
170c0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
170d0 34 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65  4], &bytes) ) re
170e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
170f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
17100 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c  bind_blob(pStmt,
17110 20 69 64 78 2c 20 76 61 6c 75 65 2c 20 62 79 74   idx, value, byt
17120 65 73 2c 20 78 44 65 73 74 72 75 63 74 6f 72 29  es, xDestructor)
17130 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
17140 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
17150 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d  p, StmtToDb(pStm
17160 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  t), rc) ) return
17170 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
17180 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17190 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
171a0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
171b0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
171c0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
171d0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61   sqlite3_bind_pa
171e0 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 20 20 53  rameter_count  S
171f0 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  TMT.**.** Return
17200 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77   the number of w
17210 69 6c 64 63 61 72 64 73 20 69 6e 20 74 68 65 20  ildcards in the 
17220 67 69 76 65 6e 20 73 74 61 74 65 6d 65 6e 74 2e  given statement.
17230 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
17240 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  est_bind_paramet
17250 65 72 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64  er_count(.  void
17260 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
17270 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
17280 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
17290 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
172a0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
172b0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
172c0 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  t;..  if( objc!=
172d0 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
172e0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
172f0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54  , 1, objv, "STMT
17300 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
17310 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
17320 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
17330 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
17340 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
17350 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
17360 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17370 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
17380 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
17390 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
173a0 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63  bind_parameter_c
173b0 6f 75 6e 74 28 70 53 74 6d 74 29 29 29 3b 0a 20  ount(pStmt)));. 
173c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
173d0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
173e0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70    sqlite3_bind_p
173f0 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 20 20 53  arameter_name  S
17400 54 4d 54 20 20 4e 0a 2a 2a 0a 2a 2a 20 52 65 74  TMT  N.**.** Ret
17410 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
17420 74 68 65 20 4e 74 68 20 77 69 6c 64 63 61 72 64  the Nth wildcard
17430 2e 20 20 54 68 65 20 66 69 72 73 74 20 77 69 6c  .  The first wil
17440 64 63 61 72 64 20 69 73 20 31 2e 0a 2a 2a 20 41  dcard is 1..** A
17450 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 69  n empty string i
17460 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 4e 20  s returned if N 
17470 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20  is out of range 
17480 6f 72 20 69 66 20 74 68 65 20 77 69 6c 64 63 61  or if the wildca
17490 72 64 0a 2a 2a 20 69 73 20 6e 61 6d 65 6c 65 73  rd.** is nameles
174a0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
174b0 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d   test_bind_param
174c0 65 74 65 72 5f 6e 61 6d 65 28 0a 20 20 76 6f 69  eter_name(.  voi
174d0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
174e0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
174f0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
17500 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
17510 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
17520 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
17530 6d 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  mt;.  int i;..  
17540 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
17550 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
17560 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
17570 62 6a 76 2c 20 22 53 54 4d 54 20 4e 22 29 3b 0a  bjv, "STMT N");.
17580 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
17590 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
175a0 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
175b0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
175c0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
175d0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
175e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
175f0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
17600 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
17610 32 5d 2c 20 26 69 29 20 29 20 72 65 74 75 72 6e  2], &i) ) return
17620 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
17630 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
17640 6e 74 65 72 70 2c 20 0a 20 20 20 20 20 54 63 6c  nterp, .     Tcl
17650 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71  _NewStringObj(sq
17660 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
17670 65 74 65 72 5f 6e 61 6d 65 28 70 53 74 6d 74 2c  eter_name(pStmt,
17680 69 29 2c 2d 31 29 0a 20 20 29 3b 0a 20 20 72 65  i),-1).  );.  re
17690 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
176a0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
176b0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
176c0 6d 65 74 65 72 5f 69 6e 64 65 78 20 20 53 54 4d  meter_index  STM
176d0 54 20 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65  T  NAME.**.** Re
176e0 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
176f0 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 20 63  f the wildcard c
17700 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 52 65 74  alled NAME.  Ret
17710 75 72 6e 20 30 20 69 66 20 74 68 65 72 65 20 69  urn 0 if there i
17720 73 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 77 69 6c  s.** no such wil
17730 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  dcard..*/.static
17740 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 70   int test_bind_p
17750 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 28 0a  arameter_index(.
17760 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
17770 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
17780 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
17790 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
177a0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
177b0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
177c0 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20   *pStmt;..  if( 
177d0 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
177e0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
177f0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
17800 20 22 53 54 4d 54 20 4e 41 4d 45 22 29 3b 0a 20   "STMT NAME");. 
17810 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
17820 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
17830 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
17840 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
17850 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
17860 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
17870 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
17880 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
17890 65 72 70 2c 20 0a 20 20 20 20 20 54 63 6c 5f 4e  erp, .     Tcl_N
178a0 65 77 49 6e 74 4f 62 6a 28 0a 20 20 20 20 20 20  ewIntObj(.      
178b0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61   sqlite3_bind_pa
178c0 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 28 70 53  rameter_index(pS
178d0 74 6d 74 2c 54 63 6c 5f 47 65 74 53 74 72 69 6e  tmt,Tcl_GetStrin
178e0 67 28 6f 62 6a 76 5b 32 5d 29 29 0a 20 20 20 20  g(objv[2])).    
178f0 20 29 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e   ).  );.  return
17900 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
17910 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
17920 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67  e3_clear_binding
17930 73 20 53 54 4d 54 0a 2a 2a 0a 2a 2f 0a 73 74 61  s STMT.**.*/.sta
17940 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6c 65  tic int test_cle
17950 61 72 5f 62 69 6e 64 69 6e 67 73 28 0a 20 20 76  ar_bindings(.  v
17960 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
17970 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
17980 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
17990 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
179a0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
179b0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
179c0 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  Stmt;..  if( obj
179d0 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
179e0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
179f0 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
17a00 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72  TMT");.    retur
17a10 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
17a20 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
17a30 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
17a40 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
17a50 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
17a60 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17a70 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
17a80 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
17a90 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
17aa0 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67  e3_clear_binding
17ab0 73 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 72 65  s(pStmt)));.  re
17ac0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
17ad0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
17ae0 71 6c 69 74 65 33 5f 73 6c 65 65 70 20 4d 49 4c  qlite3_sleep MIL
17af0 4c 49 53 45 43 4f 4e 44 53 0a 2a 2f 0a 73 74 61  LISECONDS.*/.sta
17b00 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 6c 65  tic int test_sle
17b10 65 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ep(.  void * cli
17b20 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
17b30 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
17b40 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
17b50 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
17b60 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 6d 73 3b 0a  [].){.  int ms;.
17b70 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
17b80 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
17b90 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
17ba0 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49 53 45  , objv, "MILLISE
17bb0 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20 72 65 74  CONDS");.    ret
17bc0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17bd0 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
17be0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
17bf0 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 6d 73 29  p, objv[1], &ms)
17c00 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
17c10 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
17c20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
17c30 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
17c40 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 73  IntObj(sqlite3_s
17c50 6c 65 65 70 28 6d 73 29 29 29 3b 0a 20 20 72 65  leep(ms)));.  re
17c60 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
17c70 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
17c80 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72  ite3_extended_er
17c90 72 63 6f 64 65 20 44 42 0a 2a 2a 0a 2a 2a 20 52  rcode DB.**.** R
17ca0 65 74 75 72 6e 20 74 68 65 20 73 74 72 69 6e 67  eturn the string
17cb0 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
17cc0 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
17cd0 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49  nt sqlite3_* API
17ce0 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  .** error code. 
17cf0 65 2e 67 2e 20 22 53 51 4c 49 54 45 5f 45 52 52  e.g. "SQLITE_ERR
17d00 4f 52 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  OR"..*/.static i
17d10 6e 74 20 74 65 73 74 5f 65 78 5f 65 72 72 63 6f  nt test_ex_errco
17d20 64 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  de(.  void * cli
17d30 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
17d40 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
17d50 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
17d60 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
17d70 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
17d80 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  *db;.  int rc;..
17d90 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
17da0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
17db0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
17dc0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
17dd0 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
17de0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
17df0 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42  g(objv[0]), " DB
17e00 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
17e10 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
17e20 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
17e30 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
17e40 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
17e50 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
17e60 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
17e70 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 74 65  c = sqlite3_exte
17e80 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 64 62 29  nded_errcode(db)
17e90 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
17ea0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
17eb0 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
17ec0 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75  (rc), 0);.  retu
17ed0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
17ee0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
17ef0 74 65 33 5f 65 72 72 63 6f 64 65 20 44 42 0a 2a  te3_errcode DB.*
17f00 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
17f10 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74  string represent
17f20 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73  ation of the mos
17f30 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33  t recent sqlite3
17f40 5f 2a 20 41 50 49 0a 2a 2a 20 65 72 72 6f 72 20  _* API.** error 
17f50 63 6f 64 65 2e 20 65 2e 67 2e 20 22 53 51 4c 49  code. e.g. "SQLI
17f60 54 45 5f 45 52 52 4f 52 22 2e 0a 2a 2f 0a 73 74  TE_ERROR"..*/.st
17f70 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72  atic int test_er
17f80 72 63 6f 64 65 28 0a 20 20 76 6f 69 64 20 2a 20  rcode(.  void * 
17f90 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
17fa0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
17fb0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
17fc0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
17fd0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
17fe0 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
17ff0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
18000 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
18010 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
18020 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
18030 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
18040 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
18050 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
18060 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
18070 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18080 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
18090 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
180a0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
180b0 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
180c0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
180d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
180e0 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 54 63  rrcode(db);.  Tc
180f0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
18100 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
18110 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
18120 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
18130 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
18140 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 65  age:   sqlite3_e
18150 72 72 6d 73 67 20 44 42 0a 2a 2a 0a 2a 2a 20 52  rrmsg DB.**.** R
18160 65 74 75 72 6e 73 20 74 68 65 20 55 54 46 2d 38  eturns the UTF-8
18170 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
18180 6f 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  of the error mes
18190 73 61 67 65 20 73 74 72 69 6e 67 20 66 6f 72 20  sage string for 
181a0 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65  the.** most rece
181b0 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49  nt sqlite3_* API
181c0 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   call..*/.static
181d0 20 69 6e 74 20 74 65 73 74 5f 65 72 72 6d 73 67   int test_errmsg
181e0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
181f0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
18200 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
18210 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
18220 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
18230 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
18240 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
18250 2a 7a 45 72 72 3b 0a 0a 20 20 69 66 28 20 6f 62  *zErr;..  if( ob
18260 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
18270 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
18280 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
18290 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
182a0 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
182b0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
182c0 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20  ]), " DB", 0);. 
182d0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
182e0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
182f0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
18300 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
18310 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
18320 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
18330 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20 3d 20 73  ROR;..  zErr = s
18340 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
18350 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
18360 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
18370 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
18380 45 72 72 2c 20 2d 31 29 29 3b 0a 20 20 72 65 74  Err, -1));.  ret
18390 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
183a0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 74 65  *.** Usage:   te
183b0 73 74 5f 65 72 72 6d 73 67 31 36 20 44 42 0a 2a  st_errmsg16 DB.*
183c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65  *.** Returns the
183d0 20 55 54 46 2d 31 36 20 72 65 70 72 65 73 65 6e   UTF-16 represen
183e0 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 72  tation of the er
183f0 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72 69  ror message stri
18400 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6d 6f  ng for the.** mo
18410 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65  st recent sqlite
18420 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e 20 54 68  3_* API call. Th
18430 69 73 20 69 73 20 61 20 62 79 74 65 20 61 72 72  is is a byte arr
18440 61 79 20 6f 62 6a 65 63 74 20 61 74 20 74 68 65  ay object at the
18450 20 54 43 4c 20 0a 2a 2a 20 6c 65 76 65 6c 2c 20   TCL .** level, 
18460 61 6e 64 20 69 74 20 69 6e 63 6c 75 64 65 73 20  and it includes 
18470 74 68 65 20 30 78 30 30 20 30 78 30 30 20 74 65  the 0x00 0x00 te
18480 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 73 20 61  rminator bytes a
18490 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
184a0 0a 2a 2a 20 55 54 46 2d 31 36 20 73 74 72 69 6e  .** UTF-16 strin
184b0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
184c0 20 74 65 73 74 5f 65 72 72 6d 73 67 31 36 28 0a   test_errmsg16(.
184d0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
184e0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
184f0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
18500 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
18510 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
18520 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
18530 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71  _OMIT_UTF16.  sq
18540 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
18550 73 74 20 76 6f 69 64 20 2a 7a 45 72 72 3b 0a 20  st void *zErr;. 
18560 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
18570 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20 30 3b    int bytes = 0;
18580 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
18590 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
185a0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
185b0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
185c0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
185d0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
185e0 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
185f0 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
18600 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
18610 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
18620 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
18630 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
18640 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
18650 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
18660 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33    zErr = sqlite3
18670 5f 65 72 72 6d 73 67 31 36 28 64 62 29 3b 0a 20  _errmsg16(db);. 
18680 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20   if( zErr ){.   
18690 20 7a 20 3d 20 7a 45 72 72 3b 0a 20 20 20 20 66   z = zErr;.    f
186a0 6f 72 28 62 79 74 65 73 3d 30 3b 20 7a 5b 62 79  or(bytes=0; z[by
186b0 74 65 73 5d 20 7c 7c 20 7a 5b 62 79 74 65 73 2b  tes] || z[bytes+
186c0 31 5d 3b 20 62 79 74 65 73 2b 3d 32 29 7b 7d 0a  1]; bytes+=2){}.
186d0 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a    }.  Tcl_SetObj
186e0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
186f0 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
18700 62 6a 28 7a 45 72 72 2c 20 62 79 74 65 73 29 29  bj(zErr, bytes))
18710 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
18720 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
18730 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
18740 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
18750 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  : sqlite3_prepar
18760 65 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f  e DB sql bytes ?
18770 74 61 69 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a 20 43  tailvar?.**.** C
18780 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79  ompile up to <by
18790 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68  tes> bytes of th
187a0 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73  e supplied SQL s
187b0 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e  tring <sql> usin
187c0 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61  g.** database ha
187d0 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20 70  ndle <DB>. The p
187e0 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76 61  arameter <tailva
187f0 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  l> is the name o
18800 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61  f a global.** va
18810 72 69 61 62 6c 65 20 74 68 61 74 20 69 73 20 73  riable that is s
18820 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65 64  et to the unused
18830 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c   portion of <sql
18840 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a  > (if any). A.**
18850 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73 20   STMT handle is 
18860 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
18870 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65  tic int test_pre
18880 70 61 72 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  pare(.  void * c
18890 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
188a0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
188b0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
188c0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
188d0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
188e0 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
188f0 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74  har *zSql;.  int
18900 20 62 79 74 65 73 3b 0a 20 20 63 6f 6e 73 74 20   bytes;.  const 
18910 63 68 61 72 20 2a 7a 54 61 69 6c 20 3d 20 30 3b  char *zTail = 0;
18920 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
18930 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68  *pStmt = 0;.  ch
18940 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 69  ar zBuf[50];.  i
18950 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
18960 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34  jc!=5 && objc!=4
18970 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
18980 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
18990 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
189a0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
189b0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
189c0 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
189d0 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74   DB sql bytes ?t
189e0 61 69 6c 76 61 72 3f 22 2c 20 30 29 3b 0a 20 20  ailvar?", 0);.  
189f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
18a00 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
18a10 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
18a20 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
18a30 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
18a40 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
18a50 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c  OR;.  zSql = Tcl
18a60 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
18a70 32 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  2]);.  if( Tcl_G
18a80 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
18a90 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62  erp, objv[3], &b
18aa0 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54  ytes) ) return T
18ab0 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
18ac0 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
18ad0 65 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65  e(db, zSql, byte
18ae0 73 2c 20 26 70 53 74 6d 74 2c 20 6f 62 6a 63 3e  s, &pStmt, objc>
18af0 3d 35 20 3f 20 26 7a 54 61 69 6c 20 3a 20 30 29  =5 ? &zTail : 0)
18b00 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73  ;.  Tcl_ResetRes
18b10 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 69  ult(interp);.  i
18b20 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
18b30 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62  rCode(interp, db
18b40 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
18b50 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
18b60 7a 54 61 69 6c 20 26 26 20 6f 62 6a 63 3e 3d 35  zTail && objc>=5
18b70 20 29 7b 0a 20 20 20 20 69 66 28 20 62 79 74 65   ){.    if( byte
18b80 73 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 79  s>=0 ){.      by
18b90 74 65 73 20 3d 20 62 79 74 65 73 20 2d 20 28 69  tes = bytes - (i
18ba0 6e 74 29 28 7a 54 61 69 6c 2d 7a 53 71 6c 29 3b  nt)(zTail-zSql);
18bb0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
18bc0 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54 61 69 6c  int)strlen(zTail
18bd0 29 3c 62 79 74 65 73 20 29 7b 0a 20 20 20 20 20  )<bytes ){.     
18be0 20 62 79 74 65 73 20 3d 20 28 69 6e 74 29 73 74   bytes = (int)st
18bf0 72 6c 65 6e 28 7a 54 61 69 6c 29 3b 0a 20 20 20  rlen(zTail);.   
18c00 20 7d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65   }.    Tcl_ObjSe
18c10 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f 62  tVar2(interp, ob
18c20 6a 76 5b 34 5d 2c 20 30 2c 20 54 63 6c 5f 4e 65  jv[4], 0, Tcl_Ne
18c30 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 61 69 6c  wStringObj(zTail
18c40 2c 20 62 79 74 65 73 29 2c 20 30 29 3b 0a 20 20  , bytes), 0);.  
18c50 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
18c60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
18c70 65 72 74 28 20 70 53 74 6d 74 3d 3d 30 20 29 3b  ert( pStmt==0 );
18c80 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
18c90 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b  f, "(%d) ", rc);
18ca0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
18cb0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
18cc0 75 66 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  uf, sqlite3_errm
18cd0 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20  sg(db), 0);.    
18ce0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
18cf0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74  ;.  }..  if( pSt
18d00 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  mt ){.    if( sq
18d10 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
18d20 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
18d30 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72  zBuf, pStmt) ) r
18d40 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
18d50 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
18d60 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
18d70 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  uf, 0);.  }.  re
18d80 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
18d90 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
18da0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 20  ite3_prepare_v2 
18db0 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74 61  DB sql bytes ?ta
18dc0 69 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d  ilvar?.**.** Com
18dd0 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79 74 65  pile up to <byte
18de0 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  s> bytes of the 
18df0 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73 74 72  supplied SQL str
18e00 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a  ing <sql> using.
18e10 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
18e20 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20 70 61 72  le <DB>. The par
18e30 61 6d 65 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e  ameter <tailval>
18e40 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
18e50 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69  a global.** vari
18e60 61 62 6c 65 20 74 68 61 74 20 69 73 20 73 65 74  able that is set
18e70 20 74 6f 20 74 68 65 20 75 6e 75 73 65 64 20 70   to the unused p
18e80 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20  ortion of <sql> 
18e90 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53  (if any). A.** S
18ea0 54 4d 54 20 68 61 6e 64 6c 65 20 69 73 20 72 65  TMT handle is re
18eb0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
18ec0 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65 70 61  c int test_prepa
18ed0 72 65 5f 76 32 28 0a 20 20 76 6f 69 64 20 2a 20  re_v2(.  void * 
18ee0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
18ef0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
18f00 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
18f10 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
18f20 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
18f30 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
18f40 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e  char *zSql;.  in
18f50 74 20 62 79 74 65 73 3b 0a 20 20 63 6f 6e 73 74  t bytes;.  const
18f60 20 63 68 61 72 20 2a 7a 54 61 69 6c 20 3d 20 30   char *zTail = 0
18f70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
18f80 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63   *pStmt = 0;.  c
18f90 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20  har zBuf[50];.  
18fa0 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
18fb0 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d  bjc!=5 && objc!=
18fc0 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
18fd0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
18fe0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
18ff0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
19000 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
19010 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
19020 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 74  " DB sql bytes t
19030 61 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20 20  ailvar", 0);.   
19040 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19050 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
19060 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
19070 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
19080 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
19090 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
190a0 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f  R;.  zSql = Tcl_
190b0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
190c0 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  ]);.  if( Tcl_Ge
190d0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
190e0 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79  rp, objv[3], &by
190f0 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43  tes) ) return TC
19100 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
19110 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
19120 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79  _v2(db, zSql, by
19130 74 65 73 2c 20 26 70 53 74 6d 74 2c 20 6f 62 6a  tes, &pStmt, obj
19140 63 3e 3d 35 20 3f 20 26 7a 54 61 69 6c 20 3a 20  c>=5 ? &zTail : 
19150 30 29 3b 0a 20 20 61 73 73 65 72 74 28 72 63 3d  0);.  assert(rc=
19160 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53  =SQLITE_OK || pS
19170 74 6d 74 3d 3d 30 29 3b 0a 20 20 54 63 6c 5f 52  tmt==0);.  Tcl_R
19180 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
19190 70 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  p);.  if( sqlite
191a0 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
191b0 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
191c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
191d0 0a 20 20 69 66 28 20 7a 54 61 69 6c 20 26 26 20  .  if( zTail && 
191e0 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20 20 69  objc>=5 ){.    i
191f0 66 28 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20  f( bytes>=0 ){. 
19200 20 20 20 20 20 62 79 74 65 73 20 3d 20 62 79 74       bytes = byt
19210 65 73 20 2d 20 28 69 6e 74 29 28 7a 54 61 69 6c  es - (int)(zTail
19220 2d 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  -zSql);.    }.  
19230 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
19240 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d  (interp, objv[4]
19250 2c 20 30 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  , 0, Tcl_NewStri
19260 6e 67 4f 62 6a 28 7a 54 61 69 6c 2c 20 62 79 74  ngObj(zTail, byt
19270 65 73 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  es), 0);.  }.  i
19280 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19290 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
192a0 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pStmt==0 );.    
192b0 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 28  sprintf(zBuf, "(
192c0 25 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20  %d) ", rc);.    
192d0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
192e0 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73  (interp, zBuf, s
192f0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
19300 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ), 0);.    retur
19310 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
19320 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b  ..  if( pStmt ){
19330 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
19340 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53  TestMakePointerS
19350 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  tr(interp, zBuf,
19360 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e   pStmt) ) return
19370 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
19380 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
19390 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
193a0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
193b0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
193c0 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
193d0 70 72 65 70 61 72 65 5f 74 6b 74 33 31 33 34 20  prepare_tkt3134 
193e0 44 42 0a 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  DB.**.** Generat
193f0 65 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  e a prepared sta
19400 74 65 6d 65 6e 74 20 66 6f 72 20 61 20 7a 65 72  tement for a zer
19410 6f 2d 62 79 74 65 20 73 74 72 69 6e 67 20 61 73  o-byte string as
19420 20 61 20 74 65 73 74 0a 2a 2a 20 66 6f 72 20 74   a test.** for t
19430 69 63 6b 65 74 20 23 33 31 33 34 2e 20 20 54 68  icket #3134.  Th
19440 65 20 73 74 72 69 6e 67 20 73 68 6f 75 6c 64 20  e string should 
19450 62 65 20 70 72 65 63 65 65 64 65 64 20 62 79 20  be preceeded by 
19460 61 20 7a 65 72 6f 20 62 79 74 65 2e 0a 2a 2f 0a  a zero byte..*/.
19470 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
19480 70 72 65 70 61 72 65 5f 74 6b 74 33 31 33 34 28  prepare_tkt3134(
19490 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
194a0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
194b0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
194c0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
194d0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
194e0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
194f0 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
19500 20 63 68 61 72 20 7a 53 71 6c 5b 5d 20 3d 20 22   char zSql[] = "
19510 5c 30 30 30 53 45 4c 45 43 54 20 31 22 3b 0a 20  \000SELECT 1";. 
19520 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
19530 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  Stmt = 0;.  char
19540 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 69 6e 74   zBuf[50];.  int
19550 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
19560 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
19570 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
19580 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
19590 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
195a0 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
195b0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
195c0 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73  , " DB sql bytes
195d0 20 74 61 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20   tailvar", 0);. 
195e0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
195f0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
19600 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
19610 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
19620 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
19630 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
19640 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
19650 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
19660 62 2c 20 26 7a 53 71 6c 5b 31 5d 2c 20 30 2c 20  b, &zSql[1], 0, 
19670 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 61 73  &pStmt, 0);.  as
19680 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f  sert(rc==SQLITE_
19690 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d 30 29 3b  OK || pStmt==0);
196a0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
196b0 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
196c0 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
196d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
196e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
196f0 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
19700 20 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20   pStmt==0 );.   
19710 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22   sprintf(zBuf, "
19720 28 25 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20  (%d) ", rc);.   
19730 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
19740 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
19750 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
19760 62 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  b), 0);.    retu
19770 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
19780 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29  }..  if( pStmt )
19790 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
197a0 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72  3TestMakePointer
197b0 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  Str(interp, zBuf
197c0 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72  , pStmt) ) retur
197d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
197e0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
197f0 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
19800 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
19810 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
19820 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
19830 5f 70 72 65 70 61 72 65 31 36 20 44 42 20 73 71  _prepare16 DB sq
19840 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 0a  l bytes tailvar.
19850 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70  **.** Compile up
19860 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65   to <bytes> byte
19870 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  s of the supplie
19880 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71  d SQL string <sq
19890 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61  l> using.** data
198a0 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e  base handle <DB>
198b0 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20  . The parameter 
198c0 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65  <tailval> is the
198d0 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61   name of a globa
198e0 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68  l.** variable th
198f0 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  at is set to the
19900 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20   unused portion 
19910 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79  of <sql> (if any
19920 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e  ). A.** STMT han
19930 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  dle is returned.
19940 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
19950 65 73 74 5f 70 72 65 70 61 72 65 31 36 28 0a 20  est_prepare16(. 
19960 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
19970 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
19980 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
19990 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
199a0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
199b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
199c0 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c  OMIT_UTF16.  sql
199d0 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
199e0 74 20 76 6f 69 64 20 2a 7a 53 71 6c 3b 0a 20 20  t void *zSql;.  
199f0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 54 61 69  const void *zTai
19a00 6c 20 3d 20 30 3b 0a 20 20 54 63 6c 5f 4f 62 6a  l = 0;.  Tcl_Obj
19a10 20 2a 70 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73   *pTail = 0;.  s
19a20 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
19a30 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a  mt = 0;.  char z
19a40 42 75 66 5b 35 30 5d 3b 20 0a 20 20 69 6e 74 20  Buf[50]; .  int 
19a50 72 63 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b  rc;.  int bytes;
19a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a70 2f 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20 73  /* The integer s
19a80 70 65 63 69 66 69 65 64 20 61 73 20 61 72 67 20  pecified as arg 
19a90 33 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 6c 65  3 */.  int objle
19aa0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
19ab0 20 2f 2a 20 54 68 65 20 62 79 74 65 2d 61 72 72   /* The byte-arr
19ac0 61 79 20 6c 65 6e 67 74 68 20 6f 66 20 61 72 67  ay length of arg
19ad0 20 32 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a   2 */..  if( obj
19ae0 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34 20  c!=5 && objc!=4 
19af0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
19b00 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
19b10 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
19b20 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
19b30 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
19b40 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
19b50 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74 61  DB sql bytes ?ta
19b60 69 6c 76 61 72 3f 22 2c 20 30 29 3b 0a 20 20 20  ilvar?", 0);.   
19b70 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19b80 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
19b90 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
19ba0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
19bb0 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
19bc0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19bd0 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f  R;.  zSql = Tcl_
19be0 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
19bf0 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6f 62  Obj(objv[2], &ob
19c00 6a 6c 65 6e 29 3b 0a 20 20 69 66 28 20 54 63 6c  jlen);.  if( Tcl
19c10 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
19c20 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
19c30 26 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e  &bytes) ) return
19c40 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
19c50 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
19c60 61 72 65 31 36 28 64 62 2c 20 7a 53 71 6c 2c 20  are16(db, zSql, 
19c70 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c 20 6f  bytes, &pStmt, o
19c80 62 6a 63 3e 3d 35 20 3f 20 26 7a 54 61 69 6c 20  bjc>=5 ? &zTail 
19c90 3a 20 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  : 0);.  if( sqli
19ca0 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
19cb0 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
19cc0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19cd0 52 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  R;.  if( rc ){. 
19ce0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
19cf0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
19d00 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20 20 69  objc>=5 ){.    i
19d10 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20 20 20 20  f( zTail ){.    
19d20 20 20 6f 62 6a 6c 65 6e 20 3d 20 6f 62 6a 6c 65    objlen = objle
19d30 6e 20 2d 20 28 69 6e 74 29 28 28 75 38 20 2a 29  n - (int)((u8 *)
19d40 7a 54 61 69 6c 2d 28 75 38 20 2a 29 7a 53 71 6c  zTail-(u8 *)zSql
19d50 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
19d60 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 30 3b 0a      objlen = 0;.
19d70 20 20 20 20 7d 0a 20 20 20 20 70 54 61 69 6c 20      }.    pTail 
19d80 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  = Tcl_NewByteArr
19d90 61 79 4f 62 6a 28 28 75 38 20 2a 29 7a 54 61 69  ayObj((u8 *)zTai
19da0 6c 2c 20 6f 62 6a 6c 65 6e 29 3b 0a 20 20 20 20  l, objlen);.    
19db0 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
19dc0 28 70 54 61 69 6c 29 3b 0a 20 20 20 20 54 63 6c  (pTail);.    Tcl
19dd0 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65  _ObjSetVar2(inte
19de0 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20  rp, objv[4], 0, 
19df0 70 54 61 69 6c 2c 20 30 29 3b 0a 20 20 20 20 54  pTail, 0);.    T
19e00 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
19e10 70 54 61 69 6c 29 3b 0a 20 20 7d 0a 0a 20 20 69  pTail);.  }..  i
19e20 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  f( pStmt ){.    
19e30 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d  if( sqlite3TestM
19e40 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e  akePointerStr(in
19e50 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d  terp, zBuf, pStm
19e60 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
19e70 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c  ERROR;.  }.  Tcl
19e80 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
19e90 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
19ea0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
19eb0 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20  _OMIT_UTF16 */. 
19ec0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
19ed0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
19ee0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31  sqlite3_prepare1
19ef0 36 5f 76 32 20 44 42 20 73 71 6c 20 62 79 74 65  6_v2 DB sql byte
19f00 73 20 3f 74 61 69 6c 76 61 72 3f 0a 2a 2a 0a 2a  s ?tailvar?.**.*
19f10 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20  * Compile up to 
19f20 3c 62 79 74 65 73 3e 20 62 79 74 65 73 20 6f 66  <bytes> bytes of
19f30 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 53 51   the supplied SQ
19f40 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75  L string <sql> u
19f50 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65  sing.** database
19f60 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68   handle <DB>. Th
19f70 65 20 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69  e parameter <tai
19f80 6c 76 61 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d  lval> is the nam
19f90 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a  e of a global.**
19fa0 20 76 61 72 69 61 62 6c 65 20 74 68 61 74 20 69   variable that i
19fb0 73 20 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75  s set to the unu
19fc0 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c  sed portion of <
19fd0 73 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20 41  sql> (if any). A
19fe0 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65 20  .** STMT handle 
19ff0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1a000 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1a010 70 72 65 70 61 72 65 31 36 5f 76 32 28 0a 20 20  prepare16_v2(.  
1a020 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1a030 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1a040 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1a050 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1a060 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1a070 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1a080 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69  MIT_UTF16.  sqli
1a090 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
1a0a0 20 76 6f 69 64 20 2a 7a 53 71 6c 3b 0a 20 20 63   void *zSql;.  c
1a0b0 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 54 61 69 6c  onst void *zTail
1a0c0 20 3d 20 30 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20   = 0;.  Tcl_Obj 
1a0d0 2a 70 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71  *pTail = 0;.  sq
1a0e0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1a0f0 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42  t = 0;.  char zB
1a100 75 66 5b 35 30 5d 3b 20 0a 20 20 69 6e 74 20 72  uf[50]; .  int r
1a110 63 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 20  c;.  int bytes; 
1a120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a130 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20 73 70  * The integer sp
1a140 65 63 69 66 69 65 64 20 61 73 20 61 72 67 20 33  ecified as arg 3
1a150 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 6c 65 6e   */.  int objlen
1a160 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a170 2f 2a 20 54 68 65 20 62 79 74 65 2d 61 72 72 61  /* The byte-arra
1a180 79 20 6c 65 6e 67 74 68 20 6f 66 20 61 72 67 20  y length of arg 
1a190 32 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63  2 */..  if( objc
1a1a0 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34 20 29  !=5 && objc!=4 )
1a1b0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1a1c0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1a1d0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1a1e0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
1a1f0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
1a200 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44  ng(objv[0]), " D
1a210 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74 61 69  B sql bytes ?tai
1a220 6c 76 61 72 3f 22 2c 20 30 29 3b 0a 20 20 20 20  lvar?", 0);.    
1a230 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1a240 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
1a250 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
1a260 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1a270 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
1a280 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1a290 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47  ;.  zSql = Tcl_G
1a2a0 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
1a2b0 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6f 62 6a  bj(objv[2], &obj
1a2c0 6c 65 6e 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f  len);.  if( Tcl_
1a2d0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
1a2e0 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
1a2f0 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20  bytes) ) return 
1a300 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
1a310 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
1a320 72 65 31 36 5f 76 32 28 64 62 2c 20 7a 53 71 6c  re16_v2(db, zSql
1a330 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c  , bytes, &pStmt,
1a340 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54 61 69   objc>=5 ? &zTai
1a350 6c 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 73 71  l : 0);.  if( sq
1a360 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
1a370 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
1a380 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1a390 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ROR;.  if( rc ){
1a3a0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1a3b0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
1a3c0 28 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20  ( objc>=5 ){.   
1a3d0 20 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20 20   if( zTail ){.  
1a3e0 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 6f 62 6a      objlen = obj
1a3f0 6c 65 6e 20 2d 20 28 69 6e 74 29 28 28 75 38 20  len - (int)((u8 
1a400 2a 29 7a 54 61 69 6c 2d 28 75 38 20 2a 29 7a 53  *)zTail-(u8 *)zS
1a410 71 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ql);.    }else{.
1a420 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 30        objlen = 0
1a430 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 69  ;.    }.    pTai
1a440 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  l = Tcl_NewByteA
1a450 72 72 61 79 4f 62 6a 28 28 75 38 20 2a 29 7a 54  rrayObj((u8 *)zT
1a460 61 69 6c 2c 20 6f 62 6a 6c 65 6e 29 3b 0a 20 20  ail, objlen);.  
1a470 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
1a480 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 20 20 54  nt(pTail);.    T
1a490 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e  cl_ObjSetVar2(in
1a4a0 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30  terp, objv[4], 0
1a4b0 2c 20 70 54 61 69 6c 2c 20 30 29 3b 0a 20 20 20  , pTail, 0);.   
1a4c0 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
1a4d0 74 28 70 54 61 69 6c 29 3b 0a 20 20 7d 0a 0a 20  t(pTail);.  }.. 
1a4e0 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20   if( pStmt ){.  
1a4f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
1a500 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28  tMakePointerStr(
1a510 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53  interp, zBuf, pS
1a520 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
1a530 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54  L_ERROR;.  }.  T
1a540 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1a550 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
1a560 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
1a570 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
1a580 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1a590 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1a5a0 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 20 66  : sqlite3_open f
1a5b0 69 6c 65 6e 61 6d 65 20 3f 6f 70 74 69 6f 6e 73  ilename ?options
1a5c0 2d 6c 69 73 74 3f 0a 2a 2f 0a 73 74 61 74 69 63  -list?.*/.static
1a5d0 20 69 6e 74 20 74 65 73 74 5f 6f 70 65 6e 28 0a   int test_open(.
1a5e0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1a5f0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1a600 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1a610 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1a620 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1a630 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
1a640 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 73 71 6c  zFilename;.  sql
1a650 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72  ite3 *db;.  char
1a660 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69   zBuf[100];..  i
1a670 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62  f( objc!=3 && ob
1a680 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 31  jc!=2 && objc!=1
1a690 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1a6a0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1a6b0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1a6c0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
1a6d0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1a6e0 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
1a6f0 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e   filename option
1a700 73 2d 6c 69 73 74 22 2c 20 30 29 3b 0a 20 20 20  s-list", 0);.   
1a710 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1a720 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69 6c 65 6e  R;.  }..  zFilen
1a730 61 6d 65 20 3d 20 6f 62 6a 63 3e 31 20 3f 20 54  ame = objc>1 ? T
1a740 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1a750 76 5b 31 5d 29 20 3a 20 30 3b 0a 20 20 73 71 6c  v[1]) : 0;.  sql
1a760 69 74 65 33 5f 6f 70 65 6e 28 7a 46 69 6c 65 6e  ite3_open(zFilen
1a770 61 6d 65 2c 20 26 64 62 29 3b 0a 20 20 0a 20 20  ame, &db);.  .  
1a780 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d  if( sqlite3TestM
1a790 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e  akePointerStr(in
1a7a0 74 65 72 70 2c 20 7a 42 75 66 2c 20 64 62 29 20  terp, zBuf, db) 
1a7b0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1a7c0 4f 52 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  OR;.  Tcl_Append
1a7d0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
1a7e0 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  Buf, 0);.  retur
1a7f0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1a800 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1a810 33 5f 6f 70 65 6e 5f 76 32 20 46 49 4c 45 4e 41  3_open_v2 FILENA
1a820 4d 45 20 46 4c 41 47 53 20 56 46 53 0a 2a 2f 0a  ME FLAGS VFS.*/.
1a830 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1a840 6f 70 65 6e 5f 76 32 28 0a 20 20 76 6f 69 64 20  open_v2(.  void 
1a850 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1a860 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1a870 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1a880 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1a890 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e   objv[].){.  con
1a8a0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
1a8b0 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  me;.  const char
1a8c0 20 2a 7a 56 66 73 3b 0a 20 20 69 6e 74 20 66 6c   *zVfs;.  int fl
1a8d0 61 67 73 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ags = 0;.  sqlit
1a8e0 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
1a8f0 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30  ;.  char zBuf[10
1a900 30 5d 3b 0a 0a 20 20 69 6e 74 20 6e 46 6c 61 67  0];..  int nFlag
1a910 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70  ;.  Tcl_Obj **ap
1a920 46 6c 61 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  Flag;.  int i;..
1a930 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
1a940 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
1a950 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
1a960 20 6f 62 6a 76 2c 20 22 46 49 4c 45 4e 41 4d 45   objv, "FILENAME
1a970 20 46 4c 41 47 53 20 56 46 53 22 29 3b 0a 20 20   FLAGS VFS");.  
1a980 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1a990 4f 52 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e  OR;.  }.  zFilen
1a9a0 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
1a9b0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20  ing(objv[1]);.  
1a9c0 7a 56 66 73 20 3d 20 54 63 6c 5f 47 65 74 53 74  zVfs = Tcl_GetSt
1a9d0 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20  ring(objv[3]);. 
1a9e0 20 69 66 28 20 7a 56 66 73 5b 30 5d 3d 3d 30 78   if( zVfs[0]==0x
1a9f0 30 30 20 29 20 7a 56 66 73 20 3d 20 30 3b 0a 0a  00 ) zVfs = 0;..
1aa00 20 20 72 63 20 3d 20 54 63 6c 5f 4c 69 73 74 4f    rc = Tcl_ListO
1aa10 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e  bjGetElements(in
1aa20 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
1aa30 6e 46 6c 61 67 2c 20 26 61 70 46 6c 61 67 29 3b  nFlag, &apFlag);
1aa40 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f  .  if( rc!=TCL_O
1aa50 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1aa60 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 6c 61   for(i=0; i<nFla
1aa70 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  g; i++){.    int
1aa80 20 69 46 6c 61 67 3b 0a 20 20 20 20 73 74 72 75   iFlag;.    stru
1aa90 63 74 20 4f 70 65 6e 46 6c 61 67 20 7b 0a 20 20  ct OpenFlag {.  
1aaa0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1aab0 7a 46 6c 61 67 3b 0a 20 20 20 20 20 20 69 6e 74  zFlag;.      int
1aac0 20 66 6c 61 67 3b 0a 20 20 20 20 7d 20 61 46 6c   flag;.    } aFl
1aad0 61 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b  ag[] = {.      {
1aae0 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   "SQLITE_OPEN_RE
1aaf0 41 44 4f 4e 4c 59 22 2c 20 53 51 4c 49 54 45 5f  ADONLY", SQLITE_
1ab00 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7d 2c  OPEN_READONLY },
1ab10 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1ab20 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 22  _OPEN_READWRITE"
1ab30 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  , SQLITE_OPEN_RE
1ab40 41 44 57 52 49 54 45 20 7d 2c 0a 20 20 20 20 20  ADWRITE },.     
1ab50 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   { "SQLITE_OPEN_
1ab60 43 52 45 41 54 45 22 2c 20 53 51 4c 49 54 45 5f  CREATE", SQLITE_
1ab70 4f 50 45 4e 5f 43 52 45 41 54 45 20 7d 2c 0a 20  OPEN_CREATE },. 
1ab80 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f       { "SQLITE_O
1ab90 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
1aba0 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E", SQLITE_OPEN_
1abb0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7d 2c  DELETEONCLOSE },
1abc0 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1abd0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 22  _OPEN_EXCLUSIVE"
1abe0 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58  , SQLITE_OPEN_EX
1abf0 43 4c 55 53 49 56 45 20 7d 2c 0a 20 20 20 20 20  CLUSIVE },.     
1ac00 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   { "SQLITE_OPEN_
1ac10 41 55 54 4f 50 52 4f 58 59 22 2c 20 53 51 4c 49  AUTOPROXY", SQLI
1ac20 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58  TE_OPEN_AUTOPROX
1ac30 59 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51  Y },.      { "SQ
1ac40 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
1ac50 42 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  B", SQLITE_OPEN_
1ac60 4d 41 49 4e 5f 44 42 20 7d 2c 0a 20 20 20 20 20  MAIN_DB },.     
1ac70 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   { "SQLITE_OPEN_
1ac80 54 45 4d 50 5f 44 42 22 2c 20 53 51 4c 49 54 45  TEMP_DB", SQLITE
1ac90 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 7d 2c  _OPEN_TEMP_DB },
1aca0 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1acb0 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f  _OPEN_TRANSIENT_
1acc0 44 42 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  DB", SQLITE_OPEN
1acd0 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7d 2c  _TRANSIENT_DB },
1ace0 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1acf0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
1ad00 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  AL", SQLITE_OPEN
1ad10 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7d 2c  _MAIN_JOURNAL },
1ad20 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1ad30 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
1ad40 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  AL", SQLITE_OPEN
1ad50 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7d 2c  _TEMP_JOURNAL },
1ad60 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1ad70 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
1ad80 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  ", SQLITE_OPEN_S
1ad90 55 42 4a 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20  UBJOURNAL },.   
1ada0 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45     { "SQLITE_OPE
1adb0 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
1adc0 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  ", SQLITE_OPEN_M
1add0 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7d 2c  ASTER_JOURNAL },
1ade0 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1adf0 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 22 2c 20  _OPEN_NOMUTEX", 
1ae00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55  SQLITE_OPEN_NOMU
1ae10 54 45 58 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  TEX },.      { "
1ae20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
1ae30 4d 55 54 45 58 22 2c 20 53 51 4c 49 54 45 5f 4f  MUTEX", SQLITE_O
1ae40 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 7d 2c  PEN_FULLMUTEX },
1ae50 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1ae60 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
1ae70 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E", SQLITE_OPEN_
1ae80 53 48 41 52 45 44 43 41 43 48 45 20 7d 2c 0a 20  SHAREDCACHE },. 
1ae90 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f       { "SQLITE_O
1aea0 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45  PEN_PRIVATECACHE
1aeb0 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50  ", SQLITE_OPEN_P
1aec0 52 49 56 41 54 45 43 41 43 48 45 20 7d 2c 0a 20  RIVATECACHE },. 
1aed0 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f       { "SQLITE_O
1aee0 50 45 4e 5f 57 41 4c 22 2c 20 53 51 4c 49 54 45  PEN_WAL", SQLITE
1aef0 5f 4f 50 45 4e 5f 57 41 4c 20 7d 2c 0a 20 20 20  _OPEN_WAL },.   
1af00 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45     { "SQLITE_OPE
1af10 4e 5f 55 52 49 22 2c 20 53 51 4c 49 54 45 5f 4f  N_URI", SQLITE_O
1af20 50 45 4e 5f 55 52 49 20 7d 2c 0a 20 20 20 20 20  PEN_URI },.     
1af30 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 7d 3b   { 0, 0 }.    };
1af40 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 47 65  .    rc = Tcl_Ge
1af50 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 53 74 72  tIndexFromObjStr
1af60 75 63 74 28 69 6e 74 65 72 70 2c 20 61 70 46 6c  uct(interp, apFl
1af70 61 67 5b 69 5d 2c 20 61 46 6c 61 67 2c 20 73 69  ag[i], aFlag, si
1af80 7a 65 6f 66 28 61 46 6c 61 67 5b 30 5d 29 2c 20  zeof(aFlag[0]), 
1af90 0a 20 20 20 20 20 20 20 20 22 66 6c 61 67 22 2c  .        "flag",
1afa0 20 30 2c 20 26 69 46 6c 61 67 0a 20 20 20 20 29   0, &iFlag.    )
1afb0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 54 43  ;.    if( rc!=TC
1afc0 4c 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  L_OK ) return rc
1afd0 3b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 61  ;.    flags |= a
1afe0 46 6c 61 67 5b 69 46 6c 61 67 5d 2e 66 6c 61 67  Flag[iFlag].flag
1aff0 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71  ;.  }..  rc = sq
1b000 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 46  lite3_open_v2(zF
1b010 69 6c 65 6e 61 6d 65 2c 20 26 64 62 2c 20 66 6c  ilename, &db, fl
1b020 61 67 73 2c 20 7a 56 66 73 29 3b 0a 20 20 69 66  ags, zVfs);.  if
1b030 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b  ( sqlite3TestMak
1b040 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65  ePointerStr(inte
1b050 72 70 2c 20 7a 42 75 66 2c 20 64 62 29 20 29 20  rp, zBuf, db) ) 
1b060 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1b070 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
1b080 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
1b090 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  f, 0);.  return 
1b0a0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1b0b0 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1b0c0 6f 70 65 6e 31 36 20 66 69 6c 65 6e 61 6d 65 20  open16 filename 
1b0d0 6f 70 74 69 6f 6e 73 0a 2a 2f 0a 73 74 61 74 69  options.*/.stati
1b0e0 63 20 69 6e 74 20 74 65 73 74 5f 6f 70 65 6e 31  c int test_open1
1b0f0 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  6(.  void * clie
1b100 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1b110 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1b120 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1b130 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1b140 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ].){.#ifndef SQL
1b150 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
1b160 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69   const void *zFi
1b170 6c 65 6e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65  lename;.  sqlite
1b180 33 20 2a 64 62 3b 0a 20 20 63 68 61 72 20 7a 42  3 *db;.  char zB
1b190 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20  uf[100];..  if( 
1b1a0 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
1b1b0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1b1c0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1b1d0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1b1e0 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
1b1f0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1b200 5b 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61 6d 65  [0]), " filename
1b210 20 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 22 2c 20   options-list", 
1b220 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1b230 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1b240 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 54 63 6c   zFilename = Tcl
1b250 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
1b260 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29  mObj(objv[1], 0)
1b270 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  ;.  sqlite3_open
1b280 31 36 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 64  16(zFilename, &d
1b290 62 29 3b 0a 20 20 0a 20 20 69 66 28 20 73 71 6c  b);.  .  if( sql
1b2a0 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e  ite3TestMakePoin
1b2b0 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a  terStr(interp, z
1b2c0 42 75 66 2c 20 64 62 29 20 29 20 72 65 74 75 72  Buf, db) ) retur
1b2d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
1b2e0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1b2f0 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
1b300 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
1b310 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
1b320 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1b330 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1b340 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65  : sqlite3_comple
1b350 74 65 31 36 20 3c 55 54 46 2d 31 36 20 73 74 72  te16 <UTF-16 str
1b360 69 6e 67 3e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ing>.**.** Retur
1b370 6e 20 31 20 69 66 20 74 68 65 20 73 75 70 70 6c  n 1 if the suppl
1b380 69 65 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ied argument is 
1b390 61 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73  a complete SQL s
1b3a0 74 61 74 65 6d 65 6e 74 2c 20 6f 72 20 7a 65 72  tatement, or zer
1b3b0 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a  o.** otherwise..
1b3c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1b3d0 73 74 5f 63 6f 6d 70 6c 65 74 65 31 36 28 0a 20  st_complete16(. 
1b3e0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1b3f0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1b400 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1b410 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1b420 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1b430 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
1b440 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45  LITE_OMIT_COMPLE
1b450 54 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  TE) && !defined(
1b460 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
1b470 36 29 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 3b  6).  char *zBuf;
1b480 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
1b490 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
1b4a0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
1b4b0 31 2c 20 6f 62 6a 76 2c 20 22 3c 75 74 66 2d 31  1, objv, "<utf-1
1b4c0 36 20 73 71 6c 3e 22 29 3b 0a 20 20 20 20 72 65  6 sql>");.    re
1b4d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1b4e0 20 20 7d 0a 0a 20 20 7a 42 75 66 20 3d 20 28 63    }..  zBuf = (c
1b4f0 68 61 72 2a 29 54 63 6c 5f 47 65 74 42 79 74 65  har*)Tcl_GetByte
1b500 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a  ArrayFromObj(obj
1b510 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  v[1], 0);.  Tcl_
1b520 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
1b530 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
1b540 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c  bj(sqlite3_compl
1b550 65 74 65 31 36 28 7a 42 75 66 29 29 29 3b 0a 23  ete16(zBuf)));.#
1b560 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1b570 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 20 26 26  OMIT_COMPLETE &&
1b580 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
1b590 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54  16 */.  return T
1b5a0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1b5b0 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 73  Usage: sqlite3_s
1b5c0 74 65 70 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 41  tep STMT.**.** A
1b5d0 64 76 61 6e 63 65 20 74 68 65 20 73 74 61 74 65  dvance the state
1b5e0 6d 65 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74  ment to the next
1b5f0 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   row..*/.static 
1b600 69 6e 74 20 74 65 73 74 5f 73 74 65 70 28 0a 20  int test_step(. 
1b610 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1b620 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1b630 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1b640 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1b650 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1b660 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1b670 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63  *pStmt;.  int rc
1b680 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
1b690 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1b6a0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1b6b0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1b6c0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
1b6d0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1b6e0 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
1b6f0 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20   STMT", 0);.    
1b700 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1b710 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
1b720 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
1b730 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1b740 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
1b750 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
1b760 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
1b770 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
1b780 74 29 3b 0a 0a 20 20 2f 2a 20 69 66 28 20 72 63  t);..  /* if( rc
1b790 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 26 26  !=SQLITE_DONE &&
1b7a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20   rc!=SQLITE_ROW 
1b7b0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1b7c0 4f 52 3b 20 2a 2f 0a 20 20 54 63 6c 5f 53 65 74  OR; */.  Tcl_Set
1b7d0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
1b7e0 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
1b7f0 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65  me(rc), 0);.  re
1b800 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1b810 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1b820 73 71 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  sql(.  void * cl
1b830 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1b840 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1b850 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1b860 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1b870 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
1b880 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20  _stmt *pStmt;.. 
1b890 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
1b8a0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
1b8b0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
1b8c0 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20  objv, "STMT");. 
1b8d0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1b8e0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
1b8f0 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
1b900 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1b910 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1b920 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
1b930 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c  TCL_ERROR;.  Tcl
1b940 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
1b950 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
1b960 65 33 5f 73 71 6c 28 70 53 74 6d 74 29 2c 20 54  e3_sql(pStmt), T
1b970 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
1b980 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1b990 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1b9a0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
1b9b0 75 6e 74 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20  unt STMT .**.** 
1b9c0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
1b9d0 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74  r of columns ret
1b9e0 75 72 6e 65 64 20 62 79 20 74 68 65 20 73 71 6c  urned by the sql
1b9f0 20 73 74 61 74 65 6d 65 6e 74 20 53 54 4d 54 2e   statement STMT.
1ba00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1ba10 65 73 74 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  est_column_count
1ba20 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1ba30 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1ba40 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1ba50 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1ba60 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1ba70 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
1ba80 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66  mt *pStmt;..  if
1ba90 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
1baa0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1bab0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1bac0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1bad0 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1bae0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1baf0 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63  jv[0]), " STMT c
1bb00 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20  olumn", 0);.    
1bb10 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1bb20 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
1bb30 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
1bb40 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1bb50 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
1bb60 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
1bb70 5f 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53  _ERROR;..  Tcl_S
1bb80 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1bb90 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
1bba0 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  j(sqlite3_column
1bbb0 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 29 29 3b  _count(pStmt)));
1bbc0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1bbd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1bbe0 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
1bbf0 5f 74 79 70 65 20 53 54 4d 54 20 63 6f 6c 75 6d  _type STMT colum
1bc00 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  n.**.** Return t
1bc10 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 20 64  he type of the d
1bc20 61 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20 27 63  ata in column 'c
1bc30 6f 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20 63 75  olumn' of the cu
1bc40 72 72 65 6e 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74  rrent row..*/.st
1bc50 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f  atic int test_co
1bc60 6c 75 6d 6e 5f 74 79 70 65 28 0a 20 20 76 6f 69  lumn_type(.  voi
1bc70 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1bc80 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1bc90 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1bca0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1bcb0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
1bcc0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1bcd0 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20  mt;.  int col;. 
1bce0 20 69 6e 74 20 74 70 3b 0a 0a 20 20 69 66 28 20   int tp;..  if( 
1bcf0 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
1bd00 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1bd10 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1bd20 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1bd30 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
1bd40 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1bd50 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c  [0]), " STMT col
1bd60 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  umn", 0);.    re
1bd70 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1bd80 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
1bd90 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
1bda0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1bdb0 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
1bdc0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1bdd0 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
1bde0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
1bdf0 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
1be00 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  col) ) return TC
1be10 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 74 70 20 3d  L_ERROR;..  tp =
1be20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1be30 74 79 70 65 28 70 53 74 6d 74 2c 20 63 6f 6c 29  type(pStmt, col)
1be40 3b 0a 20 20 73 77 69 74 63 68 28 20 74 70 20 29  ;.  switch( tp )
1be50 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
1be60 45 5f 49 4e 54 45 47 45 52 3a 20 0a 20 20 20 20  E_INTEGER: .    
1be70 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
1be80 69 6e 74 65 72 70 2c 20 22 49 4e 54 45 47 45 52  interp, "INTEGER
1be90 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20  ", TCL_STATIC); 
1bea0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1beb0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55    case SQLITE_NU
1bec0 4c 4c 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  LL:.      Tcl_Se
1bed0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
1bee0 22 4e 55 4c 4c 22 2c 20 54 43 4c 5f 53 54 41 54  "NULL", TCL_STAT
1bef0 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  IC); .      brea
1bf00 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
1bf10 54 45 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 20 20  TE_FLOAT:.      
1bf20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
1bf30 74 65 72 70 2c 20 22 46 4c 4f 41 54 22 2c 20 54  terp, "FLOAT", T
1bf40 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20  CL_STATIC); .   
1bf50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1bf60 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 0a  se SQLITE_TEXT:.
1bf70 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73        Tcl_SetRes
1bf80 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 45 58  ult(interp, "TEX
1bf90 54 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  T", TCL_STATIC);
1bfa0 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
1bfb0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42     case SQLITE_B
1bfc0 4c 4f 42 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53  LOB:.      Tcl_S
1bfd0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
1bfe0 20 22 42 4c 4f 42 22 2c 20 54 43 4c 5f 53 54 41   "BLOB", TCL_STA
1bff0 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65  TIC); .      bre
1c000 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
1c010 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29  .      assert(0)
1c020 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1c030 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1c040 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1c050 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20 53 54 4d  column_int64 STM
1c060 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52  T column.**.** R
1c070 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 20 69  eturn the data i
1c080 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e  n column 'column
1c090 27 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  ' of the current
1c0a0 20 72 6f 77 20 63 61 73 74 20 61 73 20 61 6e 0a   row cast as an.
1c0b0 2a 2a 20 77 69 64 65 20 28 36 34 2d 62 69 74 29  ** wide (64-bit)
1c0c0 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61   integer..*/.sta
1c0d0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c  tic int test_col
1c0e0 75 6d 6e 5f 69 6e 74 36 34 28 0a 20 20 76 6f 69  umn_int64(.  voi
1c0f0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1c100 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1c110 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1c120 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1c130 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
1c140 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1c150 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20  mt;.  int col;. 
1c160 20 69 36 34 20 69 56 61 6c 3b 0a 0a 20 20 69 66   i64 iVal;..  if
1c170 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
1c180 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1c190 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1c1a0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1c1b0 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1c1c0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1c1d0 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63  jv[0]), " STMT c
1c1e0 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20  olumn", 0);.    
1c1f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1c200 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
1c210 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
1c220 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1c230 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
1c240 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
1c250 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
1c260 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
1c270 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
1c280 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20   &col) ) return 
1c290 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 56  TCL_ERROR;..  iV
1c2a0 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  al = sqlite3_col
1c2b0 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  umn_int64(pStmt,
1c2c0 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74   col);.  Tcl_Set
1c2d0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
1c2e0 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
1c2f0 4f 62 6a 28 69 56 61 6c 29 29 3b 0a 20 20 72 65  Obj(iVal));.  re
1c300 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1c310 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1c320 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
1c330 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a   STMT column.*/.
1c340 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1c350 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 0a 20 20 76  column_blob(.  v
1c360 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1c370 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1c380 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1c390 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1c3a0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1c3b0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1c3c0 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b  Stmt;.  int col;
1c3d0 0a 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 63  ..  int len;.  c
1c3e0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62  onst void *pBlob
1c3f0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
1c400 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1c410 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1c420 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1c430 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
1c440 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1c450 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
1c460 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30   STMT column", 0
1c470 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1c480 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1c490 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
1c4a0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1c4b0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1c4c0 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
1c4d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1c4e0 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
1c4f0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
1c500 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20  bjv[2], &col) ) 
1c510 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1c520 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74  ;..  len = sqlit
1c530 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
1c540 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 70  pStmt, col);.  p
1c550 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63  Blob = sqlite3_c
1c560 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74  olumn_blob(pStmt
1c570 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65  , col);.  Tcl_Se
1c580 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1c590 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72  p, Tcl_NewByteAr
1c5a0 72 61 79 4f 62 6a 28 70 42 6c 6f 62 2c 20 6c 65  rayObj(pBlob, le
1c5b0 6e 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  n));.  return TC
1c5c0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1c5d0 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
1c5e0 6c 75 6d 6e 5f 64 6f 75 62 6c 65 20 53 54 4d 54  lumn_double STMT
1c5f0 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65   column.**.** Re
1c600 74 75 72 6e 20 74 68 65 20 64 61 74 61 20 69 6e  turn the data in
1c610 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27   column 'column'
1c620 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
1c630 72 6f 77 20 63 61 73 74 20 61 73 20 61 20 64 6f  row cast as a do
1c640 75 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uble..*/.static 
1c650 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f  int test_column_
1c660 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a  double(.  void *
1c670 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1c680 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1c690 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1c6a0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1c6b0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
1c6c0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
1c6d0 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 64 6f  .  int col;.  do
1c6e0 75 62 6c 65 20 72 56 61 6c 3b 0a 0a 20 20 69 66  uble rVal;..  if
1c6f0 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
1c700 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1c710 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1c720 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1c730 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1c740 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1c750 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63  jv[0]), " STMT c
1c760 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20  olumn", 0);.    
1c770 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1c780 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
1c790 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
1c7a0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1c7b0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
1c7c0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
1c7d0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
1c7e0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
1c7f0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
1c800 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20   &col) ) return 
1c810 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 56  TCL_ERROR;..  rV
1c820 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  al = sqlite3_col
1c830 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74  umn_double(pStmt
1c840 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65  , col);.  Tcl_Se
1c850 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1c860 70 2c 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65  p, Tcl_NewDouble
1c870 4f 62 6a 28 72 56 61 6c 29 29 3b 0a 20 20 72 65  Obj(rVal));.  re
1c880 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1c890 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1c8a0 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 20  ite3_data_count 
1c8b0 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75  STMT .**.** Retu
1c8c0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
1c8d0 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65   columns returne
1c8e0 64 20 62 79 20 74 68 65 20 73 71 6c 20 73 74 61  d by the sql sta
1c8f0 74 65 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a  tement STMT..*/.
1c900 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1c910 64 61 74 61 5f 63 6f 75 6e 74 28 0a 20 20 76 6f  data_count(.  vo
1c920 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1c930 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1c940 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1c950 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1c960 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1c970 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1c980 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  tmt;..  if( objc
1c990 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
1c9a0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1c9b0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1c9c0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1c9d0 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1c9e0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1c9f0 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22  , " STMT column"
1ca00 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1ca10 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1ca20 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
1ca30 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1ca40 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1ca50 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
1ca60 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1ca70 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  ;..  Tcl_SetObjR
1ca80 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
1ca90 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69  l_NewIntObj(sqli
1caa0 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 28 70  te3_data_count(p
1cab0 53 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72  Stmt)));.  retur
1cac0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1cad0 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1cae0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 53 54  3_column_text ST
1caf0 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
1cb00 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
1cb10 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 20 53  olumn_decltype S
1cb20 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a  TMT column.**.**
1cb30 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1cb40 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 53 54 4d 54  column_name STMT
1cb50 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69   column.*/.stati
1cb60 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f  c int test_stmt_
1cb70 75 74 66 38 28 0a 20 20 76 6f 69 64 20 2a 20 63  utf8(.  void * c
1cb80 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20 20  lientData,      
1cb90 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1cba0 53 51 4c 69 74 65 20 41 50 49 20 66 75 6e 63 74  SQLite API funct
1cbb0 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ion to be invoke
1cbc0 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
1cbd0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1cbe0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1cbf0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1cc00 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1cc10 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f  *pStmt;.  int co
1cc20 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  l;.  const char 
1cc30 2a 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65  *(*xFunc)(sqlite
1cc40 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 3b 0a 20  3_stmt*, int);. 
1cc50 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65   const char *zRe
1cc60 74 3b 0a 0a 20 20 78 46 75 6e 63 20 3d 20 28 63  t;..  xFunc = (c
1cc70 6f 6e 73 74 20 63 68 61 72 20 2a 28 2a 29 28 73  onst char *(*)(s
1cc80 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e  qlite3_stmt*, in
1cc90 74 29 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  t))clientData;. 
1cca0 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
1ccb0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1ccc0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1ccd0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1cce0 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
1ccf0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
1cd00 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
1cd10 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20  T column", 0);. 
1cd20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1cd30 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
1cd40 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
1cd50 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1cd60 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1cd70 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
1cd80 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
1cd90 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1cda0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
1cdb0 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75  2], &col) ) retu
1cdc0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1cdd0 7a 52 65 74 20 3d 20 78 46 75 6e 63 28 70 53 74  zRet = xFunc(pSt
1cde0 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 69 66 28 20  mt, col);.  if( 
1cdf0 7a 52 65 74 20 29 7b 0a 20 20 20 20 54 63 6c 5f  zRet ){.    Tcl_
1ce00 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
1ce10 2c 20 28 63 68 61 72 20 2a 29 7a 52 65 74 2c 20  , (char *)zRet, 
1ce20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
1ce30 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74   TCL_OK;.}..stat
1ce40 69 63 20 69 6e 74 20 74 65 73 74 5f 67 6c 6f 62  ic int test_glob
1ce50 61 6c 5f 72 65 63 6f 76 65 72 28 0a 20 20 76 6f  al_recover(.  vo
1ce60 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1ce70 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1ce80 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1ce90 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1cea0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69  NST objv[].){.#i
1ceb0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1cec0 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20 20 69  T_DEPRECATED.  i
1ced0 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 6f 62 6a  nt rc;.  if( obj
1cee0 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=1 ){.    Tcl_
1cef0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
1cf00 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22  erp, 1, objv, ""
1cf10 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1cf20 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
1cf30 63 20 3d 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62  c = sqlite3_glob
1cf40 61 6c 5f 72 65 63 6f 76 65 72 28 29 3b 0a 20 20  al_recover();.  
1cf50 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
1cf60 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
1cf70 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
1cf80 43 4c 5f 53 54 41 54 49 43 29 3b 0a 23 65 6e 64  CL_STATIC);.#end
1cf90 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  if.  return TCL_
1cfa0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1cfb0 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
1cfc0 6d 6e 5f 74 65 78 74 20 53 54 4d 54 20 63 6f 6c  mn_text STMT col
1cfd0 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a  umn.**.** Usage:
1cfe0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1cff0 64 65 63 6c 74 79 70 65 20 53 54 4d 54 20 63 6f  decltype STMT co
1d000 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65  lumn.**.** Usage
1d010 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
1d020 5f 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c 75 6d  _name STMT colum
1d030 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n.*/.static int 
1d040 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 28  test_stmt_utf16(
1d050 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1d060 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 50 6f 69  Data,     /* Poi
1d070 6e 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20 41  nter to SQLite A
1d080 50 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62  PI function to b
1d090 65 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 54  e invoked */.  T
1d0a0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1d0b0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1d0c0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1d0d0 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65  objv[].){.#ifnde
1d0e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
1d0f0 46 31 36 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  F16.  sqlite3_st
1d100 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
1d110 20 63 6f 6c 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20   col;.  Tcl_Obj 
1d120 2a 70 52 65 74 3b 0a 20 20 63 6f 6e 73 74 20 76  *pRet;.  const v
1d130 6f 69 64 20 2a 7a 4e 61 6d 65 31 36 3b 0a 20 20  oid *zName16;.  
1d140 63 6f 6e 73 74 20 76 6f 69 64 20 2a 28 2a 78 46  const void *(*xF
1d150 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d  unc)(sqlite3_stm
1d160 74 2a 2c 20 69 6e 74 29 3b 0a 0a 20 20 78 46 75  t*, int);..  xFu
1d170 6e 63 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64  nc = (const void
1d180 20 2a 28 2a 29 28 73 71 6c 69 74 65 33 5f 73 74   *(*)(sqlite3_st
1d190 6d 74 2a 2c 20 69 6e 74 29 29 63 6c 69 65 6e 74  mt*, int))client
1d1a0 44 61 74 61 3b 0a 20 20 69 66 28 20 6f 62 6a 63  Data;.  if( objc
1d1b0 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
1d1c0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1d1d0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1d1e0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1d1f0 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1d200 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1d210 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22  , " STMT column"
1d220 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1d230 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1d240 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
1d250 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1d260 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1d270 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
1d280 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1d290 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
1d2a0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
1d2b0 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29  , objv[2], &col)
1d2c0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1d2d0 52 4f 52 3b 0a 0a 20 20 7a 4e 61 6d 65 31 36 20  ROR;..  zName16 
1d2e0 3d 20 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63  = xFunc(pStmt, c
1d2f0 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ol);.  if( zName
1d300 31 36 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  16 ){.    int n;
1d310 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1d320 2a 7a 20 3d 20 7a 4e 61 6d 65 31 36 3b 0a 20 20  *z = zName16;.  
1d330 20 20 66 6f 72 28 6e 3d 30 3b 20 7a 5b 6e 5d 20    for(n=0; z[n] 
1d340 7c 7c 20 7a 5b 6e 2b 31 5d 3b 20 6e 2b 3d 32 29  || z[n+1]; n+=2)
1d350 7b 7d 0a 20 20 20 20 70 52 65 74 20 3d 20 54 63  {}.    pRet = Tc
1d360 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
1d370 6a 28 7a 4e 61 6d 65 31 36 2c 20 6e 2b 32 29 3b  j(zName16, n+2);
1d380 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
1d390 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52  esult(interp, pR
1d3a0 65 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  et);.  }.#endif 
1d3b0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
1d3c0 54 46 31 36 20 2a 2f 0a 0a 20 20 72 65 74 75 72  TF16 */..  retur
1d3d0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1d3e0 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1d3f0 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 20 53 54 4d  3_column_int STM
1d400 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55  T column.**.** U
1d410 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
1d420 6c 75 6d 6e 5f 62 79 74 65 73 20 53 54 4d 54 20  lumn_bytes STMT 
1d430 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61  column.**.** Usa
1d440 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
1d450 6d 6e 5f 62 79 74 65 73 31 36 20 53 54 4d 54 20  mn_bytes16 STMT 
1d460 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2f 0a 73 74 61  column.**.*/.sta
1d470 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d  tic int test_stm
1d480 74 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20  t_int(.  void * 
1d490 63 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 2f  clientData,    /
1d4a0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c  * Pointer to SQL
1d4b0 69 74 65 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  ite API function
1d4c0 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 2a   to be invoked *
1d4d0 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
1d4e0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1d4f0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1d500 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1d510 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1d520 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b  Stmt;.  int col;
1d530 0a 20 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28  .  int (*xFunc)(
1d540 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69  sqlite3_stmt*, i
1d550 6e 74 29 3b 0a 0a 20 20 78 46 75 6e 63 20 3d 20  nt);..  xFunc = 
1d560 28 69 6e 74 20 28 2a 29 28 73 71 6c 69 74 65 33  (int (*)(sqlite3
1d570 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 29 63 6c 69  _stmt*, int))cli
1d580 65 6e 74 44 61 74 61 3b 0a 20 20 69 66 28 20 6f  entData;.  if( o
1d590 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
1d5a0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1d5b0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1d5c0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1d5d0 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
1d5e0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1d5f0 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75  0]), " STMT colu
1d600 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  mn", 0);.    ret
1d610 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1d620 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
1d630 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
1d640 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1d650 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
1d660 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1d670 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
1d680 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
1d690 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63  erp, objv[2], &c
1d6a0 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ol) ) return TCL
1d6b0 5f 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53  _ERROR;..  Tcl_S
1d6c0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1d6d0 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
1d6e0 6a 28 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63  j(xFunc(pStmt, c
1d6f0 6f 6c 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ol)));.  return 
1d700 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1d710 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 5f   Usage:  sqlite_
1d720 73 65 74 5f 6d 61 67 69 63 20 20 44 42 20 20 4d  set_magic  DB  M
1d730 41 47 49 43 2d 4e 55 4d 42 45 52 0a 2a 2a 0a 2a  AGIC-NUMBER.**.*
1d740 2a 20 53 65 74 20 74 68 65 20 64 62 2d 3e 6d 61  * Set the db->ma
1d750 67 69 63 20 76 61 6c 75 65 2e 20 20 54 68 69 73  gic value.  This
1d760 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
1d770 20 65 72 72 6f 72 20 72 65 63 6f 76 65 72 79 20   error recovery 
1d780 6c 6f 67 69 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  logic..*/.static
1d790 20 69 6e 74 20 73 71 6c 69 74 65 5f 73 65 74 5f   int sqlite_set_
1d7a0 6d 61 67 69 63 28 0a 20 20 76 6f 69 64 20 2a 20  magic(.  void * 
1d7b0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1d7c0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1d7d0 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
1d7e0 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  char **argv.){. 
1d7f0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1d800 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
1d810 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1d820 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1d830 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1d840 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
1d850 5d 2c 0a 20 20 20 20 20 20 20 20 20 22 20 44 42  ],.         " DB
1d860 20 4d 41 47 49 43 22 2c 20 30 29 3b 0a 20 20 20   MAGIC", 0);.   
1d870 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1d880 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
1d890 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
1d8a0 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
1d8b0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1d8c0 4f 52 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70  OR;.  if( strcmp
1d8d0 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54  (argv[2], "SQLIT
1d8e0 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 22 29 3d 3d  E_MAGIC_OPEN")==
1d8f0 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67  0 ){.    db->mag
1d900 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
1d910 43 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65 20  C_OPEN;.  }else 
1d920 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
1d930 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49  2], "SQLITE_MAGI
1d940 43 5f 43 4c 4f 53 45 44 22 29 3d 3d 30 20 29 7b  C_CLOSED")==0 ){
1d950 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  .    db->magic =
1d960 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c   SQLITE_MAGIC_CL
1d970 4f 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  OSED;.  }else if
1d980 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 32 5d  ( strcmp(argv[2]
1d990 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  , "SQLITE_MAGIC_
1d9a0 42 55 53 59 22 29 3d 3d 30 20 29 7b 0a 20 20 20  BUSY")==0 ){.   
1d9b0 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
1d9c0 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a  ITE_MAGIC_BUSY;.
1d9d0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
1d9e0 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c  mp(argv[2], "SQL
1d9f0 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 22  ITE_MAGIC_ERROR"
1da00 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  )==0 ){.    db->
1da10 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
1da20 41 47 49 43 5f 45 52 52 4f 52 3b 0a 20 20 7d 65  AGIC_ERROR;.  }e
1da30 6c 73 65 20 69 66 28 20 54 63 6c 5f 47 65 74 49  lse if( Tcl_GetI
1da40 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
1da50 32 5d 2c 20 28 69 6e 74 2a 29 26 64 62 2d 3e 6d  2], (int*)&db->m
1da60 61 67 69 63 29 20 29 7b 0a 20 20 20 20 72 65 74  agic) ){.    ret
1da70 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1da80 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
1da90 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1daa0 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  ge:  sqlite3_int
1dab0 65 72 72 75 70 74 20 20 44 42 20 0a 2a 2a 0a 2a  errupt  DB .**.*
1dac0 2a 20 54 72 69 67 67 65 72 20 61 6e 20 69 6e 74  * Trigger an int
1dad0 65 72 72 75 70 74 20 6f 6e 20 44 42 0a 2a 2f 0a  errupt on DB.*/.
1dae0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1daf0 69 6e 74 65 72 72 75 70 74 28 0a 20 20 76 6f 69  interrupt(.  voi
1db00 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1db10 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1db20 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63  terp,.  int argc
1db30 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a  ,.  char **argv.
1db40 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1db50 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ;.  if( argc!=2 
1db60 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1db70 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1db80 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1db90 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
1dba0 67 76 5b 30 5d 2c 20 22 20 44 42 22 2c 20 30 29  gv[0], " DB", 0)
1dbb0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1dbc0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
1dbd0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
1dbe0 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
1dbf0 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
1dc00 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74  L_ERROR;.  sqlit
1dc10 65 33 5f 69 6e 74 65 72 72 75 70 74 28 64 62 29  e3_interrupt(db)
1dc20 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1dc30 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75 38 20  K;.}..static u8 
1dc40 2a 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62  *sqlite3_stack_b
1dc50 61 73 65 6c 69 6e 65 20 3d 20 30 3b 0a 0a 2f 2a  aseline = 0;../*
1dc60 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 73 74 61  .** Fill the sta
1dc70 63 6b 20 77 69 74 68 20 61 20 6b 6e 6f 77 6e 20  ck with a known 
1dc80 62 69 74 70 61 74 74 65 72 6e 2e 0a 2a 2f 0a 73  bitpattern..*/.s
1dc90 74 61 74 69 63 20 76 6f 69 64 20 70 72 65 70 53  tatic void prepS
1dca0 74 61 63 6b 28 76 6f 69 64 29 7b 0a 20 20 69 6e  tack(void){.  in
1dcb0 74 20 69 3b 0a 20 20 75 33 32 20 62 69 67 42 75  t i;.  u32 bigBu
1dcc0 66 5b 36 35 35 33 36 5d 3b 0a 20 20 66 6f 72 28  f[65536];.  for(
1dcd0 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 62 69  i=0; i<sizeof(bi
1dce0 67 42 75 66 29 2f 73 69 7a 65 6f 66 28 62 69 67  gBuf)/sizeof(big
1dcf0 42 75 66 5b 30 5d 29 3b 20 69 2b 2b 29 20 62 69  Buf[0]); i++) bi
1dd00 67 42 75 66 5b 69 5d 20 3d 20 30 78 64 65 61 64  gBuf[i] = 0xdead
1dd10 62 65 65 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f  beef;.  sqlite3_
1dd20 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65 20 3d  stack_baseline =
1dd30 20 28 75 38 2a 29 26 62 69 67 42 75 66 5b 36 35   (u8*)&bigBuf[65
1dd40 35 33 36 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  536];.}../*.** G
1dd50 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  et the current s
1dd60 74 61 63 6b 20 64 65 70 74 68 2e 20 20 55 73 65  tack depth.  Use
1dd70 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  d for debugging 
1dd80 6f 6e 6c 79 2e 0a 2a 2f 0a 75 36 34 20 73 71 6c  only..*/.u64 sql
1dd90 69 74 65 33 53 74 61 63 6b 44 65 70 74 68 28 76  ite3StackDepth(v
1dda0 6f 69 64 29 7b 0a 20 20 75 38 20 78 3b 0a 20 20  oid){.  u8 x;.  
1ddb0 72 65 74 75 72 6e 20 28 75 36 34 29 28 73 71 6c  return (u64)(sql
1ddc0 69 74 65 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c  ite3_stack_basel
1ddd0 69 6e 65 20 2d 20 26 78 29 3b 0a 7d 0a 0a 2f 2a  ine - &x);.}../*
1dde0 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
1ddf0 74 65 33 5f 73 74 61 63 6b 5f 75 73 65 64 20 44  te3_stack_used D
1de00 42 20 53 51 4c 0a 2a 2a 0a 2a 2a 20 54 72 79 20  B SQL.**.** Try 
1de10 74 6f 20 6d 65 61 73 75 72 65 20 74 68 65 20 61  to measure the a
1de20 6d 6f 75 6e 74 20 6f 66 20 73 74 61 63 6b 20 73  mount of stack s
1de30 70 61 63 65 20 75 73 65 64 20 62 79 20 61 20 63  pace used by a c
1de40 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  all to sqlite3_e
1de50 78 65 63 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  xec.*/.static in
1de60 74 20 74 65 73 74 5f 73 74 61 63 6b 5f 75 73 65  t test_stack_use
1de70 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  d(.  void * clie
1de80 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1de90 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1dea0 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72  int argc,.  char
1deb0 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c   **argv.){.  sql
1dec0 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
1ded0 69 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33  i;.  if( argc!=3
1dee0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1def0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1df00 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1df10 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
1df20 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
1df30 20 22 20 44 42 20 53 51 4c 22 2c 20 30 29 3b 0a   " DB SQL", 0);.
1df40 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1df50 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1df60 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1df70 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
1df80 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1df90 45 52 52 4f 52 3b 0a 20 20 70 72 65 70 53 74 61  ERROR;.  prepSta
1dfa0 63 6b 28 29 3b 0a 20 20 28 76 6f 69 64 29 73 71  ck();.  (void)sq
1dfb0 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 61  lite3_exec(db, a
1dfc0 72 67 76 5b 32 5d 2c 20 30 2c 20 30 2c 20 30 29  rgv[2], 0, 0, 0)
1dfd0 3b 0a 20 20 66 6f 72 28 69 3d 36 35 35 33 35 3b  ;.  for(i=65535;
1dfe0 20 69 3e 3d 30 20 26 26 20 28 28 75 33 32 2a 29   i>=0 && ((u32*)
1dff0 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62 61  sqlite3_stack_ba
1e000 73 65 6c 69 6e 65 29 5b 2d 69 5d 3d 3d 30 78 64  seline)[-i]==0xd
1e010 65 61 64 62 65 65 66 3b 20 69 2d 2d 29 7b 7d 0a  eadbeef; i--){}.
1e020 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
1e030 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
1e040 65 77 49 6e 74 4f 62 6a 28 69 2a 34 29 29 3b 0a  ewIntObj(i*4));.
1e050 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1e060 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1e070 20 73 71 6c 69 74 65 5f 64 65 6c 65 74 65 5f 66   sqlite_delete_f
1e080 75 6e 63 74 69 6f 6e 20 44 42 20 66 75 6e 63 74  unction DB funct
1e090 69 6f 6e 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 44  ion-name.**.** D
1e0a0 65 6c 65 74 65 20 74 68 65 20 75 73 65 72 20 66  elete the user f
1e0b0 75 6e 63 74 69 6f 6e 20 27 66 75 6e 63 74 69 6f  unction 'functio
1e0c0 6e 2d 6e 61 6d 65 27 20 66 72 6f 6d 20 64 61 74  n-name' from dat
1e0d0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 44 42 2e  abase handle DB.
1e0e0 20 49 74 0a 2a 2a 20 69 73 20 61 73 73 75 6d 65   It.** is assume
1e0f0 64 20 74 68 61 74 20 74 68 65 20 75 73 65 72 20  d that the user 
1e100 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 72 65  function was cre
1e110 61 74 65 64 20 61 73 20 55 54 46 38 2c 20 61 6e  ated as UTF8, an
1e120 79 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 61  y number of.** a
1e130 72 67 75 6d 65 6e 74 73 20 28 74 68 65 20 77 61  rguments (the wa
1e140 79 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 66  y the TCL interf
1e150 61 63 65 20 64 6f 65 73 20 69 74 29 2e 0a 2a 2f  ace does it)..*/
1e160 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 6c 65  .static int dele
1e170 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 76  te_function(.  v
1e180 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1e190 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1e1a0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72  interp,.  int ar
1e1b0 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67  gc,.  char **arg
1e1c0 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  v.){.  int rc;. 
1e1d0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1e1e0 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
1e1f0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1e200 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1e210 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1e220 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
1e230 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44 42  ], .        " DB
1e240 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 22 2c   function-name",
1e250 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1e260 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1e270 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
1e280 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
1e290 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
1e2a0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
1e2b0 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
1e2c0 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 61  e_function(db, a
1e2d0 72 67 76 5b 32 5d 2c 20 2d 31 2c 20 53 51 4c 49  rgv[2], -1, SQLI
1e2e0 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 20 30  TE_UTF8, 0, 0, 0
1e2f0 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52  , 0);.  Tcl_SetR
1e300 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
1e310 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
1e320 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
1e330 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  C);.  return TCL
1e340 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1e350 61 67 65 3a 20 73 71 6c 69 74 65 5f 64 65 6c 65  age: sqlite_dele
1e360 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 20 44 42 20  te_collation DB 
1e370 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 61 6d 65 0a 2a  collation-name.*
1e380 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
1e390 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1e3a0 63 65 20 27 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 61  ce 'collation-na
1e3b0 6d 65 27 20 66 72 6f 6d 20 64 61 74 61 62 61 73  me' from databas
1e3c0 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 44 42 2e  e handle .** DB.
1e3d0 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
1e3e0 68 61 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  hat the collatio
1e3f0 6e 20 73 65 71 75 65 6e 63 65 20 77 61 73 20 63  n sequence was c
1e400 72 65 61 74 65 64 20 61 73 20 55 54 46 38 20 28  reated as UTF8 (
1e410 74 68 65 20 0a 2a 2a 20 77 61 79 20 74 68 65 20  the .** way the 
1e420 54 43 4c 20 69 6e 74 65 72 66 61 63 65 20 64 6f  TCL interface do
1e430 65 73 20 69 74 29 2e 0a 2a 2f 0a 73 74 61 74 69  es it)..*/.stati
1e440 63 20 69 6e 74 20 64 65 6c 65 74 65 5f 63 6f 6c  c int delete_col
1e450 6c 61 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a  lation(.  void *
1e460 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1e470 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1e480 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  p,.  int argc,. 
1e490 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a   char **argv.){.
1e4a0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
1e4b0 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61  te3 *db;.  if( a
1e4c0 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
1e4d0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1e4e0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1e4f0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1e500 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
1e510 20 20 20 20 20 20 20 22 20 44 42 20 66 75 6e 63         " DB func
1e520 74 69 6f 6e 2d 6e 61 6d 65 22 2c 20 30 29 3b 0a  tion-name", 0);.
1e530 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1e540 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1e550 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1e560 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
1e570 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1e580 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
1e590 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
1e5a0 6c 61 74 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b  lation(db, argv[
1e5b0 32 5d 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  2], SQLITE_UTF8,
1e5c0 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65   0, 0);.  Tcl_Se
1e5d0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
1e5e0 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
1e5f0 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
1e600 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  TIC);.  return T
1e610 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1e620 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 67  Usage: sqlite3_g
1e630 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 44 42  et_autocommit DB
1e640 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  .**.** Return tr
1e650 75 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ue if the databa
1e660 73 65 20 44 42 20 69 73 20 63 75 72 72 65 6e 74  se DB is current
1e670 6c 79 20 69 6e 20 61 75 74 6f 2d 63 6f 6d 6d 69  ly in auto-commi
1e680 74 20 6d 6f 64 65 2e 0a 2a 2a 20 52 65 74 75 72  t mode..** Retur
1e690 6e 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a  n false if not..
1e6a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
1e6b0 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 0a 20 20  t_autocommit(.  
1e6c0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1e6d0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1e6e0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61  *interp,.  int a
1e6f0 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72  rgc,.  char **ar
1e700 67 76 0a 29 7b 0a 20 20 63 68 61 72 20 7a 42 75  gv.){.  char zBu
1e710 66 5b 33 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33  f[30];.  sqlite3
1e720 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63   *db;.  if( argc
1e730 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
1e740 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1e750 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1e760 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1e770 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
1e780 20 20 20 20 22 20 44 42 22 2c 20 30 29 3b 0a 20      " DB", 0);. 
1e790 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1e7a0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
1e7b0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
1e7c0 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
1e7d0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1e7e0 52 52 4f 52 3b 0a 20 20 73 70 72 69 6e 74 66 28  RROR;.  sprintf(
1e7f0 7a 42 75 66 2c 20 22 25 64 22 2c 20 73 71 6c 69  zBuf, "%d", sqli
1e800 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d  te3_get_autocomm
1e810 69 74 28 64 62 29 29 3b 0a 20 20 54 63 6c 5f 41  it(db));.  Tcl_A
1e820 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1e830 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20  rp, zBuf, 0);.  
1e840 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1e850 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1e860 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65  qlite3_busy_time
1e870 6f 75 74 20 44 42 20 4d 53 0a 2a 2a 0a 2a 2a 20  out DB MS.**.** 
1e880 53 65 74 20 74 68 65 20 62 75 73 79 20 74 69 6d  Set the busy tim
1e890 65 6f 75 74 2e 20 20 54 68 69 73 20 69 73 20 6d  eout.  This is m
1e8a0 6f 72 65 20 65 61 73 69 6c 79 20 64 6f 6e 65 20  ore easily done 
1e8b0 75 73 69 6e 67 20 74 68 65 20 74 69 6d 65 6f 75  using the timeou
1e8c0 74 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74  t.** method of t
1e8d0 68 65 20 54 43 4c 20 69 6e 74 65 72 66 61 63 65  he TCL interface
1e8e0 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64 20 61  .  But we need a
1e8f0 20 77 61 79 20 74 6f 20 74 65 73 74 20 74 68 65   way to test the
1e900 20 63 61 73 65 0a 2a 2a 20 77 68 65 72 65 20 69   case.** where i
1e910 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
1e920 5f 4d 49 53 55 53 45 2e 0a 2a 2f 0a 73 74 61 74  _MISUSE..*/.stat
1e930 69 63 20 69 6e 74 20 74 65 73 74 5f 62 75 73 79  ic int test_busy
1e940 5f 74 69 6d 65 6f 75 74 28 0a 20 20 76 6f 69 64  _timeout(.  void
1e950 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1e960 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1e970 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  erp,.  int argc,
1e980 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29  .  char **argv.)
1e990 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6d 73 3b 0a  {.  int rc, ms;.
1e9a0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1e9b0 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a   if( argc!=3 ){.
1e9c0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1e9d0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1e9e0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1e9f0 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
1ea00 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44  0], .        " D
1ea10 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
1ea20 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1ea30 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
1ea40 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
1ea50 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
1ea60 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1ea70 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28   if( Tcl_GetInt(
1ea80 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c  interp, argv[2],
1ea90 20 26 6d 73 29 20 29 20 72 65 74 75 72 6e 20 54   &ms) ) return T
1eaa0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
1eab0 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69   sqlite3_busy_ti
1eac0 6d 65 6f 75 74 28 64 62 2c 20 6d 73 29 3b 0a 20  meout(db, ms);. 
1ead0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1eae0 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65  t(interp, sqlite
1eaf0 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 30 29  3ErrName(rc), 0)
1eb00 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1eb10 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1eb20 65 3a 20 20 74 63 6c 5f 76 61 72 69 61 62 6c 65  e:  tcl_variable
1eb30 5f 74 79 70 65 20 56 41 52 49 41 42 4c 45 4e 41  _type VARIABLENA
1eb40 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ME.**.** Return 
1eb50 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
1eb60 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65  internal represe
1eb70 6e 74 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a  ntation for the.
1eb80 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ** value of the 
1eb90 67 69 76 65 6e 20 76 61 72 69 61 62 6c 65 2e 0a  given variable..
1eba0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 63  */.static int tc
1ebb0 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79 70 65 28  l_variable_type(
1ebc0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1ebd0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1ebe0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1ebf0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1ec00 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1ec10 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56  ){.  Tcl_Obj *pV
1ec20 61 72 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ar;.  if( objc!=
1ec30 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
1ec40 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
1ec50 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 56 41 52 49  , 1, objv, "VARI
1ec60 41 42 4c 45 22 29 3b 0a 20 20 20 20 72 65 74 75  ABLE");.    retu
1ec70 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1ec80 7d 0a 20 20 70 56 61 72 20 3d 20 54 63 6c 5f 47  }.  pVar = Tcl_G
1ec90 65 74 56 61 72 32 45 78 28 69 6e 74 65 72 70 2c  etVar2Ex(interp,
1eca0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1ecb0 62 6a 76 5b 31 5d 29 2c 20 30 2c 20 54 43 4c 5f  bjv[1]), 0, TCL_
1ecc0 4c 45 41 56 45 5f 45 52 52 5f 4d 53 47 29 3b 0a  LEAVE_ERR_MSG);.
1ecd0 20 20 69 66 28 20 70 56 61 72 3d 3d 30 20 29 20    if( pVar==0 ) 
1ece0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1ecf0 3b 0a 20 20 69 66 28 20 70 56 61 72 2d 3e 74 79  ;.  if( pVar->ty
1ed00 70 65 50 74 72 20 29 7b 0a 20 20 20 20 54 63 6c  pePtr ){.    Tcl
1ed10 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
1ed20 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72  terp, Tcl_NewStr
1ed30 69 6e 67 4f 62 6a 28 70 56 61 72 2d 3e 74 79 70  ingObj(pVar->typ
1ed40 65 50 74 72 2d 3e 6e 61 6d 65 2c 20 2d 31 29 29  ePtr->name, -1))
1ed50 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
1ed60 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1ed70 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
1ed80 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 20 3f  release_memory ?
1ed90 4e 3f 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  N?.**.** Attempt
1eda0 20 74 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d 6f   to release memo
1edb0 72 79 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c  ry currently hel
1edc0 64 20 62 75 74 20 6e 6f 74 20 61 63 74 75 61 6c  d but not actual
1edd0 6c 79 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 20  ly required..** 
1ede0 54 68 65 20 69 6e 74 65 67 65 72 20 4e 20 69 73  The integer N is
1edf0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1ee00 79 74 65 73 20 77 65 20 61 72 65 20 74 72 79 69  ytes we are tryi
1ee10 6e 67 20 74 6f 20 72 65 6c 65 61 73 65 2e 20 20  ng to release.  
1ee20 54 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 20 76  The .** return v
1ee30 61 6c 75 65 20 69 73 20 74 68 65 20 61 6d 6f 75  alue is the amou
1ee40 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 61 63 74  nt of memory act
1ee50 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 64 2e 0a  ually released..
1ee60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1ee70 73 74 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  st_release_memor
1ee80 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  y(.  void * clie
1ee90 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1eea0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1eeb0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1eec0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1eed0 5d 0a 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  ].){.#if defined
1eee0 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d  (SQLITE_ENABLE_M
1eef0 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
1ef00 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
1ef10 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
1ef20 29 0a 20 20 69 6e 74 20 4e 3b 0a 20 20 69 6e 74  ).  int N;.  int
1ef30 20 61 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63   amt;.  if( objc
1ef40 21 3d 31 20 26 26 20 6f 62 6a 63 21 3d 32 20 29  !=1 && objc!=2 )
1ef50 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
1ef60 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
1ef70 2c 20 6f 62 6a 76 2c 20 22 3f 4e 3f 22 29 3b 0a  , objv, "?N?");.
1ef80 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1ef90 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1efa0 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69  objc==2 ){.    i
1efb0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
1efc0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
1efd0 76 5b 31 5d 2c 20 26 4e 29 20 29 20 72 65 74 75  v[1], &N) ) retu
1efe0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1eff0 7d 65 6c 73 65 7b 0a 20 20 20 20 4e 20 3d 20 2d  }else{.    N = -
1f000 31 3b 0a 20 20 7d 0a 20 20 61 6d 74 20 3d 20 73  1;.  }.  amt = s
1f010 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d  qlite3_release_m
1f020 65 6d 6f 72 79 28 4e 29 3b 0a 20 20 54 63 6c 5f  emory(N);.  Tcl_
1f030 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
1f040 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
1f050 62 6a 28 61 6d 74 29 29 3b 0a 23 65 6e 64 69 66  bj(amt));.#endif
1f060 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1f070 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  ;.}.../*.** Usag
1f080 65 3a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 72  e:  sqlite3_db_r
1f090 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 20 44 42  elease_memory DB
1f0a0 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  .**.** Attempt t
1f0b0 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79  o release memory
1f0c0 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20   currently held 
1f0d0 62 79 20 64 61 74 61 62 61 73 65 20 44 42 2e 20  by database DB. 
1f0e0 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 72   Return the.** r
1f0f0 65 73 75 6c 74 20 63 6f 64 65 20 28 77 68 69 63  esult code (whic
1f100 68 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  h in the current
1f110 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
1f120 69 73 20 61 6c 77 61 79 73 20 7a 65 72 6f 29 2e  is always zero).
1f130 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1f140 65 73 74 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d  est_db_release_m
1f150 65 6d 6f 72 79 28 0a 20 20 76 6f 69 64 20 2a 20  emory(.  void * 
1f160 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1f170 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1f180 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1f190 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1f1a0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
1f1b0 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
1f1c0 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ;.  if( objc!=2 
1f1d0 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
1f1e0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
1f1f0 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a  1, objv, "DB");.
1f200 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1f210 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1f220 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1f230 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1f240 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
1f250 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1f260 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
1f270 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f  ite3_db_release_
1f280 6d 65 6d 6f 72 79 28 64 62 29 3b 0a 20 20 54 63  memory(db);.  Tc
1f290 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1f2a0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
1f2b0 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20 72 65 74  tObj(rc));.  ret
1f2c0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1f2d0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
1f2e0 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65  ite3_db_filename
1f2f0 20 44 42 20 44 42 4e 41 4d 45 0a 2a 2a 0a 2a 2a   DB DBNAME.**.**
1f300 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   Return the name
1f310 20 6f 66 20 61 20 66 69 6c 65 20 61 73 73 6f 63   of a file assoc
1f320 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74  iated with a dat
1f330 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
1f340 20 69 6e 74 20 74 65 73 74 5f 64 62 5f 66 69 6c   int test_db_fil
1f350 65 6e 61 6d 65 28 0a 20 20 76 6f 69 64 20 2a 20  ename(.  void * 
1f360 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1f370 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1f380 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1f390 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1f3a0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
1f3b0 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
1f3c0 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 3b 0a 20  char *zDbName;. 
1f3d0 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
1f3e0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
1f3f0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
1f400 6f 62 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d 45  objv, "DB DBNAME
1f410 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
1f420 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1f430 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
1f440 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1f450 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1f460 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
1f470 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 44 62 4e  CL_ERROR;.  zDbN
1f480 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
1f490 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
1f4a0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1f4b0 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
1f4c0 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 64 62 2c  _db_filename(db,
1f4d0 20 7a 44 62 4e 61 6d 65 29 2c 20 28 76 6f 69 64   zDbName), (void
1f4e0 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  *)0);.  return T
1f4f0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1f500 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
1f510 64 62 5f 72 65 61 64 6f 6e 6c 79 20 44 42 20 44  db_readonly DB D
1f520 42 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75  BNAME.**.** Retu
1f530 72 6e 20 31 20 6f 72 20 30 20 69 66 20 44 42 4e  rn 1 or 0 if DBN
1f540 41 4d 45 20 69 73 20 72 65 61 64 6f 6e 6c 79 20  AME is readonly 
1f550 6f 72 20 6e 6f 74 2e 20 20 52 65 74 75 72 6e 20  or not.  Return 
1f560 2d 31 20 69 66 20 44 42 4e 41 4d 45 20 64 6f 65  -1 if DBNAME doe
1f570 73 0a 2a 2a 20 6e 6f 74 20 65 78 69 73 74 2e 0a  s.** not exist..
1f580 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1f590 73 74 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 28 0a  st_db_readonly(.
1f5a0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1f5b0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1f5c0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1f5d0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1f5e0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1f5f0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1f600 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1f610 44 62 4e 61 6d 65 3b 0a 20 20 69 66 28 20 6f 62  DbName;.  if( ob
1f620 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
1f630 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
1f640 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
1f650 44 42 20 44 42 4e 41 4d 45 22 29 3b 0a 20 20 20  DB DBNAME");.   
1f660 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1f670 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
1f680 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
1f690 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1f6a0 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
1f6b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1f6c0 52 3b 0a 20 20 7a 44 62 4e 61 6d 65 20 3d 20 54  R;.  zDbName = T
1f6d0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1f6e0 76 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 53 65 74  v[2]);.  Tcl_Set
1f6f0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
1f700 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
1f710 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f  sqlite3_db_reado
1f720 6e 6c 79 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29  nly(db, zDbName)
1f730 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
1f740 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1f750 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 6f  age:  sqlite3_so
1f760 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 20 3f 4e  ft_heap_limit ?N
1f770 3f 0a 2a 2a 0a 2a 2a 20 51 75 65 72 79 20 6f 72  ?.**.** Query or
1f780 20 73 65 74 20 74 68 65 20 73 6f 66 74 20 68 65   set the soft he
1f790 61 70 20 6c 69 6d 69 74 20 66 6f 72 20 74 68 65  ap limit for the
1f7a0 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 2e   current thread.
1f7b0 20 20 54 68 65 0a 2a 2a 20 6c 69 6d 69 74 20 69    The.** limit i
1f7c0 73 20 6f 6e 6c 79 20 63 68 61 6e 67 65 64 20 69  s only changed i
1f7d0 66 20 74 68 65 20 4e 20 69 73 20 70 72 65 73 65  f the N is prese
1f7e0 6e 74 2e 20 20 54 68 65 20 70 72 65 76 69 6f 75  nt.  The previou
1f7f0 73 20 6c 69 6d 69 74 0a 2a 2a 20 69 73 20 72 65  s limit.** is re
1f800 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
1f810 63 20 69 6e 74 20 74 65 73 74 5f 73 6f 66 74 5f  c int test_soft_
1f820 68 65 61 70 5f 6c 69 6d 69 74 28 0a 20 20 76 6f  heap_limit(.  vo
1f830 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1f840 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1f850 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1f860 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1f870 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1f880 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 61 6d  sqlite3_int64 am
1f890 74 3b 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e 74  t;.  Tcl_WideInt
1f8a0 20 4e 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 6f   N = -1;.  if( o
1f8b0 62 6a 63 21 3d 31 20 26 26 20 6f 62 6a 63 21 3d  bjc!=1 && objc!=
1f8c0 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
1f8d0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
1f8e0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 4e 3f 22  , 1, objv, "?N?"
1f8f0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1f900 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1f910 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20  f( objc==2 ){.  
1f920 20 20 69 66 28 20 54 63 6c 5f 47 65 74 57 69 64    if( Tcl_GetWid
1f930 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  eIntFromObj(inte
1f940 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 4e 29  rp, objv[1], &N)
1f950 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1f960 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 6d 74 20 3d  ROR;.  }.  amt =
1f970 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65   sqlite3_soft_he
1f980 61 70 5f 6c 69 6d 69 74 36 34 28 4e 29 3b 0a 20  ap_limit64(N);. 
1f990 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
1f9a0 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
1f9b0 77 57 69 64 65 49 6e 74 4f 62 6a 28 61 6d 74 29  wWideIntObj(amt)
1f9c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1f9d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1f9e0 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 74 68  ge:   sqlite3_th
1f9f0 72 65 61 64 5f 63 6c 65 61 6e 75 70 0a 2a 2a 0a  read_cleanup.**.
1fa00 2a 2a 20 43 61 6c 6c 20 74 68 65 20 73 71 6c 69  ** Call the sqli
1fa10 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e  te3_thread_clean
1fa20 75 70 20 41 50 49 2e 0a 2a 2f 0a 73 74 61 74 69  up API..*/.stati
1fa30 63 20 69 6e 74 20 74 65 73 74 5f 74 68 72 65 61  c int test_threa
1fa40 64 5f 63 6c 65 61 6e 75 70 28 0a 20 20 76 6f 69  d_cleanup(.  voi
1fa50 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1fa60 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1fa70 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1fa80 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1fa90 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
1faa0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1fab0 5f 44 45 50 52 45 43 41 54 45 44 0a 20 20 73 71  _DEPRECATED.  sq
1fac0 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65  lite3_thread_cle
1fad0 61 6e 75 70 28 29 3b 0a 23 65 6e 64 69 66 0a 20  anup();.#endif. 
1fae0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1faf0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1fb00 20 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f    sqlite3_pager_
1fb10 72 65 66 63 6f 75 6e 74 73 20 20 44 42 0a 2a 2a  refcounts  DB.**
1fb20 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6c 69 73  .** Return a lis
1fb30 74 20 6f 66 20 6e 75 6d 62 65 72 73 20 77 68 69  t of numbers whi
1fb40 63 68 20 61 72 65 20 74 68 65 20 50 61 67 65 72  ch are the Pager
1fb50 52 65 66 63 6f 75 6e 74 20 66 6f 72 20 61 6c 6c  Refcount for all
1fb60 0a 2a 2a 20 70 61 67 65 72 73 20 6f 6e 20 65 61  .** pagers on ea
1fb70 63 68 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ch database conn
1fb80 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ection..*/.stati
1fb90 63 20 69 6e 74 20 74 65 73 74 5f 70 61 67 65 72  c int test_pager
1fba0 5f 72 65 66 63 6f 75 6e 74 73 28 0a 20 20 76 6f  _refcounts(.  vo
1fbb0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1fbc0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1fbd0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1fbe0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1fbf0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1fc00 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
1fc10 6e 74 20 69 3b 0a 20 20 69 6e 74 20 76 2c 20 2a  nt i;.  int v, *
1fc20 61 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52  a;.  Tcl_Obj *pR
1fc30 65 73 75 6c 74 3b 0a 0a 20 20 69 66 28 20 6f 62  esult;..  if( ob
1fc40 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
1fc50 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1fc60 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1fc70 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1fc80 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
1fc90 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
1fca0 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
1fcb0 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
1fcc0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1fcd0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
1fce0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1fcf0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1fd00 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
1fd10 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1fd20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 4e   pResult = Tcl_N
1fd30 65 77 4f 62 6a 28 29 3b 0a 20 20 66 6f 72 28 69  ewObj();.  for(i
1fd40 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
1fd50 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  ++){.    if( db-
1fd60 3e 61 44 62 5b 69 5d 2e 70 42 74 3d 3d 30 20 29  >aDb[i].pBt==0 )
1fd70 7b 0a 20 20 20 20 20 20 76 20 3d 20 2d 31 3b 0a  {.      v = -1;.
1fd80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1fd90 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1fda0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
1fdb0 0a 20 20 20 20 20 20 61 20 3d 20 73 71 6c 69 74  .      a = sqlit
1fdc0 65 33 50 61 67 65 72 53 74 61 74 73 28 73 71 6c  e3PagerStats(sql
1fdd0 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 64  ite3BtreePager(d
1fde0 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 29 3b  b->aDb[i].pBt));
1fdf0 0a 20 20 20 20 20 20 76 20 3d 20 61 5b 30 5d 3b  .      v = a[0];
1fe00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
1fe10 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
1fe20 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  utex);.    }.   
1fe30 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
1fe40 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65  ndElement(0, pRe
1fe50 73 75 6c 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  sult, Tcl_NewInt
1fe60 4f 62 6a 28 76 29 29 3b 0a 20 20 7d 0a 20 20 54  Obj(v));.  }.  T
1fe70 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1fe80 69 6e 74 65 72 70 2c 20 70 52 65 73 75 6c 74 29  interp, pResult)
1fe90 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1fea0 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  K;.}.../*.** tcl
1feb0 63 6d 64 3a 20 20 20 77 6f 72 6b 69 6e 67 5f 36  cmd:   working_6
1fec0 34 62 69 74 5f 69 6e 74 0a 2a 2a 0a 2a 2a 20 53  4bit_int.**.** S
1fed0 6f 6d 65 20 54 43 4c 20 62 75 69 6c 64 73 20 28  ome TCL builds (
1fee0 65 78 3a 20 63 79 67 77 69 6e 29 20 64 6f 20 6e  ex: cygwin) do n
1fef0 6f 74 20 73 75 70 70 6f 72 74 20 36 34 2d 62 69  ot support 64-bi
1ff00 74 20 69 6e 74 65 67 65 72 73 2e 20 20 54 68 69  t integers.  Thi
1ff10 73 0a 2a 2a 20 6c 65 61 64 73 20 74 6f 20 61 20  s.** leads to a 
1ff20 6e 75 6d 62 65 72 20 6f 66 20 74 65 73 74 20 66  number of test f
1ff30 61 69 6c 75 72 65 73 2e 20 20 54 68 65 20 70 72  ailures.  The pr
1ff40 65 73 65 6e 74 20 63 6f 6d 6d 61 6e 64 20 63 68  esent command ch
1ff50 65 63 6b 73 20 74 68 65 0a 2a 2a 20 54 43 4c 20  ecks the.** TCL 
1ff60 62 75 69 6c 64 20 74 6f 20 73 65 65 20 77 68 65  build to see whe
1ff70 74 68 65 72 20 6f 72 20 6e 6f 74 20 69 74 20 73  ther or not it s
1ff80 75 70 70 6f 72 74 73 20 36 34 2d 62 69 74 20 69  upports 64-bit i
1ff90 6e 74 65 67 65 72 73 2e 20 20 49 74 0a 2a 2a 20  ntegers.  It.** 
1ffa0 72 65 74 75 72 6e 73 20 54 52 55 45 20 69 66 20  returns TRUE if 
1ffb0 69 74 20 64 6f 65 73 20 61 6e 64 20 46 41 4c 53  it does and FALS
1ffc0 45 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20  E if not..**.** 
1ffd0 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20  This command is 
1ffe0 75 73 65 64 20 74 6f 20 77 61 72 6e 20 75 73 65  used to warn use
1fff0 72 73 20 74 68 61 74 20 74 68 65 69 72 20 54 43  rs that their TC
20000 4c 20 62 75 69 6c 64 20 69 73 20 64 65 66 65 63  L build is defec
20010 74 69 76 65 0a 2a 2a 20 61 6e 64 20 74 68 61 74  tive.** and that
20020 20 74 68 65 20 65 72 72 6f 72 73 20 74 68 65 79   the errors they
20030 20 61 72 65 20 73 65 65 69 6e 67 20 69 6e 20 74   are seeing in t
20040 68 65 20 74 65 73 74 20 73 63 72 69 70 74 73 20  he test scripts 
20050 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20 72 65  might be.** a re
20060 73 75 6c 74 20 6f 66 20 74 68 65 69 72 20 64 65  sult of their de
20070 66 65 63 74 69 76 65 20 54 43 4c 20 72 61 74 68  fective TCL rath
20080 65 72 20 74 68 61 6e 20 70 72 6f 62 6c 65 6d 73  er than problems
20090 20 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 73   in SQLite..*/.s
200a0 74 61 74 69 63 20 69 6e 74 20 77 6f 72 6b 69 6e  tatic int workin
200b0 67 5f 36 34 62 69 74 5f 69 6e 74 28 0a 20 20 43  g_64bit_int(.  C
200c0 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
200d0 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
200e0 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
200f0 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
20100 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
20110 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
20120 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
20130 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
20140 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
20150 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
20160 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
20170 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
20180 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
20190 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
201a0 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
201b0 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a   */.){.  Tcl_Obj
201c0 20 2a 70 54 65 73 74 4f 62 6a 3b 0a 20 20 69 6e   *pTestObj;.  in
201d0 74 20 77 6f 72 6b 69 6e 67 20 3d 20 30 3b 0a 0a  t working = 0;..
201e0 20 20 70 54 65 73 74 4f 62 6a 20 3d 20 54 63 6c    pTestObj = Tcl
201f0 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 31  _NewWideIntObj(1
20200 30 30 30 30 30 30 2a 28 69 36 34 29 31 32 33 34  000000*(i64)1234
20210 35 36 37 38 39 30 29 3b 0a 20 20 77 6f 72 6b 69  567890);.  worki
20220 6e 67 20 3d 20 73 74 72 63 6d 70 28 54 63 6c 5f  ng = strcmp(Tcl_
20230 47 65 74 53 74 72 69 6e 67 28 70 54 65 73 74 4f  GetString(pTestO
20240 62 6a 29 2c 20 22 31 32 33 34 35 36 37 38 39 30  bj), "1234567890
20250 30 30 30 30 30 30 22 29 3d 3d 30 3b 0a 20 20 54  000000")==0;.  T
20260 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
20270 70 54 65 73 74 4f 62 6a 29 3b 0a 20 20 54 63 6c  pTestObj);.  Tcl
20280 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
20290 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f  terp, Tcl_NewBoo
202a0 6c 65 61 6e 4f 62 6a 28 77 6f 72 6b 69 6e 67 29  leanObj(working)
202b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
202c0 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63  OK;.}.../*.** tc
202d0 6c 63 6d 64 3a 20 20 20 76 66 73 5f 75 6e 6c 69  lcmd:   vfs_unli
202e0 6e 6b 5f 74 65 73 74 0a 2a 2a 0a 2a 2a 20 54 68  nk_test.**.** Th
202f0 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 75  is TCL command u
20300 6e 72 65 67 69 73 74 65 72 73 20 74 68 65 20 70  nregisters the p
20310 72 69 6d 61 72 79 20 56 46 53 20 61 6e 64 20 74  rimary VFS and t
20320 68 65 6e 20 72 65 67 69 73 74 65 72 73 0a 2a 2a  hen registers.**
20330 20 69 74 20 62 61 63 6b 20 61 67 61 69 6e 2e 20   it back again. 
20340 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
20350 20 74 65 73 74 20 74 68 65 20 61 62 69 6c 69 74   test the abilit
20360 79 20 74 6f 20 72 65 67 69 73 74 65 72 20 61 0a  y to register a.
20370 2a 2a 20 56 46 53 20 77 68 65 6e 20 6e 6f 6e 65  ** VFS when none
20380 20 61 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20   are previously 
20390 72 65 67 69 73 74 65 72 65 64 2c 20 61 6e 64 20  registered, and 
203a0 74 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20 0a  the ability to .
203b0 2a 2a 20 75 6e 72 65 67 69 73 74 65 72 20 74 68  ** unregister th
203c0 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  e only available
203d0 20 56 46 53 2e 20 20 54 69 63 6b 65 74 20 23 32   VFS.  Ticket #2
203e0 37 33 38 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  738.*/.static in
203f0 74 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73  t vfs_unlink_tes
20400 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
20410 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
20420 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
20430 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
20440 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
20450 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
20460 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
20470 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
20480 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
20490 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
204a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
204b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
204c0 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
204d0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
204e0 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
204f0 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
20500 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f  nt i;.  sqlite3_
20510 76 66 73 20 2a 70 4d 61 69 6e 3b 0a 20 20 73 71  vfs *pMain;.  sq
20520 6c 69 74 65 33 5f 76 66 73 20 2a 61 70 56 66 73  lite3_vfs *apVfs
20530 5b 32 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f  [20];.  sqlite3_
20540 76 66 73 20 6f 6e 65 2c 20 74 77 6f 3b 0a 0a 20  vfs one, two;.. 
20550 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72   sqlite3_vfs_unr
20560 65 67 69 73 74 65 72 28 30 29 3b 20 20 20 2f 2a  egister(0);   /*
20570 20 55 6e 72 65 67 69 73 74 65 72 20 6f 66 20 4e   Unregister of N
20580 55 4c 4c 20 69 73 20 68 61 72 6d 6c 65 73 73 20  ULL is harmless 
20590 2a 2f 0a 20 20 6f 6e 65 2e 7a 4e 61 6d 65 20 3d  */.  one.zName =
205a0 20 22 5f 5f 6f 6e 65 22 3b 0a 20 20 74 77 6f 2e   "__one";.  two.
205b0 7a 4e 61 6d 65 20 3d 20 22 5f 5f 74 77 6f 22 3b  zName = "__two";
205c0 0a 0a 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 73  ..  /* Calling s
205d0 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
205e0 74 65 72 20 77 69 74 68 20 32 6e 64 20 61 72 67  ter with 2nd arg
205f0 75 6d 65 6e 74 20 6f 66 20 30 20 64 6f 65 73 20  ument of 0 does 
20600 6e 6f 74 0a 20 20 2a 2a 20 63 68 61 6e 67 65 20  not.  ** change 
20610 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 0a  the default VFS.
20620 20 20 2a 2f 0a 20 20 70 4d 61 69 6e 20 3d 20 73    */.  pMain = s
20630 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
20640 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  0);.  sqlite3_vf
20650 73 5f 72 65 67 69 73 74 65 72 28 26 6f 6e 65 2c  s_register(&one,
20660 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70   0);.  assert( p
20670 4d 61 69 6e 3d 3d 30 20 7c 7c 20 70 4d 61 69 6e  Main==0 || pMain
20680 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ==sqlite3_vfs_fi
20690 6e 64 28 30 29 20 29 3b 0a 20 20 73 71 6c 69 74  nd(0) );.  sqlit
206a0 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
206b0 26 74 77 6f 2c 20 30 29 3b 0a 20 20 61 73 73 65  &two, 0);.  asse
206c0 72 74 28 20 70 4d 61 69 6e 3d 3d 30 20 7c 7c 20  rt( pMain==0 || 
206d0 70 4d 61 69 6e 3d 3d 73 71 6c 69 74 65 33 5f 76  pMain==sqlite3_v
206e0 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 0a 20  fs_find(0) );.. 
206f0 20 2f 2a 20 57 65 20 63 61 6e 20 66 69 6e 64 20   /* We can find 
20700 61 20 56 46 53 20 62 79 20 69 74 73 20 6e 61 6d  a VFS by its nam
20710 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  e */.  assert( s
20720 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
20730 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20 29  "__one")==&one )
20740 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
20750 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f  te3_vfs_find("__
20760 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b 0a 0a  two")==&two );..
20770 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 73 71 6c    /* Calling sql
20780 69 74 65 5f 76 66 73 5f 72 65 67 69 73 74 65 72  ite_vfs_register
20790 20 77 69 74 68 20 6e 6f 6e 2d 7a 65 72 6f 20 73   with non-zero s
207a0 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
207b0 63 68 61 6e 67 65 73 20 74 68 65 0a 20 20 2a 2a  changes the.  **
207c0 20 64 65 66 61 75 6c 74 20 56 46 53 2c 20 65 76   default VFS, ev
207d0 65 6e 20 69 66 20 74 68 65 20 31 73 74 20 70 61  en if the 1st pa
207e0 72 61 6d 65 74 65 72 20 69 73 20 61 6e 20 65 78  rameter is an ex
207f0 69 73 74 69 67 20 56 46 53 20 74 68 61 74 20 69  istig VFS that i
20800 73 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c  s.  ** previousl
20810 79 20 72 65 67 69 73 74 65 72 65 64 20 61 73 20  y registered as 
20820 74 68 65 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 2e  the non-default.
20830 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
20840 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 6f 6e  vfs_register(&on
20850 65 2c 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28  e, 1);.  assert(
20860 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
20870 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65  d("__one")==&one
20880 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
20890 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22  lite3_vfs_find("
208a0 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b  __two")==&two );
208b0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
208c0 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d  e3_vfs_find(0)==
208d0 26 6f 6e 65 20 29 3b 0a 20 20 73 71 6c 69 74 65  &one );.  sqlite
208e0 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26  3_vfs_register(&
208f0 74 77 6f 2c 20 31 29 3b 0a 20 20 61 73 73 65 72  two, 1);.  asser
20900 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
20910 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f  ind("__one")==&o
20920 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ne );.  assert( 
20930 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
20940 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20  ("__two")==&two 
20950 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
20960 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
20970 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 69 66 28 20  ==&two );.  if( 
20980 70 4d 61 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c  pMain ){.    sql
20990 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
209a0 72 28 70 4d 61 69 6e 2c 20 31 29 3b 0a 20 20 20  r(pMain, 1);.   
209b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
209c0 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65  _vfs_find("__one
209d0 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 20 20  ")==&one );.    
209e0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
209f0 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22  vfs_find("__two"
20a00 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 20 20 61  )==&two );.    a
20a10 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
20a20 66 73 5f 66 69 6e 64 28 30 29 3d 3d 70 4d 61 69  fs_find(0)==pMai
20a30 6e 20 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  n );.  }.  .  /*
20a40 20 55 6e 6c 69 6e 6b 20 74 68 65 20 64 65 66 61   Unlink the defa
20a50 75 6c 74 20 56 46 53 2e 20 20 52 65 70 65 61 74  ult VFS.  Repeat
20a60 20 75 6e 74 69 6c 20 74 68 65 72 65 20 61 72 65   until there are
20a70 20 6e 6f 20 6d 6f 72 65 20 56 46 53 65 73 0a 20   no more VFSes. 
20a80 20 2a 2a 20 72 65 67 69 73 74 65 72 65 64 2e 0a   ** registered..
20a90 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
20aa0 69 3c 73 69 7a 65 6f 66 28 61 70 56 66 73 29 2f  i<sizeof(apVfs)/
20ab0 73 69 7a 65 6f 66 28 61 70 56 66 73 5b 30 5d 29  sizeof(apVfs[0])
20ac0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 70 56 66  ; i++){.    apVf
20ad0 73 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 5f 76  s[i] = sqlite3_v
20ae0 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 20 20  fs_find(0);.    
20af0 69 66 28 20 61 70 56 66 73 5b 69 5d 20 29 7b 0a  if( apVfs[i] ){.
20b00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61 70        assert( ap
20b10 56 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65 33 5f  Vfs[i]==sqlite3_
20b20 76 66 73 5f 66 69 6e 64 28 61 70 56 66 73 5b 69  vfs_find(apVfs[i
20b30 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20 20 20  ]->zName) );.   
20b40 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75     sqlite3_vfs_u
20b50 6e 72 65 67 69 73 74 65 72 28 61 70 56 66 73 5b  nregister(apVfs[
20b60 69 5d 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  i]);.      asser
20b70 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 76 66  t( 0==sqlite3_vf
20b80 73 5f 66 69 6e 64 28 61 70 56 66 73 5b 69 5d 2d  s_find(apVfs[i]-
20b90 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20 20 20 20 7d  >zName) );.    }
20ba0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 30  .  }.  assert( 0
20bb0 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ==sqlite3_vfs_fi
20bc0 6e 64 28 30 29 20 29 3b 0a 20 20 0a 20 20 2f 2a  nd(0) );.  .  /*
20bd0 20 52 65 67 69 73 74 65 72 20 74 68 65 20 6d 61   Register the ma
20be0 69 6e 20 56 46 53 20 61 73 20 6e 6f 6e 2d 64 65  in VFS as non-de
20bf0 66 61 75 6c 74 20 28 77 69 6c 6c 20 62 65 20 6d  fault (will be m
20c00 61 64 65 20 64 65 66 61 75 6c 74 2c 20 73 69 6e  ade default, sin
20c10 63 65 0a 20 20 2a 2a 20 69 74 27 6c 6c 20 62 65  ce.  ** it'll be
20c20 20 74 68 65 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e   the only one in
20c30 20 65 78 69 73 74 65 6e 63 65 29 2e 0a 20 20 2a   existence)..  *
20c40 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  /.  sqlite3_vfs_
20c50 72 65 67 69 73 74 65 72 28 70 4d 61 69 6e 2c 20  register(pMain, 
20c60 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  0);.  assert( sq
20c70 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
20c80 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a 20 20 0a 20  )==pMain );.  . 
20c90 20 2f 2a 20 55 6e 2d 72 65 67 69 73 74 65 72 20   /* Un-register 
20ca0 74 68 65 20 6d 61 69 6e 20 56 46 53 20 61 67 61  the main VFS aga
20cb0 69 6e 20 74 6f 20 72 65 73 74 6f 72 65 20 61 6e  in to restore an
20cc0 20 65 6d 70 74 79 20 56 46 53 20 6c 69 73 74 20   empty VFS list 
20cd0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  */.  sqlite3_vfs
20ce0 5f 75 6e 72 65 67 69 73 74 65 72 28 70 4d 61 69  _unregister(pMai
20cf0 6e 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d  n);.  assert( 0=
20d00 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e  =sqlite3_vfs_fin
20d10 64 28 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  d(0) );..  /* Re
20d20 6c 69 6e 6b 20 61 6c 6c 20 56 46 53 65 73 20 69  link all VFSes i
20d30 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 2e  n reverse order.
20d40 20 2a 2f 20 20 0a 20 20 66 6f 72 28 69 3d 73 69   */  .  for(i=si
20d50 7a 65 6f 66 28 61 70 56 66 73 29 2f 73 69 7a 65  zeof(apVfs)/size
20d60 6f 66 28 61 70 56 66 73 5b 30 5d 29 2d 31 3b 20  of(apVfs[0])-1; 
20d70 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
20d80 69 66 28 20 61 70 56 66 73 5b 69 5d 20 29 7b 0a  if( apVfs[i] ){.
20d90 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66        sqlite3_vf
20da0 73 5f 72 65 67 69 73 74 65 72 28 61 70 56 66 73  s_register(apVfs
20db0 5b 69 5d 2c 20 31 29 3b 0a 20 20 20 20 20 20 61  [i], 1);.      a
20dc0 73 73 65 72 74 28 20 61 70 56 66 73 5b 69 5d 3d  ssert( apVfs[i]=
20dd0 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e  =sqlite3_vfs_fin
20de0 64 28 30 29 20 29 3b 0a 20 20 20 20 20 20 61 73  d(0) );.      as
20df0 73 65 72 74 28 20 61 70 56 66 73 5b 69 5d 3d 3d  sert( apVfs[i]==
20e00 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
20e10 28 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65  (apVfs[i]->zName
20e20 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ) );.    }.  }..
20e30 20 20 2f 2a 20 55 6e 72 65 67 69 73 74 65 72 20    /* Unregister 
20e40 6f 75 74 20 73 61 6d 70 6c 65 20 56 46 53 65 73  out sample VFSes
20e50 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  . */.  sqlite3_v
20e60 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26 6f  fs_unregister(&o
20e70 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ne);.  sqlite3_v
20e80 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26 74  fs_unregister(&t
20e90 77 6f 29 3b 0a 0a 20 20 2f 2a 20 55 6e 72 65 67  wo);..  /* Unreg
20ea0 69 73 74 65 72 69 6e 67 20 61 20 56 46 53 20 74  istering a VFS t
20eb0 68 61 74 20 69 73 20 6e 6f 74 20 63 75 72 72 65  hat is not curre
20ec0 6e 74 6c 79 20 72 65 67 69 73 74 65 72 65 64 20  ntly registered 
20ed0 69 73 20 68 61 72 6d 6c 65 73 73 20 2a 2f 0a 20  is harmless */. 
20ee0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72   sqlite3_vfs_unr
20ef0 65 67 69 73 74 65 72 28 26 6f 6e 65 29 3b 0a 20  egister(&one);. 
20f00 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72   sqlite3_vfs_unr
20f10 65 67 69 73 74 65 72 28 26 74 77 6f 29 3b 0a 20  egister(&two);. 
20f20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
20f30 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65  _vfs_find("__one
20f40 22 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ")==0 );.  asser
20f50 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
20f60 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 30 20  ind("__two")==0 
20f70 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 73 68 6f 75  );..  /* We shou
20f80 6c 64 20 62 65 20 6c 65 66 74 20 77 69 74 68 20  ld be left with 
20f90 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 66  the original def
20fa0 61 75 6c 74 20 56 46 53 20 62 61 63 6b 20 61 73  ault VFS back as
20fb0 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e   the.  ** origin
20fc0 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  al */.  assert( 
20fd0 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
20fe0 28 30 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a 0a 20  (0)==pMain );.. 
20ff0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
21000 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
21010 20 20 20 76 66 73 5f 69 6e 69 74 66 61 69 6c 5f     vfs_initfail_
21020 74 65 73 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  test.**.** This 
21030 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 61 74 74 65  TCL command atte
21040 6d 70 74 73 20 74 6f 20 76 66 73 5f 66 69 6e 64  mpts to vfs_find
21050 20 61 6e 64 20 76 66 73 5f 72 65 67 69 73 74 65   and vfs_registe
21060 72 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 73 71  r when the.** sq
21070 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
21080 28 29 20 69 6e 74 65 72 66 61 63 65 20 69 73 20  () interface is 
21090 66 61 69 6c 69 6e 67 2e 20 20 41 6c 6c 20 63 61  failing.  All ca
210a0 6c 6c 73 20 73 68 6f 75 6c 64 20 66 61 69 6c 2e  lls should fail.
210b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
210c0 66 73 5f 69 6e 69 74 66 61 69 6c 5f 74 65 73 74  fs_initfail_test
210d0 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
210e0 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
210f0 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
21100 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
21110 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
21120 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
21130 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
21140 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
21150 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
21160 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
21170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21180 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
21190 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
211a0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
211b0 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
211c0 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
211d0 6c 69 74 65 33 5f 76 66 73 20 6f 6e 65 3b 0a 20  lite3_vfs one;. 
211e0 20 6f 6e 65 2e 7a 4e 61 6d 65 20 3d 20 22 5f 5f   one.zName = "__
211f0 6f 6e 65 22 3b 0a 0a 20 20 69 66 28 20 73 71 6c  one";..  if( sql
21200 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
21210 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
21220 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ROR;.  sqlite3_v
21230 66 73 5f 72 65 67 69 73 74 65 72 28 26 6f 6e 65  fs_register(&one
21240 2c 20 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  , 0);.  if( sqli
21250 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20  te3_vfs_find(0) 
21260 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
21270 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  OR;.  sqlite3_vf
21280 73 5f 72 65 67 69 73 74 65 72 28 26 6f 6e 65 2c  s_register(&one,
21290 20 31 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74   1);.  if( sqlit
212a0 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29  e3_vfs_find(0) )
212b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
212c0 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  R;.  return TCL_
212d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  OK;.}../*.** Sav
212e0 65 64 20 56 46 53 65 73 0a 2a 2f 0a 73 74 61 74  ed VFSes.*/.stat
212f0 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ic sqlite3_vfs *
21300 61 70 56 66 73 5b 32 30 5d 3b 0a 73 74 61 74 69  apVfs[20];.stati
21310 63 20 69 6e 74 20 6e 56 66 73 20 3d 20 30 3b 0a  c int nVfs = 0;.
21320 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
21330 20 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 5f   vfs_unregister_
21340 61 6c 6c 0a 2a 2a 0a 2a 2a 20 55 6e 72 65 67 69  all.**.** Unregi
21350 73 74 65 72 20 61 6c 6c 20 56 46 53 65 73 2e 0a  ster all VFSes..
21360 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66  */.static int vf
21370 73 5f 75 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c  s_unregister_all
21380 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
21390 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
213a0 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
213b0 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
213c0 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
213d0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
213e0 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
213f0 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
21400 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
21410 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
21420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21430 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
21440 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
21450 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
21460 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
21470 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ments */.){.  in
21480 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
21490 69 3c 41 72 72 61 79 53 69 7a 65 28 61 70 56 66  i<ArraySize(apVf
214a0 73 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 70  s); i++){.    ap
214b0 56 66 73 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33  Vfs[i] = sqlite3
214c0 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20  _vfs_find(0);.  
214d0 20 20 69 66 28 20 61 70 56 66 73 5b 69 5d 3d 3d    if( apVfs[i]==
214e0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73  0 ) break;.    s
214f0 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67  qlite3_vfs_unreg
21500 69 73 74 65 72 28 61 70 56 66 73 5b 69 5d 29 3b  ister(apVfs[i]);
21510 0a 20 20 7d 0a 20 20 6e 56 66 73 20 3d 20 69 3b  .  }.  nVfs = i;
21520 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
21530 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  ;.}./*.** tclcmd
21540 3a 20 20 20 76 66 73 5f 72 65 72 65 67 69 73 74  :   vfs_reregist
21550 65 72 5f 61 6c 6c 0a 2a 2a 0a 2a 2a 20 52 65 73  er_all.**.** Res
21560 74 6f 72 65 20 61 6c 6c 20 56 46 53 65 73 20 74  tore all VFSes t
21570 68 61 74 20 77 65 72 65 20 72 65 6d 6f 76 65 64  hat were removed
21580 20 75 73 69 6e 67 20 76 66 73 5f 75 6e 72 65 67   using vfs_unreg
21590 69 73 74 65 72 5f 61 6c 6c 0a 2a 2f 0a 73 74 61  ister_all.*/.sta
215a0 74 69 63 20 69 6e 74 20 76 66 73 5f 72 65 72 65  tic int vfs_rere
215b0 67 69 73 74 65 72 5f 61 6c 6c 28 0a 20 20 43 6c  gister_all(.  Cl
215c0 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
215d0 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
215e0 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
215f0 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
21600 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
21610 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
21620 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
21630 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
21640 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
21650 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
21660 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
21670 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
21680 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
21690 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
216a0 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
216b0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
216c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 66 73   for(i=0; i<nVfs
216d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
216e0 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
216f0 28 61 70 56 66 73 5b 69 5d 2c 20 69 3d 3d 30 29  (apVfs[i], i==0)
21700 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
21710 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  CL_OK;.}.../*.**
21720 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f   tclcmd:   file_
21730 63 6f 6e 74 72 6f 6c 5f 74 65 73 74 20 44 42 0a  control_test DB.
21740 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63  **.** This TCL c
21750 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20  ommand runs the 
21760 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
21770 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 61  trol interface a
21780 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73 20 63  nd.** verifies c
21790 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e  orrect operation
217a0 20 6f 66 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2f   of the same..*/
217b0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65  .static int file
217c0 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73 74 28 0a 20  _control_test(. 
217d0 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
217e0 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
217f0 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
21800 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
21810 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
21820 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
21830 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
21840 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
21850 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
21860 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
21870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
21880 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
21890 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
218a0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
218b0 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
218c0 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
218d0 41 72 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Arg = 0;.  sqlit
218e0 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
218f0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
21900 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
21910 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
21920 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
21930 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
21940 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
21950 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
21960 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 22 2c 20  [0], 0), " DB", 
21970 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
21980 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
21990 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
219a0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
219b0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
219c0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
219d0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
219e0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
219f0 6e 74 72 6f 6c 28 64 62 2c 20 30 2c 20 30 2c 20  ntrol(db, 0, 0, 
21a00 26 69 41 72 67 29 3b 0a 20 20 61 73 73 65 72 74  &iArg);.  assert
21a10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54  ( rc==SQLITE_NOT
21a20 46 4f 55 4e 44 20 29 3b 0a 20 20 72 63 20 3d 20  FOUND );.  rc = 
21a30 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
21a40 74 72 6f 6c 28 64 62 2c 20 22 6e 6f 74 61 64 61  trol(db, "notada
21a50 74 61 62 61 73 65 22 2c 20 53 51 4c 49 54 45 5f  tabase", SQLITE_
21a60 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 2c  FCNTL_LOCKSTATE,
21a70 20 26 69 41 72 67 29 3b 0a 20 20 61 73 73 65 72   &iArg);.  asser
21a80 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52  t( rc==SQLITE_ER
21a90 52 4f 52 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ROR );.  rc = sq
21aa0 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
21ab0 6f 6c 28 64 62 2c 20 22 6d 61 69 6e 22 2c 20 2d  ol(db, "main", -
21ac0 31 2c 20 26 69 41 72 67 29 3b 0a 20 20 61 73 73  1, &iArg);.  ass
21ad0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
21ae0 4e 4f 54 46 4f 55 4e 44 20 29 3b 0a 20 20 72 63  NOTFOUND );.  rc
21af0 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
21b00 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 74 65 6d  control(db, "tem
21b10 70 22 2c 20 2d 31 2c 20 26 69 41 72 67 29 3b 0a  p", -1, &iArg);.
21b20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
21b30 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 7c 7c  LITE_NOTFOUND ||
21b40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f   rc==SQLITE_ERRO
21b50 52 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54  R );..  return T
21b60 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  CL_OK;.}.../*.**
21b70 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f   tclcmd:   file_
21b80 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72 72 6e  control_lasterrn
21b90 6f 5f 74 65 73 74 20 44 42 0a 2a 2a 0a 2a 2a 20  o_test DB.**.** 
21ba0 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  This TCL command
21bb0 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65   runs the sqlite
21bc0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69  3_file_control i
21bd0 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20  nterface and.** 
21be0 76 65 72 69 66 69 65 73 20 63 6f 72 72 65 63 74  verifies correct
21bf0 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   operation of th
21c00 65 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52  e SQLITE_LAST_ER
21c10 52 4e 4f 20 76 65 72 62 2e 0a 2a 2f 0a 73 74 61  RNO verb..*/.sta
21c20 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e  tic int file_con
21c30 74 72 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f 5f 74  trol_lasterrno_t
21c40 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  est(.  ClientDat
21c50 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
21c60 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
21c70 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
21c80 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
21c90 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
21ca0 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
21cb0 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
21cc0 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
21cd0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
21ce0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
21cf0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
21d00 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
21d10 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
21d20 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
21d30 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
21d40 20 69 6e 74 20 69 41 72 67 20 3d 20 30 3b 0a 20   int iArg = 0;. 
21d50 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
21d60 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
21d70 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
21d80 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
21d90 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
21da0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
21db0 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
21dc0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
21dd0 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
21de0 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
21df0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
21e00 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
21e10 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
21e20 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
21e30 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20  v[1]), &db) ){. 
21e40 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
21e50 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ROR;.  }.  rc = 
21e60 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
21e70 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53  trol(db, NULL, S
21e80 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f  QLITE_LAST_ERRNO
21e90 2c 20 26 69 41 72 67 29 3b 0a 20 20 69 66 28 20  , &iArg);.  if( 
21ea0 72 63 20 29 7b 20 0a 20 20 20 20 54 63 6c 5f 53  rc ){ .    Tcl_S
21eb0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
21ec0 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
21ed0 6a 28 72 63 29 29 3b 20 0a 20 20 20 20 72 65 74  j(rc)); .    ret
21ee0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 20 0a  urn TCL_ERROR; .
21ef0 20 20 7d 0a 20 20 69 66 28 20 69 41 72 67 21 3d    }.  if( iArg!=
21f00 30 20 29 20 7b 0a 20 20 20 20 54 63 6c 5f 41 70  0 ) {.    Tcl_Ap
21f10 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
21f20 70 2c 20 22 55 6e 65 78 70 65 63 74 65 64 20 6e  p, "Unexpected n
21f30 6f 6e 2d 7a 65 72 6f 20 65 72 72 6e 6f 3a 20 22  on-zero errno: "
21f40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21f50 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
21f60 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f  ringFromObj(Tcl_
21f70 4e 65 77 49 6e 74 4f 62 6a 28 69 41 72 67 29 2c  NewIntObj(iArg),
21f80 20 30 29 2c 20 22 20 22 2c 20 30 29 3b 0a 20 20   0), " ", 0);.  
21f90 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
21fa0 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
21fb0 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a   TCL_OK;  .}../*
21fc0 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69  .** tclcmd:   fi
21fd0 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b  le_control_chunk
21fe0 73 69 7a 65 5f 74 65 73 74 20 44 42 20 44 42 4e  size_test DB DBN
21ff0 41 4d 45 20 53 49 5a 45 0a 2a 2a 0a 2a 2a 20 54  AME SIZE.**.** T
22000 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20  his TCL command 
22010 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33  runs the sqlite3
22020 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e  _file_control in
22030 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76  terface and.** v
22040 65 72 69 66 69 65 73 20 63 6f 72 72 65 63 74 20  erifies correct 
22050 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  operation of the
22060 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b   SQLITE_GET_LOCK
22070 50 52 4f 58 59 46 49 4c 45 20 61 6e 64 0a 2a 2a  PROXYFILE and.**
22080 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b   SQLITE_SET_LOCK
22090 50 52 4f 58 59 46 49 4c 45 20 76 65 72 62 73 2e  PROXYFILE verbs.
220a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
220b0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e  ile_control_chun
220c0 6b 73 69 7a 65 5f 74 65 73 74 28 0a 20 20 43 6c  ksize_test(.  Cl
220d0 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
220e0 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
220f0 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
22100 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
22110 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
22120 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
22130 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
22140 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
22150 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
22160 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
22170 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
22180 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
22190 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
221a0 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
221b0 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
221c0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a  */.){.  int nSiz
221d0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
221e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63          /* New c
221f0 68 75 6e 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 63  hunk size */.  c
22200 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20  har *zDb;       
22210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22220 2a 20 44 62 20 6e 61 6d 65 20 28 22 6d 61 69 6e  * Db name ("main
22230 22 2c 20 22 74 65 6d 70 22 20 65 74 63 2e 29 20  ", "temp" etc.) 
22240 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
22250 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22260 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
22270 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
22280 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
22290 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
222a0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29 20 72  file_control() r
222b0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
222c0 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
222d0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
222e0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
222f0 6f 62 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d 45  objv, "DB DBNAME
22300 20 53 49 5a 45 22 29 3b 0a 20 20 20 20 72 65 74   SIZE");.    ret
22310 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
22320 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
22330 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
22340 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
22350 5b 31 5d 29 2c 20 26 64 62 29 20 0a 20 20 20 7c  [1]), &db) .   |
22360 7c 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  | Tcl_GetIntFrom
22370 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
22380 5b 33 5d 2c 20 26 6e 53 69 7a 65 29 0a 20 20 29  [3], &nSize).  )
22390 7b 0a 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  {.   return TCL_
223a0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62  ERROR;.  }.  zDb
223b0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
223c0 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28  (objv[2]);.  if(
223d0 20 7a 44 62 5b 30 5d 3d 3d 27 5c 30 27 20 29 20   zDb[0]=='\0' ) 
223e0 7a 44 62 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 72  zDb = NULL;..  r
223f0 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
22400 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62  _control(db, zDb
22410 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43  , SQLITE_FCNTL_C
22420 48 55 4e 4b 5f 53 49 5a 45 2c 20 28 76 6f 69 64  HUNK_SIZE, (void
22430 20 2a 29 26 6e 53 69 7a 65 29 3b 0a 20 20 69 66   *)&nSize);.  if
22440 28 20 72 63 20 29 7b 0a 20 20 20 20 54 63 6c 5f  ( rc ){.    Tcl_
22450 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
22460 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
22470 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  3ErrName(rc), TC
22480 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72  L_STATIC);.    r
22490 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
224a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
224b0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  L_OK;.}../*.** t
224c0 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f  clcmd:   file_co
224d0 6e 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74  ntrol_sizehint_t
224e0 65 73 74 20 44 42 20 44 42 4e 41 4d 45 20 53 49  est DB DBNAME SI
224f0 5a 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43  ZE.**.** This TC
22500 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74  L command runs t
22510 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  he sqlite3_file_
22520 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63  control interfac
22530 65 20 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49 54  e .** with SQLIT
22540 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  E_FCNTL_SIZE_HIN
22550 54 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  T.*/.static int 
22560 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69 7a  file_control_siz
22570 65 68 69 6e 74 5f 74 65 73 74 28 0a 20 20 43 6c  ehint_test(.  Cl
22580 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
22590 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
225a0 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
225b0 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
225c0 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
225d0 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
225e0 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
225f0 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
22600 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
22610 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
22620 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
22630 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
22640 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
22650 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
22660 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
22670 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 57 69 64 65  */.){.  Tcl_Wide
22680 49 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20 20 20  Int nSize;      
22690 20 20 20 20 20 20 20 20 2f 2a 20 48 69 6e 74 65          /* Hinte
226a0 64 20 73 69 7a 65 20 2a 2f 0a 20 20 63 68 61 72  d size */.  char
226b0 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20   *zDb;          
226c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
226d0 62 20 6e 61 6d 65 20 28 22 6d 61 69 6e 22 2c 20  b name ("main", 
226e0 22 74 65 6d 70 22 20 65 74 63 2e 29 20 2a 2f 0a  "temp" etc.) */.
226f0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
22700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22710 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61    /* Database ha
22720 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ndle */.  int rc
22730 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c            /* fil
22750 65 5f 63 6f 6e 74 72 6f 6c 28 29 20 72 65 74 75  e_control() retu
22760 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66  rn code */..  if
22770 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
22780 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
22790 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
227a0 76 2c 20 22 44 42 20 44 42 4e 41 4d 45 20 53 49  v, "DB DBNAME SI
227b0 5a 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ZE");.    return
227c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
227d0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
227e0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
227f0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
22800 29 2c 20 26 64 62 29 20 0a 20 20 20 7c 7c 20 54  ), &db) .   || T
22810 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f  cl_GetWideIntFro
22820 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
22830 76 5b 33 5d 2c 20 26 6e 53 69 7a 65 29 0a 20 20  v[3], &nSize).  
22840 29 7b 0a 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ){.   return TCL
22850 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44  _ERROR;.  }.  zD
22860 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  b = Tcl_GetStrin
22870 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66  g(objv[2]);.  if
22880 28 20 7a 44 62 5b 30 5d 3d 3d 27 5c 30 27 20 29  ( zDb[0]=='\0' )
22890 20 7a 44 62 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20   zDb = NULL;..  
228a0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
228b0 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44  e_control(db, zD
228c0 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  b, SQLITE_FCNTL_
228d0 53 49 5a 45 5f 48 49 4e 54 2c 20 28 76 6f 69 64  SIZE_HINT, (void
228e0 20 2a 29 26 6e 53 69 7a 65 29 3b 0a 20 20 69 66   *)&nSize);.  if
228f0 28 20 72 63 20 29 7b 0a 20 20 20 20 54 63 6c 5f  ( rc ){.    Tcl_
22900 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
22910 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
22920 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  3ErrName(rc), TC
22930 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72  L_STATIC);.    r
22940 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
22950 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
22960 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  L_OK;.}../*.** t
22970 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f  clcmd:   file_co
22980 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f  ntrol_lockproxy_
22990 74 65 73 74 20 44 42 20 50 57 44 0a 2a 2a 0a 2a  test DB PWD.**.*
229a0 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61  * This TCL comma
229b0 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69  nd runs the sqli
229c0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
229d0 20 69 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a   interface and.*
229e0 2a 20 76 65 72 69 66 69 65 73 20 63 6f 72 72 65  * verifies corre
229f0 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  ct operation of 
22a00 74 68 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c  the SQLITE_GET_L
22a10 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 61 6e 64  OCKPROXYFILE and
22a20 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  .** SQLITE_SET_L
22a30 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 76 65 72  OCKPROXYFILE ver
22a40 62 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  bs..*/.static in
22a50 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c  t file_control_l
22a60 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74 28 0a 20  ockproxy_test(. 
22a70 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
22a80 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
22a90 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
22aa0 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
22ab0 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
22ac0 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
22ad0 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
22ae0 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
22af0 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
22b00 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
22b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
22b20 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
22b30 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
22b40 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
22b50 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
22b60 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
22b70 65 33 20 2a 64 62 3b 0a 20 20 0a 20 20 69 66 28  e3 *db;.  .  if(
22b80 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
22b90 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
22ba0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
22bb0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
22bc0 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20  e \"",.         
22bd0 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
22be0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
22bf0 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
22c00 44 42 20 50 57 44 22 2c 20 30 29 3b 0a 20 20 20  DB PWD", 0);.   
22c10 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
22c20 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
22c30 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
22c40 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
22c50 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
22c60 7b 0a 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  {.   return TCL_
22c70 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 23 69  ERROR;.  }.  .#i
22c80 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
22c90 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
22ca0 5f 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65  _STYLE).#  if de
22cb0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
22cc0 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c  .#    define SQL
22cd0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
22ce0 4e 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c  NG_STYLE 1.#  el
22cf0 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53  se.#    define S
22d00 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
22d10 4b 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20  KING_STYLE 0.#  
22d20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66  endif.#endif.#if
22d30 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
22d40 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
22d50 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
22d60 5f 29 0a 20 20 7b 0a 20 20 20 20 63 68 61 72 20  _).  {.    char 
22d70 2a 74 65 73 74 50 61 74 68 3b 0a 20 20 20 20 69  *testPath;.    i
22d80 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 6e  nt rc;.    int n
22d90 50 77 64 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  Pwd;.    const c
22da0 68 61 72 20 2a 7a 50 77 64 3b 0a 20 20 20 20 63  har *zPwd;.    c
22db0 68 61 72 20 70 72 6f 78 79 50 61 74 68 5b 34 30  har proxyPath[40
22dc0 30 5d 3b 0a 20 20 20 20 0a 20 20 20 20 7a 50 77  0];.    .    zPw
22dd0 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  d = Tcl_GetStrin
22de0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
22df0 2c 20 26 6e 50 77 64 29 3b 0a 20 20 20 20 69 66  , &nPwd);.    if
22e00 28 20 73 69 7a 65 6f 66 28 70 72 6f 78 79 50 61  ( sizeof(proxyPa
22e10 74 68 29 3c 6e 50 77 64 2b 32 30 20 29 7b 0a 20  th)<nPwd+20 ){. 
22e20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
22e30 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 50  esult(interp, "P
22e40 57 44 20 74 6f 6f 20 62 69 67 22 2c 20 28 76 6f  WD too big", (vo
22e50 69 64 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65  id*)0);.      re
22e60 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
22e70 20 20 20 20 7d 0a 20 20 20 20 73 70 72 69 6e 74      }.    sprint
22e80 66 28 70 72 6f 78 79 50 61 74 68 2c 20 22 25 73  f(proxyPath, "%s
22e90 2f 74 65 73 74 2e 70 72 6f 78 79 22 2c 20 7a 50  /test.proxy", zP
22ea0 77 64 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  wd);.    rc = sq
22eb0 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
22ec0 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c  ol(db, NULL, SQL
22ed0 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_SET_LOCKPROX
22ee0 59 46 49 4c 45 2c 20 70 72 6f 78 79 50 61 74 68  YFILE, proxyPath
22ef0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
22f00 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  .      Tcl_SetOb
22f10 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
22f20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63  Tcl_NewIntObj(rc
22f30 29 29 3b 20 0a 20 20 20 20 20 20 72 65 74 75 72  )); .      retur
22f40 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
22f50 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
22f60 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
22f70 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54  (db, NULL, SQLIT
22f80 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_GET_LOCKPROXYF
22f90 49 4c 45 2c 20 26 74 65 73 74 50 61 74 68 29 3b  ILE, &testPath);
22fa0 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70  .    if( strncmp
22fb0 28 70 72 6f 78 79 50 61 74 68 2c 74 65 73 74 50  (proxyPath,testP
22fc0 61 74 68 2c 31 31 29 20 29 7b 0a 20 20 20 20 20  ath,11) ){.     
22fd0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
22fe0 74 28 69 6e 74 65 72 70 2c 20 22 4c 6f 63 6b 20  t(interp, "Lock 
22ff0 70 72 6f 78 79 20 66 69 6c 65 20 64 69 64 20 6e  proxy file did n
23000 6f 74 20 6d 61 74 63 68 20 74 68 65 20 22 0a 20  ot match the ". 
23010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 70                "p
23030 72 65 76 69 6f 75 73 6c 79 20 61 73 73 69 67 6e  reviously assign
23040 65 64 20 76 61 6c 75 65 22 2c 20 30 29 3b 0a 20  ed value", 0);. 
23050 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
23060 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
23070 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
23080 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
23090 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
230a0 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20  wIntObj(rc));.  
230b0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
230c0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
230d0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
230e0 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55  e_control(db, NU
230f0 4c 4c 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  LL, SQLITE_SET_L
23100 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 70 72  OCKPROXYFILE, pr
23110 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 69 66  oxyPath);.    if
23120 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63  ( rc ){.      Tc
23130 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
23140 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
23150 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20 20 20 20  tObj(rc));.     
23160 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
23170 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  R;.    }.  }.#en
23180 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  dif.  return TCL
23190 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _OK;  .}../*.** 
231a0 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63  tclcmd:   file_c
231b0 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 61 76 5f  ontrol_win32_av_
231c0 72 65 74 72 79 20 44 42 20 20 4e 52 45 54 52 59  retry DB  NRETRY
231d0 20 20 44 45 4c 41 59 0a 2a 2a 0a 2a 2a 20 54 68    DELAY.**.** Th
231e0 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72  is TCL command r
231f0 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f  uns the sqlite3_
23200 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74  file_control int
23210 65 72 66 61 63 65 20 77 69 74 68 0a 2a 2a 20 74  erface with.** t
23220 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  he SQLITE_FCNTL_
23230 57 49 4e 33 32 5f 41 56 5f 52 45 54 52 59 20 6f  WIN32_AV_RETRY o
23240 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  pcode..*/.static
23250 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f   int file_contro
23260 6c 5f 77 69 6e 33 32 5f 61 76 5f 72 65 74 72 79  l_win32_av_retry
23270 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
23280 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
23290 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
232a0 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
232b0 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
232c0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
232d0 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
232e0 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
232f0 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
23300 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
23310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23320 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
23330 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
23340 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
23350 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
23360 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
23370 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
23380 20 72 63 3b 0a 20 20 69 6e 74 20 61 5b 32 5d 3b   rc;.  int a[2];
23390 0a 20 20 63 68 61 72 20 7a 5b 31 30 30 5d 3b 0a  .  char z[100];.
233a0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29  .  if( objc!=4 )
233b0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
233c0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
233d0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
233e0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
233f0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
23400 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
23410 5d 2c 20 30 29 2c 20 22 20 44 42 20 4e 52 45 54  ], 0), " DB NRET
23420 52 59 20 44 45 4c 41 59 22 2c 20 30 29 3b 0a 20  RY DELAY", 0);. 
23430 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
23440 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
23450 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
23460 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
23470 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
23480 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
23490 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
234a0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
234b0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
234c0 6a 76 5b 32 5d 2c 20 26 61 5b 30 5d 29 20 29 20  jv[2], &a[0]) ) 
234d0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
234e0 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
234f0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
23500 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 61 5b 31 5d  , objv[3], &a[1]
23510 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
23520 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
23530 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
23540 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49  l(db, NULL, SQLI
23550 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 41  TE_FCNTL_WIN32_A
23560 56 5f 52 45 54 52 59 2c 20 28 76 6f 69 64 2a 29  V_RETRY, (void*)
23570 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  a);.  sqlite3_sn
23580 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29  printf(sizeof(z)
23590 2c 20 7a 2c 20 22 25 64 20 25 64 20 25 64 22 2c  , z, "%d %d %d",
235a0 20 72 63 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 29   rc, a[0], a[1])
235b0 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
235c0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20  sult(interp, z, 
235d0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 72 65 74  (char*)0);.  ret
235e0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a  urn TCL_OK;  .}.
235f0 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
23600 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65   file_control_pe
23610 72 73 69 73 74 5f 77 61 6c 20 44 42 20 50 45 52  rsist_wal DB PER
23620 53 49 53 54 2d 46 4c 41 47 0a 2a 2a 0a 2a 2a 20  SIST-FLAG.**.** 
23630 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  This TCL command
23640 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65   runs the sqlite
23650 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69  3_file_control i
23660 6e 74 65 72 66 61 63 65 20 77 69 74 68 0a 2a 2a  nterface with.**
23670 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54   the SQLITE_FCNT
23680 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 6f 70  L_PERSIST_WAL op
23690 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
236a0 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  int file_control
236b0 5f 70 65 72 73 69 73 74 5f 77 61 6c 28 0a 20 20  _persist_wal(.  
236c0 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
236d0 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
236e0 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
236f0 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
23700 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
23710 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
23720 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
23730 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
23740 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
23750 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
23760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
23770 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
23780 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
23790 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
237a0 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
237b0 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
237c0 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
237d0 0a 20 20 69 6e 74 20 62 50 65 72 73 69 73 74 3b  .  int bPersist;
237e0 0a 20 20 63 68 61 72 20 7a 5b 31 30 30 5d 3b 0a  .  char z[100];.
237f0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
23800 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
23810 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
23820 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
23830 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
23840 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
23850 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
23860 5d 2c 20 30 29 2c 20 22 20 44 42 20 46 4c 41 47  ], 0), " DB FLAG
23870 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
23880 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
23890 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
238a0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
238b0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
238c0 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20  ]), &db) ){.    
238d0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
238e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
238f0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
23900 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
23910 62 50 65 72 73 69 73 74 29 20 29 20 72 65 74 75  bPersist) ) retu
23920 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
23930 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
23940 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55  e_control(db, NU
23950 4c 4c 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  LL, SQLITE_FCNTL
23960 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28 76  _PERSIST_WAL, (v
23970 6f 69 64 2a 29 26 62 50 65 72 73 69 73 74 29 3b  oid*)&bPersist);
23980 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
23990 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a  ntf(sizeof(z), z
239a0 2c 20 22 25 64 20 25 64 22 2c 20 72 63 2c 20 62  , "%d %d", rc, b
239b0 50 65 72 73 69 73 74 29 3b 0a 20 20 54 63 6c 5f  Persist);.  Tcl_
239c0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
239d0 65 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30  erp, z, (char*)0
239e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
239f0 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  OK;  .}../*.** t
23a00 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f  clcmd:   file_co
23a10 6e 74 72 6f 6c 5f 70 6f 77 65 72 73 61 66 65 5f  ntrol_powersafe_
23a20 6f 76 65 72 77 72 69 74 65 20 44 42 20 50 53 4f  overwrite DB PSO
23a30 57 2d 46 4c 41 47 0a 2a 2a 0a 2a 2a 20 54 68 69  W-FLAG.**.** Thi
23a40 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75  s TCL command ru
23a50 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66  ns the sqlite3_f
23a60 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65  ile_control inte
23a70 72 66 61 63 65 20 77 69 74 68 0a 2a 2a 20 74 68  rface with.** th
23a80 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  e SQLITE_FCNTL_P
23a90 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
23aa0 54 45 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74  TE opcode..*/.st
23ab0 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f  atic int file_co
23ac0 6e 74 72 6f 6c 5f 70 6f 77 65 72 73 61 66 65 5f  ntrol_powersafe_
23ad0 6f 76 65 72 77 72 69 74 65 28 0a 20 20 43 6c 69  overwrite(.  Cli
23ae0 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
23af0 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
23b00 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
23b10 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
23b20 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
23b30 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
23b40 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
23b50 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
23b60 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
23b70 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
23b80 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
23b90 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
23ba0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
23bb0 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
23bc0 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
23bd0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
23be0 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
23bf0 69 6e 74 20 62 3b 0a 20 20 63 68 61 72 20 7a 5b  int b;.  char z[
23c00 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  100];..  if( obj
23c10 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
23c20 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
23c30 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
23c40 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
23c50 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
23c60 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
23c70 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44  objv[0], 0), " D
23c80 42 20 46 4c 41 47 22 2c 20 30 29 3b 0a 20 20 20  B FLAG", 0);.   
23c90 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
23ca0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
23cb0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
23cc0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
23cd0 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
23ce0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
23cf0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
23d00 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
23d10 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
23d20 5b 32 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72  [2], &b) ) retur
23d30 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
23d40 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
23d50 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 4e 55 4c 4c  _control(db,NULL
23d60 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f  ,SQLITE_FCNTL_PO
23d70 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
23d80 45 2c 28 76 6f 69 64 2a 29 26 62 29 3b 0a 20 20  E,(void*)&b);.  
23d90 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
23da0 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22  (sizeof(z), z, "
23db0 25 64 20 25 64 22 2c 20 72 63 2c 20 62 29 3b 0a  %d %d", rc, b);.
23dc0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
23dd0 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 28 63  lt(interp, z, (c
23de0 68 61 72 2a 29 30 29 3b 0a 20 20 72 65 74 75 72  har*)0);.  retur
23df0 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 0a  n TCL_OK;  .}...
23e00 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
23e10 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73  file_control_vfs
23e20 6e 61 6d 65 20 44 42 20 3f 41 55 58 44 42 3f 0a  name DB ?AUXDB?.
23e30 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  **.** Return a s
23e40 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72  tring that descr
23e50 69 62 65 73 20 74 68 65 20 73 74 61 63 6b 20 6f  ibes the stack o
23e60 66 20 56 46 53 65 73 2e 0a 2a 2f 0a 73 74 61 74  f VFSes..*/.stat
23e70 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74  ic int file_cont
23e80 72 6f 6c 5f 76 66 73 6e 61 6d 65 28 0a 20 20 43  rol_vfsname(.  C
23e90 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
23ea0 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
23eb0 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
23ec0 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
23ed0 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
23ee0 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
23ef0 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
23f00 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
23f10 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
23f20 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
23f30 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
23f40 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
23f50 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
23f60 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
23f70 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
23f80 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
23f90 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *db;.  const ch
23fa0 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 22 6d  ar *zDbName = "m
23fb0 61 69 6e 22 3b 0a 20 20 63 68 61 72 20 2a 7a 56  ain";.  char *zV
23fc0 66 73 4e 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69  fsName = 0;..  i
23fd0 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62  f( objc!=2 && ob
23fe0 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
23ff0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
24000 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
24010 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
24020 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
24030 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
24040 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
24050 44 42 20 3f 41 55 58 44 42 3f 22 2c 20 30 29 3b  DB ?AUXDB?", 0);
24060 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
24070 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
24080 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
24090 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
240a0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
240b0 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
240c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
240d0 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b    if( objc==3 ){
240e0 0a 20 20 20 20 7a 44 62 4e 61 6d 65 20 3d 20 54  .    zDbName = T
240f0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
24100 76 5b 32 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  v[2]);.  }.  sql
24110 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
24120 6c 28 64 62 2c 20 7a 44 62 4e 61 6d 65 2c 20 53  l(db, zDbName, S
24130 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e  QLITE_FCNTL_VFSN
24140 41 4d 45 2c 28 76 6f 69 64 2a 29 26 7a 56 66 73  AME,(void*)&zVfs
24150 4e 61 6d 65 29 3b 0a 20 20 54 63 6c 5f 41 70 70  Name);.  Tcl_App
24160 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
24170 2c 20 7a 56 66 73 4e 61 6d 65 2c 20 28 63 68 61  , zVfsName, (cha
24180 72 2a 29 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  r*)0);.  sqlite3
24190 5f 66 72 65 65 28 7a 56 66 73 4e 61 6d 65 29 3b  _free(zVfsName);
241a0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
241b0 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  ;  .}../*.** tcl
241c0 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74  cmd:   file_cont
241d0 72 6f 6c 5f 74 65 6d 70 66 69 6c 65 6e 61 6d 65  rol_tempfilename
241e0 20 44 42 20 3f 41 55 58 44 42 3f 0a 2a 2a 0a 2a   DB ?AUXDB?.**.*
241f0 2a 20 52 65 74 75 72 6e 20 61 20 73 74 72 69 6e  * Return a strin
24200 67 20 74 68 61 74 20 69 73 20 61 20 74 65 6d 70  g that is a temp
24210 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d 65 0a 2a  orary filename.*
24220 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
24230 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 6d 70 66 69  e_control_tempfi
24240 6c 65 6e 61 6d 65 28 0a 20 20 43 6c 69 65 6e 74  lename(.  Client
24250 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
24260 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
24270 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
24280 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
24290 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
242a0 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
242b0 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
242c0 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
242d0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
242e0 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
242f0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
24300 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
24310 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
24320 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
24330 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
24340 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
24350 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
24360 44 62 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b  DbName = "main";
24370 0a 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20  .  char *zTName 
24380 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  = 0;..  if( objc
24390 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29  !=2 && objc!=3 )
243a0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
243b0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
243c0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
243d0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
243e0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
243f0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
24400 5d 2c 20 30 29 2c 20 22 20 44 42 20 3f 41 55 58  ], 0), " DB ?AUX
24410 44 42 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  DB?", 0);.    re
24420 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
24430 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
24440 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
24450 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
24460 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20  v[1]), &db) ){. 
24470 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
24480 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  ROR;.  }.  if( o
24490 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 7a 44  bjc==3 ){.    zD
244a0 62 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  bName = Tcl_GetS
244b0 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
244c0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69    }.  sqlite3_fi
244d0 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a  le_control(db, z
244e0 44 62 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46  DbName, SQLITE_F
244f0 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d  CNTL_TEMPFILENAM
24500 45 2c 20 28 76 6f 69 64 2a 29 26 7a 54 4e 61 6d  E, (void*)&zTNam
24510 65 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  e);.  Tcl_Append
24520 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
24530 54 4e 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29  TName, (char*)0)
24540 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
24550 28 7a 54 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  (zTName);.  retu
24560 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a  rn TCL_OK;  .}..
24570 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
24580 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 6c 69 73   sqlite3_vfs_lis
24590 74 0a 2a 2a 0a 2a 2a 20 20 20 52 65 74 75 72 6e  t.**.**   Return
245a0 20 61 20 74 63 6c 20 6c 69 73 74 20 63 6f 6e 74   a tcl list cont
245b0 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 73  aining the names
245c0 20 6f 66 20 61 6c 6c 20 72 65 67 69 73 74 65 72   of all register
245d0 65 64 20 76 66 73 27 73 2e 0a 2a 2f 0a 73 74 61  ed vfs's..*/.sta
245e0 74 69 63 20 69 6e 74 20 76 66 73 5f 6c 69 73 74  tic int vfs_list
245f0 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
24600 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
24610 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
24620 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
24630 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
24640 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
24650 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
24660 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
24670 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
24680 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
24690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
246a0 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
246b0 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
246c0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
246d0 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
246e0 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
246f0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b  lite3_vfs *pVfs;
24700 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74  .  Tcl_Obj *pRet
24710 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b   = Tcl_NewObj();
24720 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29  .  if( objc!=1 )
24730 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
24740 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
24750 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20  , objv, "");.   
24760 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
24770 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 56 66  R;.  }.  for(pVf
24780 73 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  s=sqlite3_vfs_fi
24790 6e 64 28 30 29 3b 20 70 56 66 73 3b 20 70 56 66  nd(0); pVfs; pVf
247a0 73 3d 70 56 66 73 2d 3e 70 4e 65 78 74 29 7b 0a  s=pVfs->pNext){.
247b0 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
247c0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
247d0 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  erp, pRet, Tcl_N
247e0 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 56 66 73  ewStringObj(pVfs
247f0 2d 3e 7a 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20  ->zName, -1));. 
24800 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52   }.  Tcl_SetObjR
24810 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52  esult(interp, pR
24820 65 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  et);.  return TC
24830 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  L_OK;  .}../*.**
24840 20 74 63 6c 63 6d 64 3a 20 20 20 73 71 6c 69 74   tclcmd:   sqlit
24850 65 33 5f 6c 69 6d 69 74 20 44 42 20 49 44 20 56  e3_limit DB ID V
24860 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ALUE.**.** This 
24870 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73  TCL command runs
24880 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6c 69 6d   the sqlite3_lim
24890 69 74 20 69 6e 74 65 72 66 61 63 65 20 61 6e 64  it interface and
248a0 0a 2a 2a 20 76 65 72 69 66 69 65 73 20 63 6f 72  .** verifies cor
248b0 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  rect operation o
248c0 66 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a 73  f the same..*/.s
248d0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6c  tatic int test_l
248e0 69 6d 69 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  imit(.  ClientDa
248f0 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
24900 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
24910 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
24920 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
24930 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
24940 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
24950 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
24960 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
24970 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
24980 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
24990 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
249a0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
249b0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
249c0 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
249d0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
249e0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
249f0 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 61 74 69   int rc;.  stati
24a00 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b  c const struct {
24a10 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d  .     char *zNam
24a20 65 3b 0a 20 20 20 20 20 69 6e 74 20 69 64 3b 0a  e;.     int id;.
24a30 20 20 7d 20 61 49 64 5b 5d 20 3d 20 7b 0a 20 20    } aId[] = {.  
24a40 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49    { "SQLITE_LIMI
24a50 54 5f 4c 45 4e 47 54 48 22 2c 20 20 20 20 20 20  T_LENGTH",      
24a60 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
24a70 49 4d 49 54 5f 4c 45 4e 47 54 48 20 20 20 20 20  IMIT_LENGTH     
24a80 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
24a90 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54   { "SQLITE_LIMIT
24aa0 5f 53 51 4c 5f 4c 45 4e 47 54 48 22 2c 20 20 20  _SQL_LENGTH",   
24ab0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
24ac0 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 20  MIT_SQL_LENGTH  
24ad0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
24ae0 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  { "SQLITE_LIMIT_
24af0 43 4f 4c 55 4d 4e 22 2c 20 20 20 20 20 20 20 20  COLUMN",        
24b00 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
24b10 49 54 5f 43 4f 4c 55 4d 4e 20 20 20 20 20 20 20  IT_COLUMN       
24b20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
24b30 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45   "SQLITE_LIMIT_E
24b40 58 50 52 5f 44 45 50 54 48 22 2c 20 20 20 20 20  XPR_DEPTH",     
24b50 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
24b60 54 5f 45 58 50 52 5f 44 45 50 54 48 20 20 20 20  T_EXPR_DEPTH    
24b70 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
24b80 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  "SQLITE_LIMIT_CO
24b90 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 22 2c 20  MPOUND_SELECT", 
24ba0 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
24bb0 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
24bc0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
24bd0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42  SQLITE_LIMIT_VDB
24be0 45 5f 4f 50 22 2c 20 20 20 20 20 20 20 20 20 20  E_OP",          
24bf0 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
24c00 56 44 42 45 5f 4f 50 20 20 20 20 20 20 20 20 20  VDBE_OP         
24c10 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53       },.    { "S
24c20 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43  QLITE_LIMIT_FUNC
24c30 54 49 4f 4e 5f 41 52 47 22 2c 20 20 20 20 20 20  TION_ARG",      
24c40 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46    SQLITE_LIMIT_F
24c50 55 4e 43 54 49 4f 4e 5f 41 52 47 20 20 20 20 20  UNCTION_ARG     
24c60 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
24c70 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43  LITE_LIMIT_ATTAC
24c80 48 45 44 22 2c 20 20 20 20 20 20 20 20 20 20 20  HED",           
24c90 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54   SQLITE_LIMIT_AT
24ca0 54 41 43 48 45 44 20 20 20 20 20 20 20 20 20 20  TACHED          
24cb0 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c     },.    { "SQL
24cc0 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50  ITE_LIMIT_LIKE_P
24cd0 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 22 2c 20  ATTERN_LENGTH", 
24ce0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b  SQLITE_LIMIT_LIK
24cf0 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
24d00 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
24d10 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
24d20 45 5f 4e 55 4d 42 45 52 22 2c 20 20 20 20 20 53  E_NUMBER",     S
24d30 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
24d40 41 42 4c 45 5f 4e 55 4d 42 45 52 20 20 20 20 20  ABLE_NUMBER     
24d50 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
24d60 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f  E_LIMIT_TRIGGER_
24d70 44 45 50 54 48 22 2c 20 20 20 20 20 20 20 53 51  DEPTH",       SQ
24d80 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47  LITE_LIMIT_TRIGG
24d90 45 52 5f 44 45 50 54 48 20 20 20 20 20 20 20 20  ER_DEPTH        
24da0 7d 2c 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 4f  },.    .    /* O
24db0 75 74 20 6f 66 20 72 61 6e 67 65 20 74 65 73 74  ut of range test
24dc0 20 63 61 73 65 73 20 2a 2f 0a 20 20 20 20 7b 20   cases */.    { 
24dd0 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 4f  "SQLITE_LIMIT_TO
24de0 4f 53 4d 41 4c 4c 22 2c 20 20 20 20 20 20 20 20  OSMALL",        
24df0 20 20 20 20 2d 31 2c 20 20 20 20 20 20 20 20 20      -1,         
24e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e10 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
24e20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 4f 4f  SQLITE_LIMIT_TOO
24e30 42 49 47 22 2c 20 20 20 20 20 20 20 20 20 20 20  BIG",           
24e40 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
24e50 54 52 49 47 47 45 52 5f 44 45 50 54 48 2b 31 20  TRIGGER_DEPTH+1 
24e60 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69       },.  };.  i
24e70 6e 74 20 69 2c 20 69 64 3b 0a 20 20 69 6e 74 20  nt i, id;.  int 
24e80 76 61 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  val;.  const cha
24e90 72 20 2a 7a 49 64 3b 0a 0a 20 20 69 66 28 20 6f  r *zId;..  if( o
24ea0 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
24eb0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
24ec0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
24ed0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
24ee0 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
24ef0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
24f00 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
24f10 20 44 42 20 49 44 20 56 41 4c 55 45 22 2c 20 30   DB ID VALUE", 0
24f20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
24f30 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
24f40 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
24f50 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
24f60 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
24f70 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
24f80 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 49 64 20 3d  L_ERROR;.  zId =
24f90 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
24fa0 62 6a 76 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69  bjv[2]);.  for(i
24fb0 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 49 64  =0; i<sizeof(aId
24fc0 29 2f 73 69 7a 65 6f 66 28 61 49 64 5b 30 5d 29  )/sizeof(aId[0])
24fd0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
24fe0 73 74 72 63 6d 70 28 7a 49 64 2c 20 61 49 64 5b  strcmp(zId, aId[
24ff0 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
25000 20 20 20 20 20 20 69 64 20 3d 20 61 49 64 5b 69        id = aId[i
25010 5d 2e 69 64 3b 0a 20 20 20 20 20 20 62 72 65 61  ].id;.      brea
25020 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
25030 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28 61 49 64  f( i>=sizeof(aId
25040 29 2f 73 69 7a 65 6f 66 28 61 49 64 5b 30 5d 29  )/sizeof(aId[0])
25050 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
25060 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
25070 20 22 75 6e 6b 6e 6f 77 6e 20 6c 69 6d 69 74 20   "unknown limit 
25080 74 79 70 65 3a 20 22 2c 20 7a 49 64 2c 20 28 63  type: ", zId, (c
25090 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74  har*)0);.    ret
250a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
250b0 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
250c0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
250d0 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c  p, objv[3], &val
250e0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
250f0 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
25100 69 74 65 33 5f 6c 69 6d 69 74 28 64 62 2c 20 69  ite3_limit(db, i
25110 64 2c 20 76 61 6c 29 3b 0a 20 20 54 63 6c 5f 53  d, val);.  Tcl_S
25120 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
25130 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
25140 6a 28 72 63 29 29 3b 0a 20 20 72 65 74 75 72 6e  j(rc));.  return
25150 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a   TCL_OK;  .}../*
25160 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 61 76  .** tclcmd:  sav
25170 65 5f 70 72 6e 67 5f 73 74 61 74 65 0a 2a 2a 0a  e_prng_state.**.
25180 2a 2a 20 53 61 76 65 20 74 68 65 20 73 74 61 74  ** Save the stat
25190 65 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d  e of the pseudo-
251a0 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65  random number ge
251b0 6e 65 72 61 74 6f 72 2e 0a 2a 2a 20 41 74 20 74  nerator..** At t
251c0 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 76 65  he same time, ve
251d0 72 69 66 79 20 74 68 61 74 20 73 71 6c 69 74 65  rify that sqlite
251e0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 20 77  3_test_control w
251f0 6f 72 6b 73 20 65 76 65 6e 20 77 68 65 6e 0a 2a  orks even when.*
25200 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6e  * called with an
25210 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 6f 70   out-of-range op
25220 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
25230 69 6e 74 20 73 61 76 65 5f 70 72 6e 67 5f 73 74  int save_prng_st
25240 61 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  ate(.  ClientDat
25250 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
25260 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
25270 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
25280 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
25290 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
252a0 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
252b0 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
252c0 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
252d0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
252e0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
252f0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
25300 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
25310 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
25320 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
25330 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
25340 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
25350 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 39  3_test_control(9
25360 39 39 39 29 3b 0a 20 20 61 73 73 65 72 74 28 20  999);.  assert( 
25370 72 63 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20  rc==0 );.  rc = 
25380 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
25390 74 72 6f 6c 28 2d 31 29 3b 0a 20 20 61 73 73 65  trol(-1);.  asse
253a0 72 74 28 20 72 63 3d 3d 30 20 29 3b 0a 20 20 73  rt( rc==0 );.  s
253b0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
253c0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
253d0 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45 29 3b 0a  TRL_PRNG_SAVE);.
253e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
253f0 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  .}./*.** tclcmd:
25400 20 20 72 65 73 74 6f 72 65 5f 70 72 6e 67 5f 73    restore_prng_s
25410 74 61 74 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tate.*/.static i
25420 6e 74 20 72 65 73 74 6f 72 65 5f 70 72 6e 67 5f  nt restore_prng_
25430 73 74 61 74 65 28 0a 20 20 43 6c 69 65 6e 74 44  state(.  ClientD
25440 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
25450 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
25460 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
25470 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
25480 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
25490 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
254a0 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
254b0 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
254c0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
254d0 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
254e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
254f0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
25500 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
25510 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
25520 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
25530 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  .  sqlite3_test_
25540 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
25550 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53  ESTCTRL_PRNG_RES
25560 54 4f 52 45 29 3b 0a 20 20 72 65 74 75 72 6e 20  TORE);.  return 
25570 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  TCL_OK;.}./*.** 
25580 74 63 6c 63 6d 64 3a 20 20 72 65 73 65 74 5f 70  tclcmd:  reset_p
25590 72 6e 67 5f 73 74 61 74 65 0a 2a 2f 0a 73 74 61  rng_state.*/.sta
255a0 74 69 63 20 69 6e 74 20 72 65 73 65 74 5f 70 72  tic int reset_pr
255b0 6e 67 5f 73 74 61 74 65 28 0a 20 20 43 6c 69 65  ng_state(.  Clie
255c0 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
255d0 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
255e0 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
255f0 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
25600 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
25610 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
25620 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
25630 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
25640 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
25650 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
25660 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
25670 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
25680 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
25690 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
256a0 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
256b0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74 65  .){.  sqlite3_te
256c0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
256d0 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f  E_TESTCTRL_PRNG_
256e0 52 45 53 45 54 29 3b 0a 20 20 72 65 74 75 72 6e  RESET);.  return
256f0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
25700 2a 20 74 63 6c 63 6d 64 3a 20 20 70 63 61 63 68  * tclcmd:  pcach
25710 65 5f 73 74 61 74 73 0a 2a 2f 0a 73 74 61 74 69  e_stats.*/.stati
25720 63 20 69 6e 74 20 74 65 73 74 5f 70 63 61 63 68  c int test_pcach
25730 65 5f 73 74 61 74 73 28 0a 20 20 43 6c 69 65 6e  e_stats(.  Clien
25740 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
25750 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
25760 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
25770 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
25780 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
25790 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
257a0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
257b0 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
257c0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
257d0 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
257e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
257f0 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
25800 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
25810 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
25820 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
25830 29 7b 0a 20 20 69 6e 74 20 6e 4d 69 6e 3b 0a 20  ){.  int nMin;. 
25840 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 69 6e 74   int nMax;.  int
25850 20 6e 43 75 72 72 65 6e 74 3b 0a 20 20 69 6e 74   nCurrent;.  int
25860 20 6e 52 65 63 79 63 6c 61 62 6c 65 3b 0a 20 20   nRecyclable;.  
25870 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a  Tcl_Obj *pRet;..
25880 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
25890 74 61 74 73 28 26 6e 43 75 72 72 65 6e 74 2c 20  tats(&nCurrent, 
258a0 26 6e 4d 61 78 2c 20 26 6e 4d 69 6e 2c 20 26 6e  &nMax, &nMin, &n
258b0 52 65 63 79 63 6c 61 62 6c 65 29 3b 0a 0a 20 20  Recyclable);..  
258c0 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62  pRet = Tcl_NewOb
258d0 6a 28 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  j();.  Tcl_ListO
258e0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
258f0 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63  interp, pRet, Tc
25900 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
25910 63 75 72 72 65 6e 74 22 2c 20 2d 31 29 29 3b 0a  current", -1));.
25920 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
25930 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
25940 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
25950 49 6e 74 4f 62 6a 28 6e 43 75 72 72 65 6e 74 29  IntObj(nCurrent)
25960 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
25970 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
25980 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f  terp, pRet, Tcl_
25990 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 61  NewStringObj("ma
259a0 78 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  x", -1));.  Tcl_
259b0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
259c0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
259d0 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  t, Tcl_NewIntObj
259e0 28 6e 4d 61 78 29 29 3b 0a 20 20 54 63 6c 5f 4c  (nMax));.  Tcl_L
259f0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
25a00 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ent(interp, pRet
25a10 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
25a20 62 6a 28 22 6d 69 6e 22 2c 20 2d 31 29 29 3b 0a  bj("min", -1));.
25a30 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
25a40 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
25a50 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
25a60 49 6e 74 4f 62 6a 28 6e 4d 69 6e 29 29 3b 0a 20  IntObj(nMin));. 
25a70 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
25a80 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
25a90 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53  , pRet, Tcl_NewS
25aa0 74 72 69 6e 67 4f 62 6a 28 22 72 65 63 79 63 6c  tringObj("recycl
25ab0 61 62 6c 65 22 2c 20 2d 31 29 29 3b 0a 20 20 54  able", -1));.  T
25ac0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
25ad0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
25ae0 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  pRet, Tcl_NewInt
25af0 4f 62 6a 28 6e 52 65 63 79 63 6c 61 62 6c 65 29  Obj(nRecyclable)
25b00 29 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  );..  Tcl_SetObj
25b10 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
25b20 52 65 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Ret);..  return 
25b30 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65  TCL_OK;.}..#ifde
25b40 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
25b50 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73 74  UNLOCK_NOTIFY.st
25b60 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 75  atic void test_u
25b70 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f 63 62 28  nlock_notify_cb(
25b80 76 6f 69 64 20 2a 2a 61 41 72 67 2c 20 69 6e 74  void **aArg, int
25b90 20 6e 41 72 67 29 7b 0a 20 20 69 6e 74 20 69 69   nArg){.  int ii
25ba0 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  ;.  for(ii=0; ii
25bb0 3c 6e 41 72 67 3b 20 69 69 2b 2b 29 7b 0a 20 20  <nArg; ii++){.  
25bc0 20 20 54 63 6c 5f 45 76 61 6c 45 78 28 28 54 63    Tcl_EvalEx((Tc
25bd0 6c 5f 49 6e 74 65 72 70 20 2a 29 61 41 72 67 5b  l_Interp *)aArg[
25be0 69 69 5d 2c 20 22 75 6e 6c 6f 63 6b 5f 6e 6f 74  ii], "unlock_not
25bf0 69 66 79 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56  ify", -1, TCL_EV
25c00 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 7d 0a  AL_GLOBAL);.  }.
25c10 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
25c20 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b  TE_ENABLE_UNLOCK
25c30 5f 4e 4f 54 49 46 59 20 2a 2f 0a 0a 2f 2a 0a 2a  _NOTIFY */../*.*
25c40 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74  * tclcmd:  sqlit
25c50 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  e3_unlock_notify
25c60 20 64 62 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51   db.*/.#ifdef SQ
25c70 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f  LITE_ENABLE_UNLO
25c80 43 4b 5f 4e 4f 54 49 46 59 0a 73 74 61 74 69 63  CK_NOTIFY.static
25c90 20 69 6e 74 20 74 65 73 74 5f 75 6e 6c 6f 63 6b   int test_unlock
25ca0 5f 6e 6f 74 69 66 79 28 0a 20 20 43 6c 69 65 6e  _notify(.  Clien
25cb0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
25cc0 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20  , /* Unused */. 
25cd0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
25ce0 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
25cf0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
25d00 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
25d10 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
25d20 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
25d30 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
25d40 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
25d50 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
25d60 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
25d70 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
25d80 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
25d90 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
25da0 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
25db0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
25dc0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
25dd0 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 20 20 72  jv, "DB");.    r
25de0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
25df0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 44  .  }..  if( getD
25e00 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
25e10 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
25e20 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b  bjv[1]), &db) ){
25e30 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
25e40 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20  ERROR;.  }.  rc 
25e50 3d 20 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b  = sqlite3_unlock
25e60 5f 6e 6f 74 69 66 79 28 64 62 2c 20 74 65 73 74  _notify(db, test
25e70 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f 63  _unlock_notify_c
25e80 62 2c 20 28 76 6f 69 64 20 2a 29 69 6e 74 65 72  b, (void *)inter
25e90 70 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73  p);.  Tcl_SetRes
25ea0 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
25eb0 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28  r *)t1ErrorName(
25ec0 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  rc), TCL_STATIC)
25ed0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
25ee0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
25ef0 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69  ** tclcmd:  sqli
25f00 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
25f10 6e 74 20 64 62 20 3f 4e 41 4d 45 3f 0a 2a 2f 0a  nt db ?NAME?.*/.
25f20 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
25f30 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 0a  wal_checkpoint(.
25f40 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
25f50 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73  entData, /* Unus
25f60 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
25f70 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
25f80 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
25f90 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
25fa0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
25fb0 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
25fc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
25fd0 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
25fe0 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
25ff0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
26000 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
26010 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  nts */.){.  char
26020 20 2a 7a 44 62 20 3d 20 30 3b 0a 20 20 73 71 6c   *zDb = 0;.  sql
26030 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
26040 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
26050 3d 33 20 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b  =3 && objc!=2 ){
26060 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
26070 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
26080 20 6f 62 6a 76 2c 20 22 44 42 20 3f 4e 41 4d 45   objv, "DB ?NAME
26090 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ?");.    return 
260a0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
260b0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
260c0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
260d0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
260e0 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72  ), &db) ){.    r
260f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
26100 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d  .  }.  if( objc=
26110 3d 33 20 29 7b 0a 20 20 20 20 7a 44 62 20 3d 20  =3 ){.    zDb = 
26120 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
26130 6a 76 5b 32 5d 29 3b 0a 20 20 7d 0a 20 20 72 63  jv[2]);.  }.  rc
26140 20 3d 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63   = sqlite3_wal_c
26150 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 7a 44  heckpoint(db, zD
26160 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73  b);.  Tcl_SetRes
26170 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
26180 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28  r *)t1ErrorName(
26190 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  rc), TCL_STATIC)
261a0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
261b0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  K;.}../*.** tclc
261c0 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  md:  sqlite3_wal
261d0 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 20 64  _checkpoint_v2 d
261e0 62 20 4d 4f 44 45 20 3f 4e 41 4d 45 3f 0a 2a 2a  b MODE ?NAME?.**
261f0 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  .** This command
26200 20 63 61 6c 6c 73 20 74 68 65 20 77 61 6c 5f 63   calls the wal_c
26210 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 29 20 66  heckpoint_v2() f
26220 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65  unction with the
26230 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 6d 6f   specified.** mo
26240 64 65 20 61 72 67 75 6d 65 6e 74 20 28 70 61 73  de argument (pas
26250 73 69 76 65 2c 20 66 75 6c 6c 20 6f 72 20 72 65  sive, full or re
26260 73 74 61 72 74 29 2e 20 49 66 20 70 72 65 73 65  start). If prese
26270 6e 74 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  nt, the database
26280 20 6e 61 6d 65 0a 2a 2a 20 4e 41 4d 45 20 69 73   name.** NAME is
26290 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
262a0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
262b0 6f 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  o wal_checkpoint
262c0 5f 76 32 28 29 2e 20 49 66 20 69 74 20 74 68 65  _v2(). If it the
262d0 0a 2a 2a 20 4e 41 4d 45 20 61 72 67 75 6d 65 6e  .** NAME argumen
262e0 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74  t is not present
262f0 2c 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  , a NULL pointer
26300 20 69 73 20 70 61 73 73 65 64 20 69 6e 73 74 65   is passed inste
26310 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 61 6c  ad..**.** If wal
26320 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 29  _checkpoint_v2()
26330 20 72 65 74 75 72 6e 73 20 61 6e 79 20 76 61 6c   returns any val
26340 75 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  ue other than SQ
26350 4c 49 54 45 5f 42 55 53 59 20 6f 72 0a 2a 2a 20  LITE_BUSY or.** 
26360 53 51 4c 49 54 45 5f 4f 4b 2c 20 74 68 65 6e 20  SQLITE_OK, then 
26370 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 72 65 74  this command ret
26380 75 72 6e 73 20 54 43 4c 5f 45 52 52 4f 52 2e 20  urns TCL_ERROR. 
26390 54 68 65 20 54 63 6c 20 72 65 73 75 6c 74 20 69  The Tcl result i
263a0 73 20 73 65 74 0a 2a 2a 20 74 6f 20 74 68 65 20  s set.** to the 
263b0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6f 62  error message ob
263c0 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
263d0 74 65 33 5f 65 72 72 6d 73 67 28 29 2e 0a 2a 2a  te3_errmsg()..**
263e0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74  .** Otherwise, t
263f0 68 69 73 20 63 6f 6d 6d 61 6e 64 20 72 65 74 75  his command retu
26400 72 6e 73 20 61 20 6c 69 73 74 20 6f 66 20 74 68  rns a list of th
26410 72 65 65 20 69 6e 74 65 67 65 72 73 2e 20 54 68  ree integers. Th
26420 65 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 0a  e first integer.
26430 2a 2a 20 69 73 20 31 20 69 66 20 53 51 4c 49 54  ** is 1 if SQLIT
26440 45 5f 42 55 53 59 20 77 61 73 20 72 65 74 75 72  E_BUSY was retur
26450 6e 65 64 2c 20 6f 72 20 30 20 6f 74 68 65 72 77  ned, or 0 otherw
26460 69 73 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ise. The followi
26470 6e 67 20 74 77 6f 20 69 6e 74 65 67 65 72 73 0a  ng two integers.
26480 2a 2a 20 61 72 65 20 74 68 65 20 76 61 6c 75 65  ** are the value
26490 73 20 72 65 74 75 72 6e 65 64 20 76 69 61 20 74  s returned via t
264a0 68 65 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65  he output parame
264b0 74 65 72 73 20 62 79 20 77 61 6c 5f 63 68 65 63  ters by wal_chec
264c0 6b 70 6f 69 6e 74 5f 76 32 28 29 20 2d 0a 2a 2a  kpoint_v2() -.**
264d0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
264e0 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67  rames in the log
264f0 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20   and the number 
26500 6f 66 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65  of frames in the
26510 20 6c 6f 67 0a 2a 2a 20 74 68 61 74 20 68 61 76   log.** that hav
26520 65 20 62 65 65 6e 20 63 68 65 63 6b 70 6f 69 6e  e been checkpoin
26530 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
26540 6e 74 20 74 65 73 74 5f 77 61 6c 5f 63 68 65 63  nt test_wal_chec
26550 6b 70 6f 69 6e 74 5f 76 32 28 0a 20 20 43 6c 69  kpoint_v2(.  Cli
26560 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
26570 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f  ta, /* Unused */
26580 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
26590 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
265a0 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
265b0 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
265c0 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
265d0 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
265e0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
265f0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
26600 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
26610 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
26620 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
26630 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62  /.){.  char *zDb
26640 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20   = 0;.  sqlite3 
26650 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  *db;.  int rc;..
26660 20 20 69 6e 74 20 65 4d 6f 64 65 3b 0a 20 20 69    int eMode;.  i
26670 6e 74 20 6e 4c 6f 67 20 3d 20 2d 35 35 35 3b 0a  nt nLog = -555;.
26680 20 20 69 6e 74 20 6e 43 6b 70 74 20 3d 20 2d 35    int nCkpt = -5
26690 35 35 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  55;.  Tcl_Obj *p
266a0 52 65 74 3b 0a 0a 20 20 63 6f 6e 73 74 20 63 68  Ret;..  const ch
266b0 61 72 20 2a 20 61 4d 6f 64 65 5b 5d 20 3d 20 7b  ar * aMode[] = {
266c0 20 22 70 61 73 73 69 76 65 22 2c 20 22 66 75 6c   "passive", "ful
266d0 6c 22 2c 20 22 72 65 73 74 61 72 74 22 2c 20 30  l", "restart", 0
266e0 20 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   };.  assert( SQ
266f0 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
26700 50 41 53 53 49 56 45 3d 3d 30 20 29 3b 0a 20 20  PASSIVE==0 );.  
26710 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43  assert( SQLITE_C
26720 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3d 3d  HECKPOINT_FULL==
26730 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  1 );.  assert( S
26740 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
26750 5f 52 45 53 54 41 52 54 3d 3d 32 20 29 3b 0a 0a  _RESTART==2 );..
26760 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26    if( objc!=3 &&
26770 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
26780 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
26790 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
267a0 2c 20 22 44 42 20 4d 4f 44 45 20 3f 4e 41 4d 45  , "DB MODE ?NAME
267b0 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ?");.    return 
267c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
267d0 20 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b    if( objc==4 ){
267e0 0a 20 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47  .    zDb = Tcl_G
267f0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
26800 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  );.  }.  if( get
26810 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
26820 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
26830 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 0a 20  objv[1]), &db). 
26840 20 20 7c 7c 20 54 63 6c 5f 47 65 74 49 6e 64 65    || Tcl_GetInde
26850 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  xFromObj(interp,
26860 20 6f 62 6a 76 5b 32 5d 2c 20 61 4d 6f 64 65 2c   objv[2], aMode,
26870 20 22 6d 6f 64 65 22 2c 20 30 2c 20 26 65 4d 6f   "mode", 0, &eMo
26880 64 65 29 20 0a 20 20 29 7b 0a 20 20 20 20 72 65  de) .  ){.    re
26890 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
268a0 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69    }..  rc = sqli
268b0 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
268c0 6e 74 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 65  nt_v2(db, zDb, e
268d0 4d 6f 64 65 2c 20 26 6e 4c 6f 67 2c 20 26 6e 43  Mode, &nLog, &nC
268e0 6b 70 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  kpt);.  if( rc!=
268f0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
26900 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
26910 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
26920 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
26930 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  *)sqlite3_errmsg
26940 28 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49  (db), TCL_VOLATI
26950 4c 45 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  LE);.    return 
26960 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
26970 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77    pRet = Tcl_New
26980 4f 62 6a 28 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  Obj();.  Tcl_Lis
26990 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
269a0 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
269b0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63  Tcl_NewIntObj(rc
269c0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 3f 31 3a  ==SQLITE_BUSY?1:
269d0 30 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  0));.  Tcl_ListO
269e0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
269f0 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63  interp, pRet, Tc
26a00 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 4c 6f 67  l_NewIntObj(nLog
26a10 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
26a20 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
26a30 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c  nterp, pRet, Tcl
26a40 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 43 6b 70 74  _NewIntObj(nCkpt
26a50 29 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ));.  Tcl_SetObj
26a60 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
26a70 52 65 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Ret);..  return 
26a80 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
26a90 20 74 63 6c 63 6d 64 3a 20 20 74 65 73 74 5f 73   tclcmd:  test_s
26aa0 71 6c 69 74 65 33 5f 6c 6f 67 20 3f 53 43 52 49  qlite3_log ?SCRI
26ab0 50 54 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  PT?.*/.static st
26ac0 72 75 63 74 20 4c 6f 67 43 61 6c 6c 62 61 63 6b  ruct LogCallback
26ad0 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20   {.  Tcl_Interp 
26ae0 2a 70 49 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f  *pInterp;.  Tcl_
26af0 4f 62 6a 20 2a 70 4f 62 6a 3b 0a 7d 20 6c 6f 67  Obj *pObj;.} log
26b00 63 61 6c 6c 62 61 63 6b 20 3d 20 7b 30 2c 20 30  callback = {0, 0
26b10 7d 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 78  };.static void x
26b20 4c 6f 67 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64  Logcallback(void
26b30 20 2a 75 6e 75 73 65 64 2c 20 69 6e 74 20 65 72   *unused, int er
26b40 72 2c 20 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0a  r, char *zMsg){.
26b50 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4e 65 77 20    Tcl_Obj *pNew 
26b60 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
26b70 62 6a 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70  bj(logcallback.p
26b80 4f 62 6a 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72  Obj);.  Tcl_Incr
26b90 52 65 66 43 6f 75 6e 74 28 70 4e 65 77 29 3b 0a  RefCount(pNew);.
26ba0 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
26bb0 65 6e 64 45 6c 65 6d 65 6e 74 28 0a 20 20 20 20  endElement(.    
26bc0 20 20 30 2c 20 70 4e 65 77 2c 20 54 63 6c 5f 4e    0, pNew, Tcl_N
26bd0 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69  ewStringObj(sqli
26be0 74 65 33 45 72 72 4e 61 6d 65 28 65 72 72 29 2c  te3ErrName(err),
26bf0 20 2d 31 29 0a 20 20 29 3b 0a 20 20 54 63 6c 5f   -1).  );.  Tcl_
26c00 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
26c10 6d 65 6e 74 28 30 2c 20 70 4e 65 77 2c 20 54 63  ment(0, pNew, Tc
26c20 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
26c30 4d 73 67 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  Msg, -1));.  Tcl
26c40 5f 45 76 61 6c 4f 62 6a 45 78 28 6c 6f 67 63 61  _EvalObjEx(logca
26c50 6c 6c 62 61 63 6b 2e 70 49 6e 74 65 72 70 2c 20  llback.pInterp, 
26c60 70 4e 65 77 2c 20 54 43 4c 5f 45 56 41 4c 5f 47  pNew, TCL_EVAL_G
26c70 4c 4f 42 41 4c 7c 54 43 4c 5f 45 56 41 4c 5f 44  LOBAL|TCL_EVAL_D
26c80 49 52 45 43 54 29 3b 0a 20 20 54 63 6c 5f 44 65  IRECT);.  Tcl_De
26c90 63 72 52 65 66 43 6f 75 6e 74 28 70 4e 65 77 29  crRefCount(pNew)
26ca0 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 74  ;.}.static int t
26cb0 65 73 74 5f 73 71 6c 69 74 65 33 5f 6c 6f 67 28  est_sqlite3_log(
26cc0 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
26cd0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
26ce0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
26cf0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
26d00 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
26d10 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
26d20 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
26d30 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
26d40 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
26d50 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
26d60 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
26d70 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
26d80 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
26d90 69 66 28 20 6f 62 6a 63 3e 32 20 29 7b 0a 20 20  if( objc>2 ){.  
26da0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
26db0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
26dc0 6a 76 2c 20 22 53 43 52 49 50 54 22 29 3b 0a 20  jv, "SCRIPT");. 
26dd0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
26de0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c  ROR;.  }.  if( l
26df0 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 20  ogcallback.pObj 
26e00 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  ){.    Tcl_DecrR
26e10 65 66 43 6f 75 6e 74 28 6c 6f 67 63 61 6c 6c 62  efCount(logcallb
26e20 61 63 6b 2e 70 4f 62 6a 29 3b 0a 20 20 20 20 6c  ack.pObj);.    l
26e30 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 20  ogcallback.pObj 
26e40 3d 20 30 3b 0a 20 20 20 20 6c 6f 67 63 61 6c 6c  = 0;.    logcall
26e50 62 61 63 6b 2e 70 49 6e 74 65 72 70 20 3d 20 30  back.pInterp = 0
26e60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f  ;.    sqlite3_co
26e70 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46  nfig(SQLITE_CONF
26e80 49 47 5f 4c 4f 47 2c 20 30 2c 20 30 29 3b 0a 20  IG_LOG, 0, 0);. 
26e90 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3e 31 20   }.  if( objc>1 
26ea0 29 7b 0a 20 20 20 20 6c 6f 67 63 61 6c 6c 62 61  ){.    logcallba
26eb0 63 6b 2e 70 4f 62 6a 20 3d 20 6f 62 6a 76 5b 31  ck.pObj = objv[1
26ec0 5d 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  ];.    Tcl_IncrR
26ed0 65 66 43 6f 75 6e 74 28 6c 6f 67 63 61 6c 6c 62  efCount(logcallb
26ee0 61 63 6b 2e 70 4f 62 6a 29 3b 0a 20 20 20 20 6c  ack.pObj);.    l
26ef0 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 49 6e 74 65  ogcallback.pInte
26f00 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
26f10 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
26f20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f  SQLITE_CONFIG_LO
26f30 47 2c 20 78 4c 6f 67 63 61 6c 6c 62 61 63 6b 2c  G, xLogcallback,
26f40 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
26f50 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
26f60 2a 2a 20 20 20 20 20 74 63 6c 5f 6f 62 6a 70 72  **     tcl_objpr
26f70 6f 63 20 43 4f 4d 4d 41 4e 44 4e 41 4d 45 20 41  oc COMMANDNAME A
26f80 52 47 53 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 52 75 6e  RGS....**.** Run
26f90 20 61 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 75   a TCL command u
26fa0 73 69 6e 67 20 69 74 73 20 6f 62 6a 50 72 6f 63  sing its objProc
26fb0 20 69 6e 74 65 72 66 61 63 65 2e 20 20 54 68 72   interface.  Thr
26fc0 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66 0a 2a  ow an error if.*
26fd0 2a 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 68 61  * the command ha
26fe0 73 20 6e 6f 20 6f 62 6a 50 72 6f 63 20 69 6e 74  s no objProc int
26ff0 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  erface..*/.stati
27000 63 20 69 6e 74 20 72 75 6e 41 73 4f 62 6a 50 72  c int runAsObjPr
27010 6f 63 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  oc(.  void * cli
27020 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
27030 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
27040 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
27050 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
27060 5b 5d 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49  [].){.  Tcl_CmdI
27070 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 69  nfo cmdInfo;.  i
27080 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20  f( objc<2 ){.   
27090 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
270a0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
270b0 76 2c 20 22 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22  v, "COMMAND ..."
270c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
270d0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
270e0 66 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61  f( !Tcl_GetComma
270f0 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 54  ndInfo(interp, T
27100 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
27110 76 5b 31 5d 29 2c 20 26 63 6d 64 49 6e 66 6f 29  v[1]), &cmdInfo)
27120 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
27130 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
27140 20 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f   "command not fo
27150 75 6e 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20  und: ",.        
27160 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
27170 28 6f 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72  (objv[1]), (char
27180 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  *)0);.    return
27190 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
271a0 20 20 69 66 28 20 63 6d 64 49 6e 66 6f 2e 6f 62    if( cmdInfo.ob
271b0 6a 50 72 6f 63 3d 3d 30 20 29 7b 0a 20 20 20 20  jProc==0 ){.    
271c0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
271d0 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e  (interp, "comman
271e0 64 20 68 61 73 20 6e 6f 20 6f 62 6a 50 72 6f 63  d has no objProc
271f0 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  : ",.           
27200 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
27210 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29 30  jv[1]), (char*)0
27220 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
27230 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
27240 65 74 75 72 6e 20 63 6d 64 49 6e 66 6f 2e 6f 62  eturn cmdInfo.ob
27250 6a 50 72 6f 63 28 63 6d 64 49 6e 66 6f 2e 6f 62  jProc(cmdInfo.ob
27260 6a 43 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e 74  jClientData, int
27270 65 72 70 2c 20 6f 62 6a 63 2d 31 2c 20 6f 62 6a  erp, objc-1, obj
27280 76 2b 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  v+1);.}..#ifndef
27290 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
272a0 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 57 41 52 4e 49  LAIN./*.** WARNI
272b0 4e 47 3a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  NG: The followin
272c0 67 20 66 75 6e 63 74 69 6f 6e 2c 20 70 72 69 6e  g function, prin
272d0 74 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61  tExplainQueryPla
272e0 6e 28 29 20 69 73 20 61 6e 20 65 78 61 63 74 0a  n() is an exact.
272f0 2a 2a 20 63 6f 70 79 20 6f 66 20 65 78 61 6d 70  ** copy of examp
27300 6c 65 20 63 6f 64 65 20 66 72 6f 6d 20 65 71 70  le code from eqp
27310 2e 69 6e 20 28 65 71 70 2e 68 74 6d 6c 29 2e 20  .in (eqp.html). 
27320 49 66 20 74 68 69 73 20 63 6f 64 65 20 69 73 20  If this code is 
27330 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 74 68 65  modified,.** the
27340 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 61 74  n the documentat
27350 69 6f 6e 20 63 6f 70 79 20 6e 65 65 64 73 20 74  ion copy needs t
27360 6f 20 62 65 20 6d 6f 64 69 66 69 65 64 20 61 73  o be modified as
27370 20 77 65 6c 6c 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20   well..*/./*.** 
27380 41 72 67 75 6d 65 6e 74 20 70 53 74 6d 74 20 69  Argument pStmt i
27390 73 20 61 20 70 72 65 70 61 72 65 64 20 53 51 4c  s a prepared SQL
273a0 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73   statement. This
273b0 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 69 6c   function compil
273c0 65 73 0a 2a 2a 20 61 6e 20 45 58 50 4c 41 49 4e  es.** an EXPLAIN
273d0 20 51 55 45 52 59 20 50 4c 41 4e 20 63 6f 6d 6d   QUERY PLAN comm
273e0 61 6e 64 20 74 6f 20 72 65 70 6f 72 74 20 6f 6e  and to report on
273f0 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
27400 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 61 6e 64 20  atement,.** and 
27410 70 72 69 6e 74 73 20 74 68 65 20 72 65 70 6f 72  prints the repor
27420 74 20 74 6f 20 73 74 64 6f 75 74 20 75 73 69 6e  t to stdout usin
27430 67 20 70 72 69 6e 74 66 28 29 2e 0a 2a 2f 0a 69  g printf()..*/.i
27440 6e 74 20 70 72 69 6e 74 45 78 70 6c 61 69 6e 51  nt printExplainQ
27450 75 65 72 79 50 6c 61 6e 28 73 71 6c 69 74 65 33  ueryPlan(sqlite3
27460 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20  _stmt *pStmt){. 
27470 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
27480 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
27490 20 2f 2a 20 49 6e 70 75 74 20 53 51 4c 20 2a 2f   /* Input SQL */
274a0 0a 20 20 63 68 61 72 20 2a 7a 45 78 70 6c 61 69  .  char *zExplai
274b0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
274c0 20 20 20 2f 2a 20 53 51 4c 20 77 69 74 68 20 45     /* SQL with E
274d0 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
274e0 4e 20 70 72 65 70 65 6e 64 65 64 20 2a 2f 0a 20  N prepended */. 
274f0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
27500 45 78 70 6c 61 69 6e 3b 20 20 20 20 20 20 20 20  Explain;        
27510 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20 45 58 50   /* Compiled EXP
27520 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
27530 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
27540 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
27550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27560 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  Return code from
27570 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
27580 5f 76 32 28 29 20 2a 2f 0a 0a 20 20 7a 53 71 6c  _v2() */..  zSql
27590 20 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70   = sqlite3_sql(p
275a0 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 7a 53 71  Stmt);.  if( zSq
275b0 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
275c0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a  LITE_ERROR;..  z
275d0 45 78 70 6c 61 69 6e 20 3d 20 73 71 6c 69 74 65  Explain = sqlite
275e0 33 5f 6d 70 72 69 6e 74 66 28 22 45 58 50 4c 41  3_mprintf("EXPLA
275f0 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 25 73  IN QUERY PLAN %s
27600 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20  ", zSql);.  if( 
27610 7a 45 78 70 6c 61 69 6e 3d 3d 30 20 29 20 72 65  zExplain==0 ) re
27620 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
27630 4d 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  M;..  rc = sqlit
27640 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 73 71  e3_prepare_v2(sq
27650 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65 28  lite3_db_handle(
27660 70 53 74 6d 74 29 2c 20 7a 45 78 70 6c 61 69 6e  pStmt), zExplain
27670 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c  , -1, &pExplain,
27680 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
27690 72 65 65 28 7a 45 78 70 6c 61 69 6e 29 3b 0a 20  ree(zExplain);. 
276a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
276b0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
276c0 0a 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45  .  while( SQLITE
276d0 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
276e0 65 70 28 70 45 78 70 6c 61 69 6e 29 20 29 7b 0a  ep(pExplain) ){.
276f0 20 20 20 20 69 6e 74 20 69 53 65 6c 65 63 74 69      int iSelecti
27700 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  d = sqlite3_colu
27710 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c  mn_int(pExplain,
27720 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 69 4f 72   0);.    int iOr
27730 64 65 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  der = sqlite3_co
27740 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69  lumn_int(pExplai
27750 6e 2c 20 31 29 3b 0a 20 20 20 20 69 6e 74 20 69  n, 1);.    int i
27760 46 72 6f 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63  From = sqlite3_c
27770 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61  olumn_int(pExpla
27780 69 6e 2c 20 32 29 3b 0a 20 20 20 20 63 6f 6e 73  in, 2);.    cons
27790 74 20 63 68 61 72 20 2a 7a 44 65 74 61 69 6c 20  t char *zDetail 
277a0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
277b0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
277c0 65 78 74 28 70 45 78 70 6c 61 69 6e 2c 20 33 29  ext(pExplain, 3)
277d0 3b 0a 0a 20 20 20 20 70 72 69 6e 74 66 28 22 25  ;..    printf("%
277e0 64 20 25 64 20 25 64 20 25 73 5c 6e 22 2c 20 69  d %d %d %s\n", i
277f0 53 65 6c 65 63 74 69 64 2c 20 69 4f 72 64 65 72  Selectid, iOrder
27800 2c 20 69 46 72 6f 6d 2c 20 7a 44 65 74 61 69 6c  , iFrom, zDetail
27810 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
27820 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
27830 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 7d 0a 0a  e(pExplain);.}..
27840 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
27850 70 72 69 6e 74 5f 65 71 70 28 0a 20 20 76 6f 69  print_eqp(.  voi
27860 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
27870 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
27880 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
27890 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
278a0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69  ST objv[].){.  i
278b0 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
278c0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20  _stmt *pStmt;.. 
278d0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
278e0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
278f0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
27900 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20  objv, "STMT");. 
27910 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
27920 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
27930 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
27940 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
27950 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
27960 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
27970 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
27980 20 70 72 69 6e 74 45 78 70 6c 61 69 6e 51 75 65   printExplainQue
27990 72 79 50 6c 61 6e 28 70 53 74 6d 74 29 3b 0a 20  ryPlan(pStmt);. 
279a0 20 2f 2a 20 54 68 69 73 20 69 73 20 6e 65 65 64   /* This is need
279b0 65 64 20 6f 6e 20 57 69 6e 64 6f 77 73 20 73 6f  ed on Windows so
279c0 20 74 68 61 74 20 61 20 74 65 73 74 20 63 61 73   that a test cas
279d0 65 20 75 73 69 6e 67 20 74 68 69 73 20 0a 20 20  e using this .  
279e0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20  ** function can 
279f0 6f 70 65 6e 20 61 20 72 65 61 64 20 70 69 70 65  open a read pipe
27a00 20 61 6e 64 20 67 65 74 20 74 68 65 20 6f 75 74   and get the out
27a10 70 75 74 20 6f 66 0a 20 20 2a 2a 20 70 72 69 6e  put of.  ** prin
27a20 74 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61  tExplainQueryPla
27a30 6e 28 29 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  n() immediately.
27a40 0a 20 20 2a 2f 0a 20 20 66 66 6c 75 73 68 28 73  .  */.  fflush(s
27a50 74 64 6f 75 74 29 3b 0a 20 20 54 63 6c 5f 53 65  tdout);.  Tcl_Se
27a60 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
27a70 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
27a80 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72  ame(rc), 0);.  r
27a90 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
27aa0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
27ab0 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f  _OMIT_EXPLAIN */
27ac0 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  ../*.** sqlite3_
27ad0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 20 56 45 52  test_control VER
27ae0 42 20 41 52 47 53 2e 2e 2e 0a 2a 2f 0a 73 74 61  B ARGS....*/.sta
27af0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 74 65 73  tic int test_tes
27b00 74 5f 63 6f 6e 74 72 6f 6c 28 0a 20 20 76 6f 69  t_control(.  voi
27b10 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
27b20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
27b30 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
27b40 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
27b50 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
27b60 74 72 75 63 74 20 56 65 72 62 20 7b 0a 20 20 20  truct Verb {.   
27b70 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
27b80 6d 65 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  me;.    int i;. 
27b90 20 7d 20 61 56 65 72 62 5b 5d 20 3d 20 7b 0a 20   } aVerb[] = {. 
27ba0 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 54 45 53     { "SQLITE_TES
27bb0 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f  TCTRL_LOCALTIME_
27bc0 46 41 55 4c 54 22 2c 20 53 51 4c 49 54 45 5f 54  FAULT", SQLITE_T
27bd0 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d  ESTCTRL_LOCALTIM
27be0 45 5f 46 41 55 4c 54 20 7d 2c 20 0a 20 20 7d 3b  E_FAULT }, .  };
27bf0 0a 20 20 69 6e 74 20 69 56 65 72 62 3b 0a 20 20  .  int iVerb;.  
27c00 69 6e 74 20 69 46 6c 61 67 3b 0a 20 20 69 6e 74  int iFlag;.  int
27c10 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
27c20 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  <2 ){.    Tcl_Wr
27c30 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
27c40 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 56 45 52  p, 1, objv, "VER
27c50 42 20 41 52 47 53 2e 2e 2e 22 29 3b 0a 20 20 20  B ARGS...");.   
27c60 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
27c70 52 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 54  R;.  }..  rc = T
27c80 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
27c90 62 6a 53 74 72 75 63 74 28 0a 20 20 20 20 20 20  bjStruct(.      
27ca0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
27cb0 20 61 56 65 72 62 2c 20 73 69 7a 65 6f 66 28 61   aVerb, sizeof(a
27cc0 56 65 72 62 5b 30 5d 29 2c 20 22 56 45 52 42 22  Verb[0]), "VERB"
27cd0 2c 20 30 2c 20 26 69 56 65 72 62 0a 20 20 29 3b  , 0, &iVerb.  );
27ce0 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f  .  if( rc!=TCL_O
27cf0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
27d00 20 20 69 46 6c 61 67 20 3d 20 61 56 65 72 62 5b    iFlag = aVerb[
27d10 69 56 65 72 62 5d 2e 69 3b 0a 20 20 73 77 69 74  iVerb].i;.  swit
27d20 63 68 28 20 69 46 6c 61 67 20 29 7b 0a 20 20 20  ch( iFlag ){.   
27d30 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
27d40 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f  TCTRL_LOCALTIME_
27d50 46 41 55 4c 54 3a 20 7b 0a 20 20 20 20 20 20 69  FAULT: {.      i
27d60 6e 74 20 76 61 6c 3b 0a 20 20 20 20 20 20 69 66  nt val;.      if
27d70 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
27d80 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
27d90 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
27da0 20 6f 62 6a 76 2c 20 22 4f 4e 4f 46 46 22 29 3b   objv, "ONOFF");
27db0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
27dc0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
27dd0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c   }.      if( Tcl
27de0 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
27df0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
27e00 32 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75  2], &val) ) retu
27e10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
27e20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74      sqlite3_test
27e30 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
27e40 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49  TESTCTRL_LOCALTI
27e50 4d 45 5f 46 41 55 4c 54 2c 20 76 61 6c 29 3b 0a  ME_FAULT, val);.
27e60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27e70 20 7d 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 52 65   }.  }..  Tcl_Re
27e80 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  setResult(interp
27e90 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
27ea0 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  OK;.}..#if SQLIT
27eb0 45 5f 4f 53 5f 55 4e 49 58 0a 23 69 6e 63 6c 75  E_OS_UNIX.#inclu
27ec0 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a  de <sys/time.h>.
27ed0 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 72 65  #include <sys/re
27ee0 73 6f 75 72 63 65 2e 68 3e 0a 0a 73 74 61 74 69  source.h>..stati
27ef0 63 20 69 6e 74 20 74 65 73 74 5f 67 65 74 72 75  c int test_getru
27f00 73 61 67 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  sage(.  void * c
27f10 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
27f20 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
27f30 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
27f40 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
27f50 6a 76 5b 5d 0a 29 7b 0a 20 20 63 68 61 72 20 62  jv[].){.  char b
27f60 75 66 5b 31 30 32 34 5d 3b 0a 20 20 73 74 72 75  uf[1024];.  stru
27f70 63 74 20 72 75 73 61 67 65 20 72 3b 0a 20 20 6d  ct rusage r;.  m
27f80 65 6d 73 65 74 28 26 72 2c 20 30 2c 20 73 69 7a  emset(&r, 0, siz
27f90 65 6f 66 28 72 29 29 3b 0a 20 20 67 65 74 72 75  eof(r));.  getru
27fa0 73 61 67 65 28 52 55 53 41 47 45 5f 53 45 4c 46  sage(RUSAGE_SELF
27fb0 2c 20 26 72 29 3b 0a 0a 20 20 73 70 72 69 6e 74  , &r);..  sprint
27fc0 66 28 62 75 66 2c 20 22 72 75 5f 75 74 69 6d 65  f(buf, "ru_utime
27fd0 3d 25 64 2e 25 30 36 64 20 72 75 5f 73 74 69 6d  =%d.%06d ru_stim
27fe0 65 3d 25 64 2e 25 30 36 64 20 72 75 5f 6d 69 6e  e=%d.%06d ru_min
27ff0 66 6c 74 3d 25 64 20 72 75 5f 6d 61 6a 66 6c 74  flt=%d ru_majflt
28000 3d 25 64 22 2c 20 0a 20 20 20 20 28 69 6e 74 29  =%d", .    (int)
28010 72 2e 72 75 5f 75 74 69 6d 65 2e 74 76 5f 73 65  r.ru_utime.tv_se
28020 63 2c 20 28 69 6e 74 29 72 2e 72 75 5f 75 74 69  c, (int)r.ru_uti
28030 6d 65 2e 74 76 5f 75 73 65 63 2c 20 0a 20 20 20  me.tv_usec, .   
28040 20 28 69 6e 74 29 72 2e 72 75 5f 73 74 69 6d 65   (int)r.ru_stime
28050 2e 74 76 5f 73 65 63 2c 20 28 69 6e 74 29 72 2e  .tv_sec, (int)r.
28060 72 75 5f 73 74 69 6d 65 2e 74 76 5f 75 73 65 63  ru_stime.tv_usec
28070 2c 20 0a 20 20 20 20 28 69 6e 74 29 72 2e 72 75  , .    (int)r.ru
28080 5f 6d 69 6e 66 6c 74 2c 20 28 69 6e 74 29 72 2e  _minflt, (int)r.
28090 72 75 5f 6d 61 6a 66 6c 74 0a 20 20 29 3b 0a 20  ru_majflt.  );. 
280a0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
280b0 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
280c0 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 2c 20  wStringObj(buf, 
280d0 2d 31 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  -1));.  return T
280e0 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  CL_OK;.}.#endif.
280f0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
28100 49 4e 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61  IN./*.** Informa
28110 74 69 6f 6e 20 70 61 73 73 65 64 20 66 72 6f 6d  tion passed from
28120 20 74 68 65 20 6d 61 69 6e 20 74 68 72 65 61 64   the main thread
28130 20 69 6e 74 6f 20 74 68 65 20 77 69 6e 64 6f 77   into the window
28140 73 20 66 69 6c 65 20 6c 6f 63 6b 65 72 0a 2a 2a  s file locker.**
28150 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72 65   background thre
28160 61 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69  ad..*/.struct wi
28170 6e 33 32 46 69 6c 65 4c 6f 63 6b 65 72 20 7b 0a  n32FileLocker {.
28180 20 20 63 68 61 72 20 2a 65 76 4e 61 6d 65 3b 20    char *evName; 
28190 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
281a0 20 65 76 65 6e 74 20 74 6f 20 73 69 67 6e 61 6c   event to signal
281b0 20 74 68 72 65 61 64 20 73 74 61 72 74 75 70 20   thread startup 
281c0 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 3b 20 20  */.  HANDLE h;  
281d0 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
281e0 6c 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  le of the file t
281f0 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20  o be locked */. 
28200 20 69 6e 74 20 64 65 6c 61 79 31 3b 20 20 20 20   int delay1;    
28210 20 20 20 20 20 2f 2a 20 44 65 6c 61 79 20 62 65       /* Delay be
28220 66 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a  fore locking */.
28230 20 20 69 6e 74 20 64 65 6c 61 79 32 3b 20 20 20    int delay2;   
28240 20 20 20 20 20 20 2f 2a 20 44 65 6c 61 79 20 62        /* Delay b
28250 65 66 6f 72 65 20 75 6e 6c 6f 63 6b 69 6e 67 20  efore unlocking 
28260 2a 2f 0a 20 20 69 6e 74 20 6f 6b 3b 20 20 20 20  */.  int ok;    
28270 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 69           /* Fini
28280 73 68 65 64 20 6f 6b 20 2a 2f 0a 20 20 69 6e 74  shed ok */.  int
28290 20 65 72 72 3b 20 20 20 20 20 20 20 20 20 20 20   err;           
282a0 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 65   /* True if an e
282b0 72 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a 7d  rror occurs */.}
282c0 3b 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20 53  ;.#endif...#if S
282d0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 23 69 6e  QLITE_OS_WIN.#in
282e0 63 6c 75 64 65 20 3c 70 72 6f 63 65 73 73 2e 68  clude <process.h
282f0 3e 0a 2f 2a 0a 2a 2a 20 54 68 65 20 62 61 63 6b  >./*.** The back
28300 67 72 6f 75 6e 64 20 74 68 72 65 61 64 20 74 68  ground thread th
28310 61 74 20 64 6f 65 73 20 66 69 6c 65 20 6c 6f 63  at does file loc
28320 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
28330 76 6f 69 64 20 77 69 6e 33 32 5f 66 69 6c 65 5f  void win32_file_
28340 6c 6f 63 6b 65 72 28 76 6f 69 64 20 2a 70 41 70  locker(void *pAp
28350 70 44 61 74 61 29 7b 0a 20 20 73 74 72 75 63 74  pData){.  struct
28360 20 77 69 6e 33 32 46 69 6c 65 4c 6f 63 6b 65 72   win32FileLocker
28370 20 2a 70 20 3d 20 28 73 74 72 75 63 74 20 77 69   *p = (struct wi
28380 6e 33 32 46 69 6c 65 4c 6f 63 6b 65 72 2a 29 70  n32FileLocker*)p
28390 41 70 70 44 61 74 61 3b 0a 20 20 69 66 28 20 70  AppData;.  if( p
283a0 2d 3e 65 76 4e 61 6d 65 20 29 7b 0a 20 20 20 20  ->evName ){.    
283b0 48 41 4e 44 4c 45 20 65 76 20 3d 20 4f 70 65 6e  HANDLE ev = Open
283c0 45 76 65 6e 74 28 45 56 45 4e 54 5f 4d 4f 44 49  Event(EVENT_MODI
283d0 46 59 5f 53 54 41 54 45 2c 20 46 41 4c 53 45 2c  FY_STATE, FALSE,
283e0 20 70 2d 3e 65 76 4e 61 6d 65 29 3b 0a 20 20 20   p->evName);.   
283f0 20 69 66 20 28 20 65 76 20 29 7b 0a 20 20 20 20   if ( ev ){.    
28400 20 20 53 65 74 45 76 65 6e 74 28 65 76 29 3b 0a    SetEvent(ev);.
28410 20 20 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c        CloseHandl
28420 65 28 65 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e(ev);.    }.  }
28430 0a 20 20 69 66 28 20 70 2d 3e 64 65 6c 61 79 31  .  if( p->delay1
28440 20 29 20 53 6c 65 65 70 28 70 2d 3e 64 65 6c 61   ) Sleep(p->dela
28450 79 31 29 3b 0a 20 20 69 66 28 20 4c 6f 63 6b 46  y1);.  if( LockF
28460 69 6c 65 28 70 2d 3e 68 2c 20 30 2c 20 30 2c 20  ile(p->h, 0, 0, 
28470 31 30 30 30 30 30 30 30 30 2c 20 30 29 20 29 7b  100000000, 0) ){
28480 0a 20 20 20 20 53 6c 65 65 70 28 70 2d 3e 64 65  .    Sleep(p->de
28490 6c 61 79 32 29 3b 0a 20 20 20 20 55 6e 6c 6f 63  lay2);.    Unloc
284a0 6b 46 69 6c 65 28 70 2d 3e 68 2c 20 30 2c 20 30  kFile(p->h, 0, 0
284b0 2c 20 31 30 30 30 30 30 30 30 30 2c 20 30 29 3b  , 100000000, 0);
284c0 0a 20 20 20 20 70 2d 3e 6f 6b 20 3d 20 31 3b 0a  .    p->ok = 1;.
284d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
284e0 65 72 72 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 43  err = 1;.  }.  C
284f0 6c 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e 68 29  loseHandle(p->h)
28500 3b 0a 20 20 70 2d 3e 68 20 3d 20 30 3b 0a 20 20  ;.  p->h = 0;.  
28510 70 2d 3e 64 65 6c 61 79 31 20 3d 20 30 3b 0a 20  p->delay1 = 0;. 
28520 20 70 2d 3e 64 65 6c 61 79 32 20 3d 20 30 3b 0a   p->delay2 = 0;.
28530 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  }.#endif..#if SQ
28540 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a  LITE_OS_WIN./*.*
28550 2a 20 20 20 20 20 20 6c 6f 63 6b 5f 77 69 6e 33  *      lock_win3
28560 32 5f 66 69 6c 65 20 46 49 4c 45 4e 41 4d 45 20  2_file FILENAME 
28570 44 45 4c 41 59 31 20 44 45 4c 41 59 32 0a 2a 2a  DELAY1 DELAY2.**
28580 0a 2a 2a 20 47 65 74 20 61 6e 20 65 78 63 6c 75  .** Get an exclu
28590 73 69 76 65 20 6d 61 6e 64 69 74 6f 72 79 20 6c  sive manditory l
285a0 6f 63 6b 20 6f 6e 20 66 69 6c 65 20 66 6f 72 20  ock on file for 
285b0 44 45 4c 41 59 32 20 6d 69 6c 6c 69 73 65 63 6f  DELAY2 milliseco
285c0 6e 64 73 2e 0a 2a 2a 20 57 61 69 74 20 44 45 4c  nds..** Wait DEL
285d0 41 59 31 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  AY1 milliseconds
285e0 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e   before acquirin
285f0 67 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73  g the lock..*/.s
28600 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32 5f  tatic int win32_
28610 66 69 6c 65 5f 6c 6f 63 6b 28 0a 20 20 76 6f 69  file_lock(.  voi
28620 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
28630 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
28640 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
28650 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
28660 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
28670 74 61 74 69 63 20 73 74 72 75 63 74 20 77 69 6e  tatic struct win
28680 33 32 46 69 6c 65 4c 6f 63 6b 65 72 20 78 20 3d  32FileLocker x =
28690 20 7b 20 22 77 69 6e 33 32 5f 66 69 6c 65 5f 6c   { "win32_file_l
286a0 6f 63 6b 22 2c 20 30 2c 20 30 2c 20 30 2c 20 30  ock", 0, 0, 0, 0
286b0 2c 20 30 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63  , 0 };.  const c
286c0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a  har *zFilename;.
286d0 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d    char zBuf[200]
286e0 3b 0a 20 20 69 6e 74 20 72 65 74 72 79 20 3d 20  ;.  int retry = 
286f0 30 3b 0a 20 20 48 41 4e 44 4c 45 20 65 76 3b 0a  0;.  HANDLE ev;.
28700 20 20 44 57 4f 52 44 20 77 52 65 73 75 6c 74 3b    DWORD wResult;
28710 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  .  .  if( objc!=
28720 34 20 26 26 20 6f 62 6a 63 21 3d 31 20 29 7b 0a  4 && objc!=1 ){.
28730 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
28740 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
28750 6f 62 6a 76 2c 20 22 46 49 4c 45 4e 41 4d 45 20  objv, "FILENAME 
28760 44 45 4c 41 59 31 20 44 45 4c 41 59 32 22 29 3b  DELAY1 DELAY2");
28770 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
28780 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
28790 20 6f 62 6a 63 3d 3d 31 20 29 7b 0a 20 20 20 20   objc==1 ){.    
287a0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
287b0 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a  (sizeof(zBuf), z
287c0 42 75 66 2c 20 22 25 64 20 25 64 20 25 64 20 25  Buf, "%d %d %d %
287d0 64 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20  d %d",.         
287e0 20 20 20 20 20 20 20 20 20 20 20 20 78 2e 6f 6b              x.ok
287f0 2c 20 78 2e 65 72 72 2c 20 78 2e 64 65 6c 61 79  , x.err, x.delay
28800 31 2c 20 78 2e 64 65 6c 61 79 32 2c 20 78 2e 68  1, x.delay2, x.h
28810 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  );.    Tcl_Appen
28820 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
28830 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b  zBuf, (char*)0);
28840 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
28850 4f 4b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  OK;.  }.  while(
28860 20 78 2e 68 20 26 26 20 72 65 74 72 79 3c 33 30   x.h && retry<30
28870 20 29 7b 0a 20 20 20 20 72 65 74 72 79 2b 2b 3b   ){.    retry++;
28880 0a 20 20 20 20 53 6c 65 65 70 28 31 30 30 29 3b  .    Sleep(100);
28890 0a 20 20 7d 0a 20 20 69 66 28 20 78 2e 68 20 29  .  }.  if( x.h )
288a0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
288b0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
288c0 62 75 73 79 22 2c 20 28 63 68 61 72 2a 29 30 29  busy", (char*)0)
288d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
288e0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
288f0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
28900 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
28910 5b 32 5d 2c 20 26 78 2e 64 65 6c 61 79 31 29 20  [2], &x.delay1) 
28920 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
28930 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
28940 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
28950 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 78 2e  rp, objv[3], &x.
28960 64 65 6c 61 79 32 29 20 29 20 72 65 74 75 72 6e  delay2) ) return
28970 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 46   TCL_ERROR;.  zF
28980 69 6c 65 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65  ilename = Tcl_Ge
28990 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
289a0 3b 0a 20 20 78 2e 68 20 3d 20 43 72 65 61 74 65  ;.  x.h = Create
289b0 46 69 6c 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  File(zFilename, 
289c0 47 45 4e 45 52 49 43 5f 52 45 41 44 7c 47 45 4e  GENERIC_READ|GEN
289d0 45 52 49 43 5f 57 52 49 54 45 2c 0a 20 20 20 20  ERIC_WRITE,.    
289e0 20 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 53            FILE_S
289f0 48 41 52 45 5f 52 45 41 44 7c 46 49 4c 45 5f 53  HARE_READ|FILE_S
28a00 48 41 52 45 5f 57 52 49 54 45 2c 20 30 2c 20 4f  HARE_WRITE, 0, O
28a10 50 45 4e 5f 41 4c 57 41 59 53 2c 0a 20 20 20 20  PEN_ALWAYS,.    
28a20 20 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 41            FILE_A
28a30 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 2c  TTRIBUTE_NORMAL,
28a40 20 30 29 3b 0a 20 20 69 66 28 20 21 78 2e 68 20   0);.  if( !x.h 
28a50 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
28a60 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
28a70 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c  "cannot open fil
28a80 65 3a 20 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  e: ", zFilename,
28a90 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
28aa0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
28ab0 3b 0a 20 20 7d 0a 20 20 65 76 20 3d 20 43 72 65  ;.  }.  ev = Cre
28ac0 61 74 65 45 76 65 6e 74 28 4e 55 4c 4c 2c 20 54  ateEvent(NULL, T
28ad0 52 55 45 2c 20 46 41 4c 53 45 2c 20 78 2e 65 76  RUE, FALSE, x.ev
28ae0 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28 20 21 65  Name);.  if ( !e
28af0 76 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  v ){.    Tcl_App
28b00 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
28b10 2c 20 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65  , "cannot create
28b20 20 65 76 65 6e 74 3a 20 22 2c 20 78 2e 65 76 4e   event: ", x.evN
28b30 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ame, (char*)0);.
28b40 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
28b50 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 5f 62 65 67  RROR;.  }.  _beg
28b60 69 6e 74 68 72 65 61 64 28 77 69 6e 33 32 5f 66  inthread(win32_f
28b70 69 6c 65 5f 6c 6f 63 6b 65 72 2c 20 30 2c 20 28  ile_locker, 0, (
28b80 76 6f 69 64 2a 29 26 78 29 3b 0a 20 20 53 6c 65  void*)&x);.  Sle
28b90 65 70 28 30 29 3b 0a 20 20 69 66 20 28 20 28 77  ep(0);.  if ( (w
28ba0 52 65 73 75 6c 74 20 3d 20 57 61 69 74 46 6f 72  Result = WaitFor
28bb0 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 65 76 2c  SingleObject(ev,
28bc0 20 31 30 30 30 30 29 29 21 3d 57 41 49 54 5f 4f   10000))!=WAIT_O
28bd0 42 4a 45 43 54 5f 30 20 29 7b 0a 20 20 20 20 73  BJECT_0 ){.    s
28be0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
28bf0 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42  sizeof(zBuf), zB
28c00 75 66 2c 20 22 30 78 25 78 22 2c 20 77 52 65 73  uf, "0x%x", wRes
28c10 75 6c 74 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70  ult);.    Tcl_Ap
28c20 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
28c30 70 2c 20 22 77 61 69 74 20 66 61 69 6c 65 64 3a  p, "wait failed:
28c40 20 22 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a   ", zBuf, (char*
28c50 29 30 29 3b 0a 20 20 20 20 43 6c 6f 73 65 48 61  )0);.    CloseHa
28c60 6e 64 6c 65 28 65 76 29 3b 0a 20 20 20 20 72 65  ndle(ev);.    re
28c70 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
28c80 20 20 7d 0a 20 20 43 6c 6f 73 65 48 61 6e 64 6c    }.  CloseHandl
28c90 65 28 65 76 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(ev);.  return 
28ca0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
28cb0 0a 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 6f 70  .../*.**      op
28cc0 74 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72  timization_contr
28cd0 6f 6c 20 44 42 20 4f 50 54 20 42 4f 4f 4c 45 41  ol DB OPT BOOLEA
28ce0 4e 0a 2a 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f  N.**.** Enable o
28cf0 72 20 64 69 73 61 62 6c 65 20 71 75 65 72 79 20  r disable query 
28d00 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 75 73  optimizations us
28d10 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ing the sqlite3_
28d20 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 29 0a 2a  test_control().*
28d30 2a 20 69 6e 74 65 72 66 61 63 65 2e 20 20 44 69  * interface.  Di
28d40 73 61 62 6c 65 20 69 66 20 42 4f 4f 4c 45 41 4e  sable if BOOLEAN
28d50 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20 65 6e   is false and en
28d60 61 62 6c 65 20 69 66 20 42 4f 4f 4c 45 41 4e 20  able if BOOLEAN 
28d70 69 73 20 74 72 75 65 2e 0a 2a 2a 20 4f 50 54 20  is true..** OPT 
28d80 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
28d90 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
28da0 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64 2e 0a  to be disabled..
28db0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70  */.static int op
28dc0 74 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72  timization_contr
28dd0 6f 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ol(.  void * cli
28de0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
28df0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
28e00 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
28e10 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
28e20 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  [].){.  int i;. 
28e30 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
28e40 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 74  const char *zOpt
28e50 3b 0a 20 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a 20  ;.  int onoff;. 
28e60 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 20   int mask = 0;. 
28e70 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
28e80 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74  ruct {.    const
28e90 20 63 68 61 72 20 2a 7a 4f 70 74 4e 61 6d 65 3b   char *zOptName;
28ea0 0a 20 20 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 20  .    int mask;. 
28eb0 20 7d 20 61 4f 70 74 5b 5d 20 3d 20 7b 0a 20 20   } aOpt[] = {.  
28ec0 20 20 7b 20 22 61 6c 6c 22 2c 20 20 20 20 20 20    { "all",      
28ed0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 41          SQLITE_A
28ee0 6c 6c 4f 70 74 73 20 20 20 20 20 20 20 20 7d 2c  llOpts        },
28ef0 0a 20 20 20 20 7b 20 22 71 75 65 72 79 2d 66 6c  .    { "query-fl
28f00 61 74 74 65 6e 65 72 22 2c 20 20 53 51 4c 49 54  attener",  SQLIT
28f10 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72  E_QueryFlattener
28f20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 6c 75 6d   },.    { "colum
28f30 6e 2d 63 61 63 68 65 22 2c 20 20 20 20 20 53 51  n-cache",     SQ
28f40 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65  LITE_ColumnCache
28f50 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 67 72      },.    { "gr
28f60 6f 75 70 62 79 2d 6f 72 64 65 72 22 2c 20 20 20  oupby-order",   
28f70 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f   SQLITE_GroupByO
28f80 72 64 65 72 20 20 20 7d 2c 0a 20 20 20 20 7b 20  rder   },.    { 
28f90 22 66 61 63 74 6f 72 2d 63 6f 6e 73 74 61 6e 74  "factor-constant
28fa0 73 22 2c 20 53 51 4c 49 54 45 5f 46 61 63 74 6f  s", SQLITE_Facto
28fb0 72 4f 75 74 43 6f 6e 73 74 20 7d 2c 0a 20 20 20  rOutConst },.   
28fc0 20 7b 20 22 72 65 61 6c 2d 61 73 2d 69 6e 74 22   { "real-as-int"
28fd0 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 64  ,      SQLITE_Id
28fe0 78 52 65 61 6c 41 73 49 6e 74 20 20 20 7d 2c 0a  xRealAsInt   },.
28ff0 20 20 20 20 7b 20 22 64 69 73 74 69 6e 63 74 2d      { "distinct-
29000 6f 70 74 22 2c 20 20 20 20 20 53 51 4c 49 54 45  opt",     SQLITE
29010 5f 44 69 73 74 69 6e 63 74 4f 70 74 20 20 20 20  _DistinctOpt    
29020 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 76 65 72 2d  },.    { "cover-
29030 69 64 78 2d 73 63 61 6e 22 2c 20 20 20 53 51 4c  idx-scan",   SQL
29040 49 54 45 5f 43 6f 76 65 72 49 64 78 53 63 61 6e  ITE_CoverIdxScan
29050 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 72 64     },.    { "ord
29060 65 72 2d 62 79 2d 69 64 78 2d 6a 6f 69 6e 22 2c  er-by-idx-join",
29070 53 51 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64  SQLITE_OrderById
29080 78 4a 6f 69 6e 20 7d 2c 0a 20 20 7d 3b 0a 0a 20  xJoin },.  };.. 
29090 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
290a0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
290b0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
290c0 6f 62 6a 76 2c 20 22 44 42 20 4f 50 54 20 42 4f  objv, "DB OPT BO
290d0 4f 4c 45 41 4e 22 29 3b 0a 20 20 20 20 72 65 74  OLEAN");.    ret
290e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
290f0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
29100 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
29110 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
29120 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
29130 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
29140 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c   if( Tcl_GetBool
29150 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
29160 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6f 6e 6f  p, objv[3], &ono
29170 66 66 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ff) ) return TCL
29180 5f 45 52 52 4f 52 3b 0a 20 20 7a 4f 70 74 20 3d  _ERROR;.  zOpt =
29190 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
291a0 62 6a 76 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69  bjv[2]);.  for(i
291b0 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f 70  =0; i<sizeof(aOp
291c0 74 29 2f 73 69 7a 65 6f 66 28 61 4f 70 74 5b 30  t)/sizeof(aOpt[0
291d0 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ]); i++){.    if
291e0 28 20 73 74 72 63 6d 70 28 7a 4f 70 74 2c 20 61  ( strcmp(zOpt, a
291f0 4f 70 74 5b 69 5d 2e 7a 4f 70 74 4e 61 6d 65 29  Opt[i].zOptName)
29200 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 61 73  ==0 ){.      mas
29210 6b 20 3d 20 61 4f 70 74 5b 69 5d 2e 6d 61 73 6b  k = aOpt[i].mask
29220 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
29230 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f     }.  }.  if( o
29240 6e 6f 66 66 20 29 20 6d 61 73 6b 20 3d 20 7e 6d  noff ) mask = ~m
29250 61 73 6b 3b 0a 20 20 69 66 28 20 69 3e 3d 73 69  ask;.  if( i>=si
29260 7a 65 6f 66 28 61 4f 70 74 29 2f 73 69 7a 65 6f  zeof(aOpt)/sizeo
29270 66 28 61 4f 70 74 5b 30 5d 29 20 29 7b 0a 20 20  f(aOpt[0]) ){.  
29280 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
29290 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e  lt(interp, "unkn
292a0 6f 77 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  own optimization
292b0 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65   - should be one
292c0 20 6f 66 3a 22 2c 0a 20 20 20 20 20 20 20 20 20   of:",.         
292d0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
292e0 72 2a 29 30 29 3b 0a 20 20 20 20 66 6f 72 28 69  r*)0);.    for(i
292f0 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f 70  =0; i<sizeof(aOp
29300 74 29 2f 73 69 7a 65 6f 66 28 61 4f 70 74 5b 30  t)/sizeof(aOpt[0
29310 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ]); i++){.      
29320 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
29330 28 69 6e 74 65 72 70 2c 20 22 20 22 2c 20 61 4f  (interp, " ", aO
29340 70 74 5b 69 5d 2e 7a 4f 70 74 4e 61 6d 65 29 3b  pt[i].zOptName);
29350 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
29360 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
29370 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  .  sqlite3_test_
29380 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
29390 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41  ESTCTRL_OPTIMIZA
293a0 54 49 4f 4e 53 2c 20 64 62 2c 20 6d 61 73 6b 29  TIONS, db, mask)
293b0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
293c0 4b 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74  K;.}..typedef st
293d0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 61 70 69  ruct sqlite3_api
293e0 5f 72 6f 75 74 69 6e 65 73 20 73 71 6c 69 74 65  _routines sqlite
293f0 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 3b 0a  3_api_routines;.
29400 2f 2a 0a 2a 2a 20 20 20 20 20 6c 6f 61 64 5f 73  /*.**     load_s
29410 74 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 20  tatic_extension 
29420 44 42 20 4e 41 4d 45 20 2e 2e 2e 0a 2a 2a 0a 2a  DB NAME ....**.*
29430 2a 20 4c 6f 61 64 20 6f 6e 65 20 6f 72 20 6d 6f  * Load one or mo
29440 72 65 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69  re statically li
29450 6e 6b 65 64 20 65 78 74 65 6e 73 69 6f 6e 73 2e  nked extensions.
29460 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
29470 63 6c 4c 6f 61 64 53 74 61 74 69 63 45 78 74 65  clLoadStaticExte
29480 6e 73 69 6f 6e 43 6d 64 28 0a 20 20 76 6f 69 64  nsionCmd(.  void
29490 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
294a0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
294b0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
294c0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
294d0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 65 78  T objv[].){.  ex
294e0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
294f0 5f 61 6d 61 74 63 68 5f 69 6e 69 74 28 73 71 6c  _amatch_init(sql
29500 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e  ite3*,char**,con
29510 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
29520 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74  outines*);.  ext
29530 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
29540 63 6c 6f 73 75 72 65 5f 69 6e 69 74 28 73 71 6c  closure_init(sql
29550 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e  ite3*,char**,con
29560 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
29570 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74  outines*);.  ext
29580 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
29590 66 75 7a 7a 65 72 5f 69 6e 69 74 28 73 71 6c 69  fuzzer_init(sqli
295a0 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73  te3*,char**,cons
295b0 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
295c0 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65  utines*);.  exte
295d0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
295e0 65 65 65 5f 69 6e 69 74 28 73 71 6c 69 74 65 33  eee_init(sqlite3
295f0 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73  *,char**,const s
29600 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69  qlite3_api_routi
29610 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20  nes*);.  extern 
29620 69 6e 74 20 73 71 6c 69 74 65 33 5f 6e 65 78 74  int sqlite3_next
29630 63 68 61 72 5f 69 6e 69 74 28 73 71 6c 69 74 65  char_init(sqlite
29640 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20  3*,char**,const 
29650 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
29660 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e  ines*);.  extern
29670 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 72 65 67   int sqlite3_reg
29680 65 78 70 5f 69 6e 69 74 28 73 71 6c 69 74 65 33  exp_init(sqlite3
29690 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73  *,char**,const s
296a0 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69  qlite3_api_routi
296b0 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20  nes*);.  extern 
296c0 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 70 65 6c  int sqlite3_spel
296d0 6c 66 69 78 5f 69 6e 69 74 28 73 71 6c 69 74 65  lfix_init(sqlite
296e0 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20  3*,char**,const 
296f0 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
29700 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e  ines*);.  extern
29710 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 68 6f   int sqlite3_who
29720 6c 65 6e 75 6d 62 65 72 5f 69 6e 69 74 28 73 71  lenumber_init(sq
29730 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f  lite3*,char**,co
29740 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f  nst sqlite3_api_
29750 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 73 74  routines*);.  st
29760 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
29770 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  t {.    const ch
29780 61 72 20 2a 7a 45 78 74 4e 61 6d 65 3b 0a 20 20  ar *zExtName;.  
29790 20 20 69 6e 74 20 28 2a 70 49 6e 69 74 29 28 73    int (*pInit)(s
297a0 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63  qlite3*,char**,c
297b0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69  onst sqlite3_api
297c0 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 7d  _routines*);.  }
297d0 20 61 45 78 74 65 6e 73 69 6f 6e 5b 5d 20 3d 20   aExtension[] = 
297e0 7b 0a 20 20 20 20 7b 20 22 61 6d 61 74 63 68 22  {.    { "amatch"
297f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29800 20 73 71 6c 69 74 65 33 5f 61 6d 61 74 63 68 5f   sqlite3_amatch_
29810 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20  init            
29820 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6c 6f     },.    { "clo
29830 73 75 72 65 22 2c 20 20 20 20 20 20 20 20 20 20  sure",          
29840 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f       sqlite3_clo
29850 73 75 72 65 5f 69 6e 69 74 20 20 20 20 20 20 20  sure_init       
29860 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
29870 22 66 75 7a 7a 65 72 22 2c 20 20 20 20 20 20 20  "fuzzer",       
29880 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
29890 5f 66 75 7a 7a 65 72 5f 69 6e 69 74 20 20 20 20  _fuzzer_init    
298a0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
298b0 20 20 7b 20 22 69 65 65 65 37 35 34 22 2c 20 20    { "ieee754",  
298c0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
298d0 69 74 65 33 5f 69 65 65 65 5f 69 6e 69 74 20 20  ite3_ieee_init  
298e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
298f0 2c 0a 20 20 20 20 7b 20 22 6e 65 78 74 63 68 61  ,.    { "nextcha
29900 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  r",             
29910 20 73 71 6c 69 74 65 33 5f 6e 65 78 74 63 68 61   sqlite3_nextcha
29920 72 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20  r_init          
29930 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 65 67     },.    { "reg
29940 65 78 70 22 2c 20 20 20 20 20 20 20 20 20 20 20  exp",           
29950 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 67       sqlite3_reg
29960 65 78 70 5f 69 6e 69 74 20 20 20 20 20 20 20 20  exp_init        
29970 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
29980 22 73 70 65 6c 6c 66 69 78 22 2c 20 20 20 20 20  "spellfix",     
29990 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
299a0 5f 73 70 65 6c 6c 66 69 78 5f 69 6e 69 74 20 20  _spellfix_init  
299b0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
299c0 20 20 7b 20 22 77 68 6f 6c 65 6e 75 6d 62 65 72    { "wholenumber
299d0 22 2c 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ",           sql
299e0 69 74 65 33 5f 77 68 6f 6c 65 6e 75 6d 62 65 72  ite3_wholenumber
299f0 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 7d  _init          }
29a00 2c 0a 20 20 7d 3b 0a 20 20 73 71 6c 69 74 65 33  ,.  };.  sqlite3
29a10 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *db;.  const ch
29a20 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74  ar *zName;.  int
29a30 20 69 2c 20 6a 2c 20 72 63 3b 0a 20 20 63 68 61   i, j, rc;.  cha
29a40 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
29a50 20 20 69 66 28 20 6f 62 6a 63 3c 33 20 29 7b 0a    if( objc<3 ){.
29a60 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
29a70 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
29a80 6f 62 6a 76 2c 20 22 44 42 20 4e 41 4d 45 20 2e  objv, "DB NAME .
29a90 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ..");.    return
29aa0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
29ab0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
29ac0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
29ad0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
29ae0 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
29af0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 66 6f   TCL_ERROR;.  fo
29b00 72 28 6a 3d 32 3b 20 6a 3c 6f 62 6a 63 3b 20 6a  r(j=2; j<objc; j
29b10 2b 2b 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  ++){.    zName =
29b20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
29b30 62 6a 76 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72  bjv[j]);.    for
29b40 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
29b50 65 28 61 45 78 74 65 6e 73 69 6f 6e 29 3b 20 69  e(aExtension); i
29b60 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
29b70 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 45 78  trcmp(zName, aEx
29b80 74 65 6e 73 69 6f 6e 5b 69 5d 2e 7a 45 78 74 4e  tension[i].zExtN
29b90 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
29ba0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
29bb0 3e 3d 41 72 72 61 79 53 69 7a 65 28 61 45 78 74  >=ArraySize(aExt
29bc0 65 6e 73 69 6f 6e 29 20 29 7b 0a 20 20 20 20 20  ension) ){.     
29bd0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
29be0 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 73 75  t(interp, "no su
29bf0 63 68 20 65 78 74 65 6e 73 69 6f 6e 3a 20 22 2c  ch extension: ",
29c00 20 7a 4e 61 6d 65 2c 20 28 63 68 61 72 2a 29 30   zName, (char*)0
29c10 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
29c20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
29c30 0a 20 20 20 20 72 63 20 3d 20 61 45 78 74 65 6e  .    rc = aExten
29c40 73 69 6f 6e 5b 69 5d 2e 70 49 6e 69 74 28 64 62  sion[i].pInit(db
29c50 2c 20 26 7a 45 72 72 4d 73 67 2c 20 30 29 3b 0a  , &zErrMsg, 0);.
29c60 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
29c70 54 45 5f 4f 4b 20 7c 7c 20 7a 45 72 72 4d 73 67  TE_OK || zErrMsg
29c80 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
29c90 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
29ca0 70 2c 20 22 69 6e 69 74 69 61 6c 69 7a 61 74 69  p, "initializati
29cb0 6f 6e 20 6f 66 20 22 2c 20 7a 4e 61 6d 65 2c 20  on of ", zName, 
29cc0 22 20 66 61 69 6c 65 64 3a 20 22 2c 20 7a 45 72  " failed: ", zEr
29cd0 72 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20  rMsg,.          
29ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
29cf0 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71  ar*)0);.      sq
29d00 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
29d10 73 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  sg);.      retur
29d20 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
29d30 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
29d40 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TCL_OK;.}.../*.*
29d50 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6d 6d 61  * Register comma
29d60 6e 64 73 20 77 69 74 68 20 74 68 65 20 54 43 4c  nds with the TCL
29d70 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f   interpreter..*/
29d80 0a 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 31  .int Sqlitetest1
29d90 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
29da0 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 65 78 74   *interp){.  ext
29db0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
29dc0 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 20 20  search_count;.  
29dd0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
29de0 65 33 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74 3b 0a  e3_found_count;.
29df0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
29e00 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63  ite3_interrupt_c
29e10 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69  ount;.  extern i
29e20 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  nt sqlite3_open_
29e30 66 69 6c 65 5f 63 6f 75 6e 74 3b 0a 20 20 65 78  file_count;.  ex
29e40 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
29e50 5f 73 6f 72 74 5f 63 6f 75 6e 74 3b 0a 20 20 65  _sort_count;.  e
29e60 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
29e70 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 3b 0a  3_current_time;.
29e80 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e  #if SQLITE_OS_UN
29e90 49 58 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  IX && defined(__
29ea0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
29eb0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
29ec0 47 5f 53 54 59 4c 45 0a 20 20 65 78 74 65 72 6e  G_STYLE.  extern
29ed0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 68 6f 73   int sqlite3_hos
29ee0 74 69 64 5f 6e 75 6d 3b 0a 23 65 6e 64 69 66 0a  tid_num;.#endif.
29ef0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
29f00 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a  ite3_max_blobsiz
29f10 65 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  e;.  extern int 
29f20 73 71 6c 69 74 65 33 42 74 72 65 65 53 68 61 72  sqlite3BtreeShar
29f30 65 64 43 61 63 68 65 52 65 70 6f 72 74 28 76 6f  edCacheReport(vo
29f40 69 64 2a 2c 0a 20 20 20 20 20 20 20 20 20 20 20  id*,.           
29f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
29f70 63 6c 5f 49 6e 74 65 72 70 2a 2c 69 6e 74 2c 54  cl_Interp*,int,T
29f80 63 6c 5f 4f 62 6a 2a 43 4f 4e 53 54 2a 29 3b 0a  cl_Obj*CONST*);.
29f90 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20    static struct 
29fa0 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  {.     char *zNa
29fb0 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f 43 6d 64  me;.     Tcl_Cmd
29fc0 50 72 6f 63 20 2a 78 50 72 6f 63 3b 0a 20 20 7d  Proc *xProc;.  }
29fd0 20 61 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20   aCmd[] = {.    
29fe0 20 7b 20 22 64 62 5f 65 6e 74 65 72 22 2c 20 20   { "db_enter",  
29ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a000 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2a010 2a 29 64 62 5f 65 6e 74 65 72 20 20 20 20 20 20  *)db_enter      
2a020 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2a030 20 7b 20 22 64 62 5f 6c 65 61 76 65 22 2c 20 20   { "db_leave",  
2a040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a050 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2a060 2a 29 64 62 5f 6c 65 61 76 65 20 20 20 20 20 20  *)db_leave      
2a070 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2a080 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69   { "sqlite3_mpri
2a090 6e 74 66 5f 69 6e 74 22 2c 20 20 20 20 20 20 20  ntf_int",       
2a0a0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2a0b0 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  *)sqlite3_mprint
2a0c0 66 5f 69 6e 74 20 20 20 20 7d 2c 0a 20 20 20 20  f_int    },.    
2a0d0 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69   { "sqlite3_mpri
2a0e0 6e 74 66 5f 69 6e 74 36 34 22 2c 20 20 20 20 20  ntf_int64",     
2a0f0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2a100 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  *)sqlite3_mprint
2a110 66 5f 69 6e 74 36 34 20 20 7d 2c 0a 20 20 20 20  f_int64  },.    
2a120 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69   { "sqlite3_mpri
2a130 6e 74 66 5f 6c 6f 6e 67 22 2c 20 20 20 20 20 20  ntf_long",      
2a140 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2a150 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  *)sqlite3_mprint
2a160 66 5f 6c 6f 6e 67 20 20 20 7d 2c 0a 20 20 20 20  f_long   },.    
2a170 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69   { "sqlite3_mpri
2a180 6e 74 66 5f 73 74 72 22 2c 20 20 20 20 20 20 20  ntf_str",       
2a190 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2a1a0 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  *)sqlite3_mprint
2a1b0 66 5f 73 74 72 20 20 20 20 7d 2c 0a 20 20 20 20  f_str    },.    
2a1c0 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6e 70 72   { "sqlite3_snpr
2a1d0 69 6e 74 66 5f 73 74 72 22 2c 20 20 20 20 20 20  intf_str",      
2a1e0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2a1f0 2a 29 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e  *)sqlite3_snprin
2a200 74 66 5f 73 74 72 20 20 20 7d 2c 0a 20 20 20 20  tf_str   },.    
2a210 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69   { "sqlite3_mpri
2a220 6e 74 66 5f 73 74 72 6f 6e 6c 79 22 2c 20 20 20  ntf_stronly",   
2a230 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2a240 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  *)sqlite3_mprint
2a250 66 5f 73 74 72 6f 6e 6c 79 7d 2c 0a 20 20 20 20  f_stronly},.    
2a260 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69   { "sqlite3_mpri
2a270 6e 74 66 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20  ntf_double",    
2a280 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2a290 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  *)sqlite3_mprint
2a2a0 66 5f 64 6f 75 62 6c 65 20 7d 2c 0a 20 20 20 20  f_double },.    
2a2b0 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69   { "sqlite3_mpri
2a2c0 6e 74 66 5f 73 63 61 6c 65 64 22 2c 20 20 20 20  ntf_scaled",    
2a2d0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2a2e0 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  *)sqlite3_mprint
2a2f0 66 5f 73 63 61 6c 65 64 20 7d 2c 0a 20 20 20 20  f_scaled },.    
2a300 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69   { "sqlite3_mpri
2a310 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65 22 2c 20  ntf_hexdouble", 
2a320 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
2a330 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
2a340 68 65 78 64 6f 75 62 6c 65 7d 2c 0a 20 20 20 20  hexdouble},.    
2a350 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69   { "sqlite3_mpri
2a360 6e 74 66 5f 7a 5f 74 65 73 74 22 2c 20 20 20 20  ntf_z_test",    
2a370 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2a380 2a 29 74 65 73 74 5f 6d 70 72 69 6e 74 66 5f 7a  *)test_mprintf_z
2a390 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
2a3a0 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  { "sqlite3_mprin
2a3b0 74 66 5f 6e 5f 74 65 73 74 22 2c 20 20 20 20 20  tf_n_test",     
2a3c0 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
2a3d0 29 74 65 73 74 5f 6d 70 72 69 6e 74 66 5f 6e 20  )test_mprintf_n 
2a3e0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
2a3f0 20 22 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e   "sqlite3_snprin
2a400 74 66 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20  tf_int",        
2a410 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
2a420 74 65 73 74 5f 73 6e 70 72 69 6e 74 66 5f 69 6e  test_snprintf_in
2a430 74 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20  t     },.     { 
2a440 22 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e  "sqlite3_last_in
2a450 73 65 72 74 5f 72 6f 77 69 64 22 2c 20 20 20 20  sert_rowid",    
2a460 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
2a470 65 73 74 5f 6c 61 73 74 5f 72 6f 77 69 64 20 20  est_last_rowid  
2a480 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
2a490 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 70 72 69  sqlite3_exec_pri
2a4a0 6e 74 66 22 2c 20 20 20 20 20 20 20 20 20 20 20  ntf",           
2a4b0 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
2a4c0 73 74 5f 65 78 65 63 5f 70 72 69 6e 74 66 20 20  st_exec_printf  
2a4d0 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
2a4e0 71 6c 69 74 65 33 5f 65 78 65 63 5f 68 65 78 22  qlite3_exec_hex"
2a4f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
2a500 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
2a510 74 5f 65 78 65 63 5f 68 65 78 20 20 20 20 20 20  t_exec_hex      
2a520 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
2a530 6c 69 74 65 33 5f 65 78 65 63 22 2c 20 20 20 20  lite3_exec",    
2a540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
2a550 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
2a560 5f 65 78 65 63 20 20 20 20 20 20 20 20 20 20 20  _exec           
2a570 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2a580 69 74 65 33 5f 65 78 65 63 5f 6e 72 22 2c 20 20  ite3_exec_nr",  
2a590 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
2a5a0 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
2a5b0 65 78 65 63 5f 6e 72 20 20 20 20 20 20 20 20 20  exec_nr         
2a5c0 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   },.#ifndef SQLI
2a5d0 54 45 5f 4f 4d 49 54 5f 47 45 54 5f 54 41 42 4c  TE_OMIT_GET_TABL
2a5e0 45 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  E.     { "sqlite
2a5f0 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e  3_get_table_prin
2a600 74 66 22 2c 20 20 20 20 20 20 28 54 63 6c 5f 43  tf",      (Tcl_C
2a610 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 67 65 74  mdProc*)test_get
2a620 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 20 7d 2c  _table_printf },
2a630 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22  .#endif.     { "
2a640 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 22 2c 20  sqlite3_close", 
2a650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a660 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71  (Tcl_CmdProc*)sq
2a670 6c 69 74 65 5f 74 65 73 74 5f 63 6c 6f 73 65 20  lite_test_close 
2a680 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
2a690 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 22  qlite3_close_v2"
2a6a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
2a6b0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
2a6c0 69 74 65 5f 74 65 73 74 5f 63 6c 6f 73 65 5f 76  ite_test_close_v
2a6d0 32 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  2  },.     { "sq
2a6e0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
2a6f0 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 28 54  ction",       (T
2a700 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
2a710 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
2a720 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2a730 69 74 65 33 5f 63 72 65 61 74 65 5f 61 67 67 72  ite3_create_aggr
2a740 65 67 61 74 65 22 2c 20 20 20 20 20 20 28 54 63  egate",      (Tc
2a750 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
2a760 63 72 65 61 74 65 5f 61 67 67 72 65 67 61 74 65  create_aggregate
2a770 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2a780 74 65 5f 72 65 67 69 73 74 65 72 5f 74 65 73 74  te_register_test
2a790 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 28 54 63 6c  _function", (Tcl
2a7a0 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 72  _CmdProc*)test_r
2a7b0 65 67 69 73 74 65 72 5f 66 75 6e 63 20 20 20 20  egister_func    
2a7c0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2a7d0 65 5f 61 62 6f 72 74 22 2c 20 20 20 20 20 20 20  e_abort",       
2a7e0 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
2a7f0 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f  CmdProc*)sqlite_
2a800 61 62 6f 72 74 20 20 20 20 20 20 20 20 20 20 7d  abort          }
2a810 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2a820 5f 62 69 6e 64 22 2c 20 20 20 20 20 20 20 20 20  _bind",         
2a830 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
2a840 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 62 69 6e  mdProc*)test_bin
2a850 64 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  d             },
2a860 0a 20 20 20 20 20 7b 20 22 62 72 65 61 6b 70 6f  .     { "breakpo
2a870 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  int",           
2a880 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
2a890 64 50 72 6f 63 2a 29 74 65 73 74 5f 62 72 65 61  dProc*)test_brea
2a8a0 6b 70 6f 69 6e 74 20 20 20 20 20 20 20 7d 2c 0a  kpoint       },.
2a8b0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2a8c0 6b 65 79 22 2c 20 20 20 20 20 20 20 20 20 20 20  key",           
2a8d0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
2a8e0 50 72 6f 63 2a 29 74 65 73 74 5f 6b 65 79 20 20  Proc*)test_key  
2a8f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
2a900 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 72      { "sqlite3_r
2a910 65 6b 65 79 22 2c 20 20 20 20 20 20 20 20 20 20  ekey",          
2a920 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
2a930 72 6f 63 2a 29 74 65 73 74 5f 72 65 6b 65 79 20  roc*)test_rekey 
2a940 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2a950 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 73 65 74     { "sqlite_set
2a960 5f 6d 61 67 69 63 22 2c 20 20 20 20 20 20 20 20  _magic",        
2a970 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
2a980 6f 63 2a 29 73 71 6c 69 74 65 5f 73 65 74 5f 6d  oc*)sqlite_set_m
2a990 61 67 69 63 20 20 20 20 20 20 7d 2c 0a 20 20 20  agic      },.   
2a9a0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 69 6e 74    { "sqlite3_int
2a9b0 65 72 72 75 70 74 22 2c 20 20 20 20 20 20 20 20  errupt",        
2a9c0 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
2a9d0 63 2a 29 74 65 73 74 5f 69 6e 74 65 72 72 75 70  c*)test_interrup
2a9e0 74 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  t        },.    
2a9f0 20 7b 20 22 73 71 6c 69 74 65 5f 64 65 6c 65 74   { "sqlite_delet
2aa00 65 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20  e_function",    
2aa10 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2aa20 2a 29 64 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f  *)delete_functio
2aa30 6e 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  n       },.     
2aa40 7b 20 22 73 71 6c 69 74 65 5f 64 65 6c 65 74 65  { "sqlite_delete
2aa50 5f 63 6f 6c 6c 61 74 69 6f 6e 22 2c 20 20 20 20  _collation",    
2aa60 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
2aa70 29 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f  )delete_collatio
2aa80 6e 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b  n      },.     {
2aa90 20 22 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75   "sqlite3_get_au
2aaa0 74 6f 63 6f 6d 6d 69 74 22 2c 20 20 20 20 20 20  tocommit",      
2aab0 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
2aac0 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 20  get_autocommit  
2aad0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
2aae0 22 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 75  "sqlite3_stack_u
2aaf0 73 65 64 22 2c 20 20 20 20 20 20 20 20 20 20 20  sed",           
2ab00 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
2ab10 65 73 74 5f 73 74 61 63 6b 5f 75 73 65 64 20 20  est_stack_used  
2ab20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
2ab30 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d  sqlite3_busy_tim
2ab40 65 6f 75 74 22 2c 20 20 20 20 20 20 20 20 20 20  eout",          
2ab50 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
2ab60 73 74 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 20  st_busy_timeout 
2ab70 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 70      },.     { "p
2ab80 72 69 6e 74 66 22 2c 20 20 20 20 20 20 20 20 20  rintf",         
2ab90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2aba0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
2abb0 74 5f 70 72 69 6e 74 66 20 20 20 20 20 20 20 20  t_printf        
2abc0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
2abd0 6c 69 74 65 33 49 6f 54 72 61 63 65 22 2c 20 20  lite3IoTrace",  
2abe0 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
2abf0 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 69  _CmdProc*)test_i
2ac00 6f 5f 74 72 61 63 65 20 20 20 20 20 20 20 20 20  o_trace         
2ac10 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63  },.  };.  static
2ac20 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63   struct {.     c
2ac30 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
2ac40 20 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 20   Tcl_ObjCmdProc 
2ac50 2a 78 50 72 6f 63 3b 0a 20 20 20 20 20 76 6f 69  *xProc;.     voi
2ac60 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  d *clientData;. 
2ac70 20 7d 20 61 4f 62 6a 43 6d 64 5b 5d 20 3d 20 7b   } aObjCmd[] = {
2ac80 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2ac90 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e  _connection_poin
2aca0 74 65 72 22 2c 20 20 20 20 67 65 74 5f 73 71 6c  ter",    get_sql
2acb0 69 74 65 5f 70 6f 69 6e 74 65 72 2c 20 30 20 7d  ite_pointer, 0 }
2acc0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2acd0 33 5f 62 69 6e 64 5f 69 6e 74 22 2c 20 20 20 20  3_bind_int",    
2ace0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62            test_b
2acf0 69 6e 64 5f 69 6e 74 2c 20 20 20 20 20 20 30 20  ind_int,      0 
2ad00 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2ad10 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62  e3_bind_zeroblob
2ad20 22 2c 20 20 20 20 20 20 20 20 20 74 65 73 74 5f  ",         test_
2ad30 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 2c 20 30  bind_zeroblob, 0
2ad40 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2ad50 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 22 2c  te3_bind_int64",
2ad60 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
2ad70 5f 62 69 6e 64 5f 69 6e 74 36 34 2c 20 20 20 20  _bind_int64,    
2ad80 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
2ad90 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65  ite3_bind_double
2ada0 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ",           tes
2adb0 74 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 2c 20 20  t_bind_double,  
2adc0 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71   0 },.     { "sq
2add0 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 22  lite3_bind_null"
2ade0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ,             te
2adf0 73 74 5f 62 69 6e 64 5f 6e 75 6c 6c 20 20 20 20  st_bind_null    
2ae00 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
2ae10 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
2ae20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 74  ",             t
2ae30 65 73 74 5f 62 69 6e 64 5f 74 65 78 74 20 20 20  est_bind_text   
2ae40 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
2ae50 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
2ae60 74 31 36 22 2c 20 20 20 20 20 20 20 20 20 20 20  t16",           
2ae70 74 65 73 74 5f 62 69 6e 64 5f 74 65 78 74 31 36  test_bind_text16
2ae80 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
2ae90 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c  "sqlite3_bind_bl
2aea0 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ob",            
2aeb0 20 74 65 73 74 5f 62 69 6e 64 5f 62 6c 6f 62 20   test_bind_blob 
2aec0 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
2aed0 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70   "sqlite3_bind_p
2aee0 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 22 2c  arameter_count",
2aef0 20 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61    test_bind_para
2af00 6d 65 74 65 72 5f 63 6f 75 6e 74 2c 20 30 7d 2c  meter_count, 0},
2af10 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2af20 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
2af30 6e 61 6d 65 22 2c 20 20 20 74 65 73 74 5f 62 69  name",   test_bi
2af40 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
2af50 65 2c 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22  e,  0},.     { "
2af60 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
2af70 61 6d 65 74 65 72 5f 69 6e 64 65 78 22 2c 20 20  ameter_index",  
2af80 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65  test_bind_parame
2af90 74 65 72 5f 69 6e 64 65 78 2c 20 30 7d 2c 0a 20  ter_index, 0},. 
2afa0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
2afb0 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 22 2c 20  lear_bindings", 
2afc0 20 20 20 20 20 20 20 74 65 73 74 5f 63 6c 65 61         test_clea
2afd0 72 5f 62 69 6e 64 69 6e 67 73 2c 20 30 7d 2c 0a  r_bindings, 0},.
2afe0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2aff0 73 6c 65 65 70 22 2c 20 20 20 20 20 20 20 20 20  sleep",         
2b000 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 6c 65          test_sle
2b010 65 70 2c 20 20 20 20 20 20 20 20 20 20 30 7d 2c  ep,          0},
2b020 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2b030 5f 65 72 72 63 6f 64 65 22 2c 20 20 20 20 20 20  _errcode",      
2b040 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 65 72           test_er
2b050 72 63 6f 64 65 20 20 20 20 20 20 20 2c 30 20 7d  rcode       ,0 }
2b060 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2b070 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f  3_extended_errco
2b080 64 65 22 2c 20 20 20 20 20 20 74 65 73 74 5f 65  de",      test_e
2b090 78 5f 65 72 72 63 6f 64 65 20 20 20 20 2c 30 20  x_errcode    ,0 
2b0a0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2b0b0 65 33 5f 65 72 72 6d 73 67 22 2c 20 20 20 20 20  e3_errmsg",     
2b0c0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
2b0d0 65 72 72 6d 73 67 20 20 20 20 20 20 20 20 2c 30  errmsg        ,0
2b0e0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2b0f0 74 65 33 5f 65 72 72 6d 73 67 31 36 22 2c 20 20  te3_errmsg16",  
2b100 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
2b110 5f 65 72 72 6d 73 67 31 36 20 20 20 20 20 20 2c  _errmsg16      ,
2b120 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
2b130 69 74 65 33 5f 6f 70 65 6e 22 2c 20 20 20 20 20  ite3_open",     
2b140 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
2b150 74 5f 6f 70 65 6e 20 20 20 20 20 20 20 20 20 20  t_open          
2b160 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
2b170 6c 69 74 65 33 5f 6f 70 65 6e 31 36 22 2c 20 20  lite3_open16",  
2b180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
2b190 73 74 5f 6f 70 65 6e 31 36 20 20 20 20 20 20 20  st_open16       
2b1a0 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
2b1b0 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 22 2c  qlite3_open_v2",
2b1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
2b1d0 65 73 74 5f 6f 70 65 6e 5f 76 32 20 20 20 20 20  est_open_v2     
2b1e0 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
2b1f0 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65  sqlite3_complete
2b200 31 36 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  16",            
2b210 74 65 73 74 5f 63 6f 6d 70 6c 65 74 65 31 36 20  test_complete16 
2b220 20 20 20 2c 30 20 7d 2c 0a 0a 20 20 20 20 20 7b     ,0 },..     {
2b230 20 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72   "sqlite3_prepar
2b240 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
2b250 20 20 74 65 73 74 5f 70 72 65 70 61 72 65 20 20    test_prepare  
2b260 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
2b270 7b 20 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61  { "sqlite3_prepa
2b280 72 65 31 36 22 2c 20 20 20 20 20 20 20 20 20 20  re16",          
2b290 20 20 20 74 65 73 74 5f 70 72 65 70 61 72 65 31     test_prepare1
2b2a0 36 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20  6     ,0 },.    
2b2b0 20 7b 20 22 73 71 6c 69 74 65 33 5f 70 72 65 70   { "sqlite3_prep
2b2c0 61 72 65 5f 76 32 22 2c 20 20 20 20 20 20 20 20  are_v2",        
2b2d0 20 20 20 20 74 65 73 74 5f 70 72 65 70 61 72 65      test_prepare
2b2e0 5f 76 32 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20  _v2    ,0 },.   
2b2f0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 70 72 65    { "sqlite3_pre
2b300 70 61 72 65 5f 74 6b 74 33 31 33 34 22 2c 20 20  pare_tkt3134",  
2b310 20 20 20 20 20 74 65 73 74 5f 70 72 65 70 61 72       test_prepar
2b320 65 5f 74 6b 74 33 31 33 34 2c 20 30 7d 2c 0a 20  e_tkt3134, 0},. 
2b330 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 70      { "sqlite3_p
2b340 72 65 70 61 72 65 31 36 5f 76 32 22 2c 20 20 20  repare16_v2",   
2b350 20 20 20 20 20 20 20 74 65 73 74 5f 70 72 65 70         test_prep
2b360 61 72 65 31 36 5f 76 32 20 20 2c 30 20 7d 2c 0a  are16_v2  ,0 },.
2b370 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2b380 66 69 6e 61 6c 69 7a 65 22 2c 20 20 20 20 20 20  finalize",      
2b390 20 20 20 20 20 20 20 20 74 65 73 74 5f 66 69 6e          test_fin
2b3a0 61 6c 69 7a 65 20 20 20 20 20 20 2c 30 20 7d 2c  alize      ,0 },
2b3b0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2b3c0 5f 73 74 6d 74 5f 73 74 61 74 75 73 22 2c 20 20  _stmt_status",  
2b3d0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 74           test_st
2b3e0 6d 74 5f 73 74 61 74 75 73 20 20 20 2c 30 20 7d  mt_status   ,0 }
2b3f0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2b400 33 5f 72 65 73 65 74 22 2c 20 20 20 20 20 20 20  3_reset",       
2b410 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 72            test_r
2b420 65 73 65 74 20 20 20 20 20 20 20 20 20 2c 30 20  eset         ,0 
2b430 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2b440 65 33 5f 65 78 70 69 72 65 64 22 2c 20 20 20 20  e3_expired",    
2b450 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
2b460 65 78 70 69 72 65 64 20 20 20 20 20 20 20 2c 30  expired       ,0
2b470 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2b480 74 65 33 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e  te3_transfer_bin
2b490 64 69 6e 67 73 22 2c 20 20 20 20 20 74 65 73 74  dings",     test
2b4a0 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e 64 20 2c  _transfer_bind ,
2b4b0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
2b4c0 69 74 65 33 5f 63 68 61 6e 67 65 73 22 2c 20 20  ite3_changes",  
2b4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
2b4e0 74 5f 63 68 61 6e 67 65 73 20 20 20 20 20 20 20  t_changes       
2b4f0 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
2b500 6c 69 74 65 33 5f 73 74 65 70 22 2c 20 20 20 20  lite3_step",    
2b510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
2b520 73 74 5f 73 74 65 70 20 20 20 20 20 20 20 20 20  st_step         
2b530 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
2b540 71 6c 69 74 65 33 5f 73 71 6c 22 2c 20 20 20 20  qlite3_sql",    
2b550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
2b560 65 73 74 5f 73 71 6c 20 20 20 20 20 20 20 20 20  est_sql         
2b570 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
2b580 73 71 6c 69 74 65 33 5f 6e 65 78 74 5f 73 74 6d  sqlite3_next_stm
2b590 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  t",             
2b5a0 74 65 73 74 5f 6e 65 78 74 5f 73 74 6d 74 20 20  test_next_stmt  
2b5b0 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
2b5c0 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 72 65  "sqlite3_stmt_re
2b5d0 61 64 6f 6e 6c 79 22 2c 20 20 20 20 20 20 20 20  adonly",        
2b5e0 20 74 65 73 74 5f 73 74 6d 74 5f 72 65 61 64 6f   test_stmt_reado
2b5f0 6e 6c 79 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  nly ,0 },.     {
2b600 20 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62   "sqlite3_stmt_b
2b610 75 73 79 22 2c 20 20 20 20 20 20 20 20 20 20 20  usy",           
2b620 20 20 74 65 73 74 5f 73 74 6d 74 5f 62 75 73 79    test_stmt_busy
2b630 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
2b640 7b 20 22 75 73 65 73 5f 73 74 6d 74 5f 6a 6f 75  { "uses_stmt_jou
2b650 72 6e 61 6c 22 2c 20 20 20 20 20 20 20 20 20 20  rnal",          
2b660 20 20 20 75 73 65 73 5f 73 74 6d 74 5f 6a 6f 75     uses_stmt_jou
2b670 72 6e 61 6c 20 2c 30 20 7d 2c 0a 0a 20 20 20 20  rnal ,0 },..    
2b680 20 7b 20 22 73 71 6c 69 74 65 33 5f 72 65 6c 65   { "sqlite3_rele
2b690 61 73 65 5f 6d 65 6d 6f 72 79 22 2c 20 20 20 20  ase_memory",    
2b6a0 20 20 20 20 74 65 73 74 5f 72 65 6c 65 61 73 65      test_release
2b6b0 5f 6d 65 6d 6f 72 79 2c 20 20 20 20 20 30 7d 2c  _memory,     0},
2b6c0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2b6d0 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  _db_release_memo
2b6e0 72 79 22 2c 20 20 20 20 20 74 65 73 74 5f 64 62  ry",     test_db
2b6f0 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 2c  _release_memory,
2b700 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71    0},.     { "sq
2b710 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d  lite3_db_filenam
2b720 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65  e",           te
2b730 73 74 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 2c 20  st_db_filename, 
2b740 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
2b750 7b 20 22 73 71 6c 69 74 65 33 5f 64 62 5f 72 65  { "sqlite3_db_re
2b760 61 64 6f 6e 6c 79 22 2c 20 20 20 20 20 20 20 20  adonly",        
2b770 20 20 20 74 65 73 74 5f 64 62 5f 72 65 61 64 6f     test_db_reado
2b780 6e 6c 79 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  nly,        0},.
2b790 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2b7a0 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 22  soft_heap_limit"
2b7b0 2c 20 20 20 20 20 20 20 74 65 73 74 5f 73 6f 66  ,       test_sof
2b7c0 74 5f 68 65 61 70 5f 6c 69 6d 69 74 2c 20 20 20  t_heap_limit,   
2b7d0 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
2b7e0 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61  ite3_thread_clea
2b7f0 6e 75 70 22 2c 20 20 20 20 20 20 20 20 74 65 73  nup",        tes
2b800 74 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70  t_thread_cleanup
2b810 2c 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b  ,     0},.     {
2b820 20 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f   "sqlite3_pager_
2b830 72 65 66 63 6f 75 6e 74 73 22 2c 20 20 20 20 20  refcounts",     
2b840 20 20 74 65 73 74 5f 70 61 67 65 72 5f 72 65 66    test_pager_ref
2b850 63 6f 75 6e 74 73 2c 20 20 20 20 30 7d 2c 0a 0a  counts,    0},..
2b860 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2b870 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 22 2c  load_extension",
2b880 20 20 20 20 20 20 20 20 74 65 73 74 5f 6c 6f 61          test_loa
2b890 64 5f 65 78 74 65 6e 73 69 6f 6e 2c 20 20 20 20  d_extension,    
2b8a0 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
2b8b0 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64  ite3_enable_load
2b8c0 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 20 74 65 73  _extension", tes
2b8d0 74 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 2c 20 20  t_enable_load,  
2b8e0 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b        0},.     {
2b8f0 20 22 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64   "sqlite3_extend
2b900 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 22  ed_result_codes"
2b910 2c 20 74 65 73 74 5f 65 78 74 65 6e 64 65 64 5f  , test_extended_
2b920 72 65 73 75 6c 74 5f 63 6f 64 65 73 2c 20 30 7d  result_codes, 0}
2b930 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2b940 33 5f 6c 69 6d 69 74 22 2c 20 20 20 20 20 20 20  3_limit",       
2b950 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 6c            test_l
2b960 69 6d 69 74 2c 20 20 20 20 20 20 20 20 20 20 20  imit,           
2b970 20 20 20 20 20 20 30 7d 2c 0a 0a 20 20 20 20 20        0},..     
2b980 7b 20 22 73 61 76 65 5f 70 72 6e 67 5f 73 74 61  { "save_prng_sta
2b990 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  te",            
2b9a0 20 20 20 73 61 76 65 5f 70 72 6e 67 5f 73 74 61     save_prng_sta
2b9b0 74 65 2c 20 20 20 20 30 20 7d 2c 0a 20 20 20 20  te,    0 },.    
2b9c0 20 7b 20 22 72 65 73 74 6f 72 65 5f 70 72 6e 67   { "restore_prng
2b9d0 5f 73 74 61 74 65 22 2c 20 20 20 20 20 20 20 20  _state",        
2b9e0 20 20 20 20 72 65 73 74 6f 72 65 5f 70 72 6e 67      restore_prng
2b9f0 5f 73 74 61 74 65 2c 20 30 20 7d 2c 0a 20 20 20  _state, 0 },.   
2ba00 20 20 7b 20 22 72 65 73 65 74 5f 70 72 6e 67 5f    { "reset_prng_
2ba10 73 74 61 74 65 22 2c 20 20 20 20 20 20 20 20 20  state",         
2ba20 20 20 20 20 20 72 65 73 65 74 5f 70 72 6e 67 5f       reset_prng_
2ba30 73 74 61 74 65 2c 20 20 20 30 20 7d 2c 0a 20 20  state,   0 },.  
2ba40 20 20 20 7b 20 22 6f 70 74 69 6d 69 7a 61 74 69     { "optimizati
2ba50 6f 6e 5f 63 6f 6e 74 72 6f 6c 22 2c 20 20 20 20  on_control",    
2ba60 20 20 20 20 20 20 6f 70 74 69 6d 69 7a 61 74 69        optimizati
2ba70 6f 6e 5f 63 6f 6e 74 72 6f 6c 2c 30 7d 2c 0a 23  on_control,0},.#
2ba80 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
2ba90 0a 20 20 20 20 20 7b 20 22 6c 6f 63 6b 5f 77 69  .     { "lock_wi
2baa0 6e 33 32 5f 66 69 6c 65 22 2c 20 20 20 20 20 20  n32_file",      
2bab0 20 20 20 20 20 20 20 20 20 77 69 6e 33 32 5f 66           win32_f
2bac0 69 6c 65 5f 6c 6f 63 6b 2c 20 20 20 20 30 20 7d  ile_lock,    0 }
2bad0 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20  ,.#endif.     { 
2bae0 22 74 63 6c 5f 6f 62 6a 70 72 6f 63 22 2c 20 20  "tcl_objproc",  
2baf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb00 20 72 75 6e 41 73 4f 62 6a 50 72 6f 63 2c 20 20   runAsObjProc,  
2bb10 20 20 20 20 20 30 20 7d 2c 0a 0a 20 20 20 20 20       0 },..     
2bb20 2f 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  /* sqlite3_colum
2bb30 6e 5f 2a 28 29 20 41 50 49 20 2a 2f 0a 20 20 20  n_*() API */.   
2bb40 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
2bb50 75 6d 6e 5f 63 6f 75 6e 74 22 2c 20 20 20 20 20  umn_count",     
2bb60 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e       test_column
2bb70 5f 63 6f 75 6e 74 20 20 2c 30 20 7d 2c 0a 20 20  _count  ,0 },.  
2bb80 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 64 61     { "sqlite3_da
2bb90 74 61 5f 63 6f 75 6e 74 22 2c 20 20 20 20 20 20  ta_count",      
2bba0 20 20 20 20 20 20 74 65 73 74 5f 64 61 74 61 5f        test_data_
2bbb0 63 6f 75 6e 74 20 20 20 20 2c 30 20 7d 2c 0a 20  count    ,0 },. 
2bbc0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
2bbd0 6f 6c 75 6d 6e 5f 74 79 70 65 22 2c 20 20 20 20  olumn_type",    
2bbe0 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75         test_colu
2bbf0 6d 6e 5f 74 79 70 65 20 20 20 2c 30 20 7d 2c 0a  mn_type   ,0 },.
2bc00 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2bc10 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 22 2c 20 20 20  column_blob",   
2bc20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c          test_col
2bc30 75 6d 6e 5f 62 6c 6f 62 20 20 20 2c 30 20 7d 2c  umn_blob   ,0 },
2bc40 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2bc50 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 22 2c  _column_double",
2bc60 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f           test_co
2bc70 6c 75 6d 6e 5f 64 6f 75 62 6c 65 20 2c 30 20 7d  lumn_double ,0 }
2bc80 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2bc90 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 22 2c  3_column_int64",
2bca0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63            test_c
2bcb0 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20 20 2c 30 20  olumn_int64  ,0 
2bcc0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2bcd0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 22 2c  e3_column_text",
2bce0 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66     test_stmt_utf
2bcf0 38 2c 20 20 28 76 6f 69 64 2a 29 73 71 6c 69 74  8,  (void*)sqlit
2bd00 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 7d  e3_column_text }
2bd10 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2bd20 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 22 2c 20  3_column_name", 
2bd30 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38    test_stmt_utf8
2bd40 2c 20 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65  ,  (void*)sqlite
2bd50 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 7d 2c  3_column_name },
2bd60 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2bd70 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 22 2c 20 20 20  _column_int",   
2bd80 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20   test_stmt_int, 
2bd90 20 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33    (void*)sqlite3
2bda0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 20 20 7d 2c 0a  _column_int  },.
2bdb0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2bdc0 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 22 2c 20 20  column_bytes",  
2bdd0 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 20  test_stmt_int,  
2bde0 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f   (void*)sqlite3_
2bdf0 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 7d 2c 0a 23  column_bytes},.#
2be00 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2be10 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 20 20  IT_DECLTYPE.    
2be20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
2be30 6d 6e 5f 64 65 63 6c 74 79 70 65 22 2c 74 65 73  mn_decltype",tes
2be40 74 5f 73 74 6d 74 5f 75 74 66 38 2c 28 76 6f 69  t_stmt_utf8,(voi
2be50 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
2be60 6e 5f 64 65 63 6c 74 79 70 65 7d 2c 0a 23 65 6e  n_decltype},.#en
2be70 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
2be80 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
2be90 4d 45 54 41 44 41 54 41 0a 7b 20 22 73 71 6c 69  METADATA.{ "sqli
2bea0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62  te3_column_datab
2beb0 61 73 65 5f 6e 61 6d 65 22 2c 74 65 73 74 5f 73  ase_name",test_s
2bec0 74 6d 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29  tmt_utf8,(void*)
2bed0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
2bee0 61 74 61 62 61 73 65 5f 6e 61 6d 65 7d 2c 0a 7b  atabase_name},.{
2bef0 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
2bf00 5f 74 61 62 6c 65 5f 6e 61 6d 65 22 2c 74 65 73  _table_name",tes
2bf10 74 5f 73 74 6d 74 5f 75 74 66 38 2c 28 76 6f 69  t_stmt_utf8,(voi
2bf20 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
2bf30 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 7d 2c 0a 7b  n_table_name},.{
2bf40 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
2bf50 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 22 2c 74 65  _origin_name",te
2bf60 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 28 76 6f  st_stmt_utf8,(vo
2bf70 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  id*)sqlite3_colu
2bf80 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 7d 2c  mn_origin_name},
2bf90 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
2bfa0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
2bfb0 31 36 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  16.     { "sqlit
2bfc0 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31  e3_column_bytes1
2bfd0 36 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e  6", test_stmt_in
2bfe0 74 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65  t, (void*)sqlite
2bff0 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36  3_column_bytes16
2c000 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2c010 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31  te3_column_text1
2c020 36 22 2c 20 20 74 65 73 74 5f 73 74 6d 74 5f 75  6",  test_stmt_u
2c030 74 66 31 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c  tf16, (void*)sql
2c040 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
2c050 31 36 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  16},.     { "sql
2c060 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  ite3_column_name
2c070 31 36 22 2c 20 20 74 65 73 74 5f 73 74 6d 74 5f  16",  test_stmt_
2c080 75 74 66 31 36 2c 20 28 76 6f 69 64 2a 29 73 71  utf16, (void*)sq
2c090 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  lite3_column_nam
2c0a0 65 31 36 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64  e16},.     { "ad
2c0b0 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74  d_alignment_test
2c0c0 5f 63 6f 6c 6c 61 74 69 6f 6e 73 22 2c 20 61 64  _collations", ad
2c0d0 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74  d_alignment_test
2c0e0 5f 63 6f 6c 6c 61 74 69 6f 6e 73 2c 20 30 20 20  _collations, 0  
2c0f0 20 20 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53      },.#ifndef S
2c100 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54  QLITE_OMIT_DECLT
2c110 59 50 45 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  YPE.     { "sqli
2c120 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74  te3_column_declt
2c130 79 70 65 31 36 22 2c 74 65 73 74 5f 73 74 6d 74  ype16",test_stmt
2c140 5f 75 74 66 31 36 2c 28 76 6f 69 64 2a 29 73 71  _utf16,(void*)sq
2c150 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63  lite3_column_dec
2c160 6c 74 79 70 65 31 36 7d 2c 0a 23 65 6e 64 69 66  ltype16},.#endif
2c170 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
2c180 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
2c190 41 44 41 54 41 0a 7b 22 73 71 6c 69 74 65 33 5f  ADATA.{"sqlite3_
2c1a0 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f  column_database_
2c1b0 6e 61 6d 65 31 36 22 2c 0a 20 20 74 65 73 74 5f  name16",.  test_
2c1c0 73 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f 69  stmt_utf16, (voi
2c1d0 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
2c1e0 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 31  n_database_name1
2c1f0 36 7d 2c 0a 7b 22 73 71 6c 69 74 65 33 5f 63 6f  6},.{"sqlite3_co
2c200 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 31  lumn_table_name1
2c210 36 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f 75 74  6", test_stmt_ut
2c220 66 31 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69  f16, (void*)sqli
2c230 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65  te3_column_table
2c240 5f 6e 61 6d 65 31 36 7d 2c 0a 7b 22 73 71 6c 69  _name16},.{"sqli
2c250 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69  te3_column_origi
2c260 6e 5f 6e 61 6d 65 31 36 22 2c 20 74 65 73 74 5f  n_name16", test_
2c270 73 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f 69  stmt_utf16, (voi
2c280 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
2c290 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 31 36 7d  n_origin_name16}
2c2a0 2c 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  ,.#endif.#endif.
2c2b0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2c2c0 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
2c2d0 5f 76 32 22 2c 20 74 65 73 74 5f 63 72 65 61 74  _v2", test_creat
2c2e0 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 2c 20  e_collation_v2, 
2c2f0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
2c300 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f  ite3_global_reco
2c310 76 65 72 22 2c 20 20 20 20 20 74 65 73 74 5f 67  ver",     test_g
2c320 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 2c 20 30  lobal_recover, 0
2c330 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 77 6f     },.     { "wo
2c340 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 22  rking_64bit_int"
2c350 2c 20 20 20 20 20 20 20 20 20 20 77 6f 72 6b 69  ,          worki
2c360 6e 67 5f 36 34 62 69 74 5f 69 6e 74 2c 20 20 20  ng_64bit_int,   
2c370 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 76  0   },.     { "v
2c380 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74 22 2c  fs_unlink_test",
2c390 20 20 20 20 20 20 20 20 20 20 20 20 76 66 73 5f              vfs_
2c3a0 75 6e 6c 69 6e 6b 5f 74 65 73 74 2c 20 20 20 20  unlink_test,    
2c3b0 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   0   },.     { "
2c3c0 76 66 73 5f 69 6e 69 74 66 61 69 6c 5f 74 65 73  vfs_initfail_tes
2c3d0 74 22 2c 20 20 20 20 20 20 20 20 20 20 76 66 73  t",          vfs
2c3e0 5f 69 6e 69 74 66 61 69 6c 5f 74 65 73 74 2c 20  _initfail_test, 
2c3f0 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20    0   },.     { 
2c400 22 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 5f  "vfs_unregister_
2c410 61 6c 6c 22 2c 20 20 20 20 20 20 20 20 20 76 66  all",         vf
2c420 73 5f 75 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c  s_unregister_all
2c430 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b  ,  0   },.     {
2c440 20 22 76 66 73 5f 72 65 72 65 67 69 73 74 65 72   "vfs_reregister
2c450 5f 61 6c 6c 22 2c 20 20 20 20 20 20 20 20 20 76  _all",         v
2c460 66 73 5f 72 65 72 65 67 69 73 74 65 72 5f 61 6c  fs_reregister_al
2c470 6c 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20  l,  0   },.     
2c480 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  { "file_control_
2c490 74 65 73 74 22 2c 20 20 20 20 20 20 20 20 20 20  test",          
2c4a0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73  file_control_tes
2c4b0 74 2c 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20  t,   0   },.    
2c4c0 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c   { "file_control
2c4d0 5f 6c 61 73 74 65 72 72 6e 6f 5f 74 65 73 74 22  _lasterrno_test"
2c4e0 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c  , file_control_l
2c4f0 61 73 74 65 72 72 6e 6f 5f 74 65 73 74 2c 20 20  asterrno_test,  
2c500 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66  0   },.     { "f
2c510 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b  ile_control_lock
2c520 70 72 6f 78 79 5f 74 65 73 74 22 2c 20 66 69 6c  proxy_test", fil
2c530 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72  e_control_lockpr
2c540 6f 78 79 5f 74 65 73 74 2c 20 20 30 20 20 20 7d  oxy_test,  0   }
2c550 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63  ,.     { "file_c
2c560 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65  ontrol_chunksize
2c570 5f 74 65 73 74 22 2c 20 66 69 6c 65 5f 63 6f 6e  _test", file_con
2c580 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f 74  trol_chunksize_t
2c590 65 73 74 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20  est,  0   },.   
2c5a0 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f    { "file_contro
2c5b0 6c 5f 73 69 7a 65 68 69 6e 74 5f 74 65 73 74 22  l_sizehint_test"
2c5c0 2c 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  ,  file_control_
2c5d0 73 69 7a 65 68 69 6e 74 5f 74 65 73 74 2c 20 20  sizehint_test,  
2c5e0 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   0   },.     { "
2c5f0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e  file_control_win
2c600 33 32 5f 61 76 5f 72 65 74 72 79 22 2c 20 66 69  32_av_retry", fi
2c610 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32  le_control_win32
2c620 5f 61 76 5f 72 65 74 72 79 2c 20 20 30 20 20 20  _av_retry,  0   
2c630 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f  },.     { "file_
2c640 63 6f 6e 74 72 6f 6c 5f 70 65 72 73 69 73 74 5f  control_persist_
2c650 77 61 6c 22 2c 20 20 20 20 66 69 6c 65 5f 63 6f  wal",    file_co
2c660 6e 74 72 6f 6c 5f 70 65 72 73 69 73 74 5f 77 61  ntrol_persist_wa
2c670 6c 2c 20 20 20 20 20 30 20 20 20 7d 2c 0a 20 20  l,     0   },.  
2c680 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72     { "file_contr
2c690 6f 6c 5f 70 6f 77 65 72 73 61 66 65 5f 6f 76 65  ol_powersafe_ove
2c6a0 72 77 72 69 74 65 22 2c 66 69 6c 65 5f 63 6f 6e  rwrite",file_con
2c6b0 74 72 6f 6c 5f 70 6f 77 65 72 73 61 66 65 5f 6f  trol_powersafe_o
2c6c0 76 65 72 77 72 69 74 65 2c 30 7d 2c 0a 20 20 20  verwrite,0},.   
2c6d0 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f    { "file_contro
2c6e0 6c 5f 76 66 73 6e 61 6d 65 22 2c 20 20 20 20 20  l_vfsname",     
2c6f0 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
2c700 76 66 73 6e 61 6d 65 2c 20 20 20 20 20 20 20 20  vfsname,        
2c710 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   0   },.     { "
2c720 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 6d  file_control_tem
2c730 70 66 69 6c 65 6e 61 6d 65 22 2c 20 20 20 66 69  pfilename",   fi
2c740 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 6d 70 66  le_control_tempf
2c750 69 6c 65 6e 61 6d 65 2c 20 20 20 20 30 20 20 20  ilename,    0   
2c760 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2c770 65 33 5f 76 66 73 5f 6c 69 73 74 22 2c 20 20 20  e3_vfs_list",   
2c780 20 20 20 20 20 20 20 20 76 66 73 5f 6c 69 73 74          vfs_list
2c790 2c 20 20 20 20 20 30 20 20 20 7d 2c 0a 20 20 20  ,     0   },.   
2c7a0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65    { "sqlite3_cre
2c7b0 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 22  ate_function_v2"
2c7c0 2c 20 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75  , test_create_fu
2c7d0 6e 63 74 69 6f 6e 5f 76 32 2c 20 30 20 7d 2c 0a  nction_v2, 0 },.
2c7e0 0a 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f  .     /* Functio
2c7f0 6e 73 20 66 72 6f 6d 20 6f 73 2e 68 20 2a 2f 0a  ns from os.h */.
2c800 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2c810 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20 20 7b  MIT_UTF16.     {
2c820 20 22 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61   "add_test_colla
2c830 74 65 22 2c 20 20 20 20 20 20 20 20 74 65 73 74  te",        test
2c840 5f 63 6f 6c 6c 61 74 65 2c 20 30 20 20 20 20 20  _collate, 0     
2c850 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
2c860 20 22 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61   "add_test_colla
2c870 74 65 5f 6e 65 65 64 65 64 22 2c 20 74 65 73 74  te_needed", test
2c880 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 2c  _collate_needed,
2c890 20 30 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b   0     },.     {
2c8a0 20 22 61 64 64 5f 74 65 73 74 5f 66 75 6e 63 74   "add_test_funct
2c8b0 69 6f 6e 22 2c 20 20 20 20 20 20 20 74 65 73 74  ion",       test
2c8c0 5f 66 75 6e 63 74 69 6f 6e 2c 20 30 20 20 20 20  _function, 0    
2c8d0 20 20 20 20 20 20 20 7d 2c 0a 23 65 6e 64 69 66         },.#endif
2c8e0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2c8f0 5f 74 65 73 74 5f 65 72 72 73 74 72 22 2c 20 20  _test_errstr",  
2c900 20 20 20 74 65 73 74 5f 65 72 72 73 74 72 2c 20     test_errstr, 
2c910 30 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  0             },
2c920 0a 20 20 20 20 20 7b 20 22 74 63 6c 5f 76 61 72  .     { "tcl_var
2c930 69 61 62 6c 65 5f 74 79 70 65 22 2c 20 20 20 20  iable_type",    
2c940 20 20 20 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f     tcl_variable_
2c950 74 79 70 65 2c 20 30 20 20 20 20 20 20 20 7d 2c  type, 0       },
2c960 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2c970 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2c980 45 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  E.     { "sqlite
2c990 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f  3_enable_shared_
2c9a0 63 61 63 68 65 22 2c 20 74 65 73 74 5f 65 6e 61  cache", test_ena
2c9b0 62 6c 65 5f 73 68 61 72 65 64 2c 20 30 20 20 7d  ble_shared, 0  }
2c9c0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2c9d0 33 5f 73 68 61 72 65 64 5f 63 61 63 68 65 5f 72  3_shared_cache_r
2c9e0 65 70 6f 72 74 22 2c 20 73 71 6c 69 74 65 33 42  eport", sqlite3B
2c9f0 74 72 65 65 53 68 61 72 65 64 43 61 63 68 65 52  treeSharedCacheR
2ca00 65 70 6f 72 74 2c 20 30 7d 2c 0a 23 65 6e 64 69  eport, 0},.#endi
2ca10 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  f.     { "sqlite
2ca20 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d  3_libversion_num
2ca30 62 65 72 22 2c 20 74 65 73 74 5f 6c 69 62 76 65  ber", test_libve
2ca40 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 2c 20 30 20  rsion_number, 0 
2ca50 20 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54   },.#ifdef SQLIT
2ca60 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
2ca70 4d 45 54 41 44 41 54 41 0a 20 20 20 20 20 7b 20  METADATA.     { 
2ca80 22 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63  "sqlite3_table_c
2ca90 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 22 2c  olumn_metadata",
2caa0 20 74 65 73 74 5f 74 61 62 6c 65 5f 63 6f 6c 75   test_table_colu
2cab0 6d 6e 5f 6d 65 74 61 64 61 74 61 2c 20 30 20 20  mn_metadata, 0  
2cac0 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65  },.#endif.#ifnde
2cad0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
2cae0 43 52 42 4c 4f 42 0a 20 20 20 20 20 7b 20 22 73  CRBLOB.     { "s
2caf0 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64  qlite3_blob_read
2cb00 22 2c 20 20 20 74 65 73 74 5f 62 6c 6f 62 5f 72  ",   test_blob_r
2cb10 65 61 64 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20  ead, 0  },.     
2cb20 7b 20 22 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f  { "sqlite3_blob_
2cb30 77 72 69 74 65 22 2c 20 20 74 65 73 74 5f 62 6c  write",  test_bl
2cb40 6f 62 5f 77 72 69 74 65 2c 20 30 20 20 7d 2c 0a  ob_write, 0  },.
2cb50 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2cb60 62 6c 6f 62 5f 72 65 6f 70 65 6e 22 2c 20 74 65  blob_reopen", te
2cb70 73 74 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 2c 20  st_blob_reopen, 
2cb80 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  0  },.     { "sq
2cb90 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73  lite3_blob_bytes
2cba0 22 2c 20 20 74 65 73 74 5f 62 6c 6f 62 5f 62 79  ",  test_blob_by
2cbb0 74 65 73 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20  tes, 0  },.     
2cbc0 7b 20 22 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f  { "sqlite3_blob_
2cbd0 63 6c 6f 73 65 22 2c 20 20 74 65 73 74 5f 62 6c  close",  test_bl
2cbe0 6f 62 5f 63 6c 6f 73 65 2c 20 30 20 20 7d 2c 0a  ob_close, 0  },.
2cbf0 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 70  #endif.     { "p
2cc00 63 61 63 68 65 5f 73 74 61 74 73 22 2c 20 20 20  cache_stats",   
2cc10 20 20 20 20 74 65 73 74 5f 70 63 61 63 68 65 5f      test_pcache_
2cc20 73 74 61 74 73 2c 20 30 20 20 7d 2c 0a 23 69 66  stats, 0  },.#if
2cc30 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2cc40 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a  E_UNLOCK_NOTIFY.
2cc50 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2cc60 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c 20  unlock_notify", 
2cc70 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69  test_unlock_noti
2cc80 66 79 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66  fy, 0  },.#endif
2cc90 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2cca0 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 22  _wal_checkpoint"
2ccb0 2c 20 20 20 74 65 73 74 5f 77 61 6c 5f 63 68 65  ,   test_wal_che
2ccc0 63 6b 70 6f 69 6e 74 2c 20 30 20 20 7d 2c 0a 20  ckpoint, 0  },. 
2ccd0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 77      { "sqlite3_w
2cce0 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32  al_checkpoint_v2
2ccf0 22 2c 74 65 73 74 5f 77 61 6c 5f 63 68 65 63 6b  ",test_wal_check
2cd00 70 6f 69 6e 74 5f 76 32 2c 20 30 20 20 7d 2c 0a  point_v2, 0  },.
2cd10 20 20 20 20 20 7b 20 22 74 65 73 74 5f 73 71 6c       { "test_sql
2cd20 69 74 65 33 5f 6c 6f 67 22 2c 20 20 20 20 20 20  ite3_log",      
2cd30 20 20 20 74 65 73 74 5f 73 71 6c 69 74 65 33 5f     test_sqlite3_
2cd40 6c 6f 67 2c 20 30 20 20 7d 2c 0a 23 69 66 6e 64  log, 0  },.#ifnd
2cd50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
2cd60 58 50 4c 41 49 4e 0a 20 20 20 20 20 7b 20 22 70  XPLAIN.     { "p
2cd70 72 69 6e 74 5f 65 78 70 6c 61 69 6e 5f 71 75 65  rint_explain_que
2cd80 72 79 5f 70 6c 61 6e 22 2c 20 74 65 73 74 5f 70  ry_plan", test_p
2cd90 72 69 6e 74 5f 65 71 70 2c 20 30 20 20 7d 2c 0a  rint_eqp, 0  },.
2cda0 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73  #endif.     { "s
2cdb0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
2cdc0 72 6f 6c 22 2c 20 74 65 73 74 5f 74 65 73 74 5f  rol", test_test_
2cdd0 63 6f 6e 74 72 6f 6c 20 7d 2c 0a 23 69 66 20 53  control },.#if S
2cde0 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 0a 20 20  QLITE_OS_UNIX.  
2cdf0 20 20 20 7b 20 22 67 65 74 72 75 73 61 67 65 22     { "getrusage"
2ce00 2c 20 74 65 73 74 5f 67 65 74 72 75 73 61 67 65  , test_getrusage
2ce10 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20   },.#endif.     
2ce20 7b 20 22 6c 6f 61 64 5f 73 74 61 74 69 63 5f 65  { "load_static_e
2ce30 78 74 65 6e 73 69 6f 6e 22 2c 20 74 63 6c 4c 6f  xtension", tclLo
2ce40 61 64 53 74 61 74 69 63 45 78 74 65 6e 73 69 6f  adStaticExtensio
2ce50 6e 43 6d 64 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73  nCmd },.  };.  s
2ce60 74 61 74 69 63 20 69 6e 74 20 62 69 74 6d 61 73  tatic int bitmas
2ce70 6b 5f 73 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28  k_size = sizeof(
2ce80 42 69 74 6d 61 73 6b 29 2a 38 3b 0a 20 20 69 6e  Bitmask)*8;.  in
2ce90 74 20 69 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  t i;.  extern in
2cea0 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63  t sqlite3_sync_c
2ceb0 6f 75 6e 74 2c 20 73 71 6c 69 74 65 33 5f 66 75  ount, sqlite3_fu
2cec0 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 3b 0a 20 20  llsync_count;.  
2ced0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
2cee0 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
2cef0 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  t;.  extern int 
2cf00 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75  sqlite3_like_cou
2cf10 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  nt;.  extern int
2cf20 20 73 71 6c 69 74 65 33 5f 78 66 65 72 6f 70 74   sqlite3_xferopt
2cf30 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e  _count;.  extern
2cf40 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67   int sqlite3_pag
2cf50 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 3b  er_readdb_count;
2cf60 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
2cf70 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
2cf80 65 64 62 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74  edb_count;.  ext
2cf90 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
2cfa0 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75  pager_writej_cou
2cfb0 6e 74 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  nt;.#if SQLITE_O
2cfc0 53 5f 57 49 4e 0a 20 20 65 78 74 65 72 6e 20 69  S_WIN.  extern i
2cfd0 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79  nt sqlite3_os_ty
2cfe0 70 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  pe;.#endif.#ifde
2cff0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
2d000 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
2d010 74 65 33 57 68 65 72 65 54 72 61 63 65 3b 0a 20  te3WhereTrace;. 
2d020 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
2d030 74 65 33 4f 53 54 72 61 63 65 3b 0a 20 20 65 78  te3OSTrace;.  ex
2d040 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
2d050 57 61 6c 54 72 61 63 65 3b 0a 23 65 6e 64 69 66  WalTrace;.#endif
2d060 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
2d070 45 53 54 0a 20 20 65 78 74 65 72 6e 20 63 68 61  EST.  extern cha
2d080 72 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f  r sqlite3_query_
2d090 70 6c 61 6e 5b 5d 3b 0a 20 20 73 74 61 74 69 63  plan[];.  static
2d0a0 20 63 68 61 72 20 2a 71 75 65 72 79 5f 70 6c 61   char *query_pla
2d0b0 6e 20 3d 20 73 71 6c 69 74 65 33 5f 71 75 65 72  n = sqlite3_quer
2d0c0 79 5f 70 6c 61 6e 3b 0a 23 69 66 64 65 66 20 53  y_plan;.#ifdef S
2d0d0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
2d0e0 33 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  3.  extern int s
2d0f0 71 6c 69 74 65 33 5f 66 74 73 33 5f 65 6e 61 62  qlite3_fts3_enab
2d100 6c 65 5f 70 61 72 65 6e 74 68 65 73 65 73 3b 0a  le_parentheses;.
2d110 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20  #endif.#endif.. 
2d120 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
2d130 6f 66 28 61 43 6d 64 29 2f 73 69 7a 65 6f 66 28  of(aCmd)/sizeof(
2d140 61 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  aCmd[0]); i++){.
2d150 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f      Tcl_CreateCo
2d160 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 61 43  mmand(interp, aC
2d170 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 43 6d  md[i].zName, aCm
2d180 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 30 2c 20 30  d[i].xProc, 0, 0
2d190 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
2d1a0 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f 62 6a 43  ; i<sizeof(aObjC
2d1b0 6d 64 29 2f 73 69 7a 65 6f 66 28 61 4f 62 6a 43  md)/sizeof(aObjC
2d1c0 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  md[0]); i++){.  
2d1d0 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
2d1e0 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 61  ommand(interp, a
2d1f0 4f 62 6a 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c  ObjCmd[i].zName,
2d200 20 0a 20 20 20 20 20 20 20 20 61 4f 62 6a 43 6d   .        aObjCm
2d210 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 61 4f 62 6a  d[i].xProc, aObj
2d220 43 6d 64 5b 69 5d 2e 63 6c 69 65 6e 74 44 61 74  Cmd[i].clientDat
2d230 61 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 54 63 6c  a, 0);.  }.  Tcl
2d240 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
2d250 20 22 73 71 6c 69 74 65 5f 73 65 61 72 63 68 5f   "sqlite_search_
2d260 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28  count", .      (
2d270 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 73  char*)&sqlite3_s
2d280 65 61 72 63 68 5f 63 6f 75 6e 74 2c 20 54 43 4c  earch_count, TCL
2d290 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
2d2a0 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
2d2b0 2c 20 22 73 71 6c 69 74 65 5f 66 6f 75 6e 64 5f  , "sqlite_found_
2d2c0 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28  count", .      (
2d2d0 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 66  char*)&sqlite3_f
2d2e0 6f 75 6e 64 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  ound_count, TCL_
2d2f0 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
2d300 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
2d310 20 22 73 71 6c 69 74 65 5f 73 6f 72 74 5f 63 6f   "sqlite_sort_co
2d320 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68  unt", .      (ch
2d330 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 73 6f 72  ar*)&sqlite3_sor
2d340 74 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  t_count, TCL_LIN
2d350 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
2d360 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
2d370 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73  qlite3_max_blobs
2d380 69 7a 65 22 2c 20 0a 20 20 20 20 20 20 28 63 68  ize", .      (ch
2d390 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6d 61 78  ar*)&sqlite3_max
2d3a0 5f 62 6c 6f 62 73 69 7a 65 2c 20 54 43 4c 5f 4c  _blobsize, TCL_L
2d3b0 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f  INK_INT);.  Tcl_
2d3c0 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
2d3d0 22 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75  "sqlite_like_cou
2d3e0 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61  nt", .      (cha
2d3f0 72 2a 29 26 73 71 6c 69 74 65 33 5f 6c 69 6b 65  r*)&sqlite3_like
2d400 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b  _count, TCL_LINK
2d410 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e  _INT);.  Tcl_Lin
2d420 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
2d430 6c 69 74 65 5f 69 6e 74 65 72 72 75 70 74 5f 63  lite_interrupt_c
2d440 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63  ount", .      (c
2d450 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 69 6e  har*)&sqlite3_in
2d460 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 2c 20 54  terrupt_count, T
2d470 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
2d480 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
2d490 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 65 6e  rp, "sqlite_open
2d4a0 5f 66 69 6c 65 5f 63 6f 75 6e 74 22 2c 20 0a 20  _file_count", . 
2d4b0 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
2d4c0 69 74 65 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63  ite3_open_file_c
2d4d0 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
2d4e0 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
2d4f0 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
2d500 74 65 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 22  te_current_time"
2d510 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  , .      (char*)
2d520 26 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74  &sqlite3_current
2d530 5f 74 69 6d 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  _time, TCL_LINK_
2d540 49 4e 54 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  INT);.#if SQLITE
2d550 5f 4f 53 5f 55 4e 49 58 20 26 26 20 64 65 66 69  _OS_UNIX && defi
2d560 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
2d570 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
2d580 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
2d590 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
2d5a0 72 70 2c 20 22 73 71 6c 69 74 65 5f 68 6f 73 74  rp, "sqlite_host
2d5b0 69 64 5f 6e 75 6d 22 2c 20 0a 20 20 20 20 20 20  id_num", .      
2d5c0 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
2d5d0 68 6f 73 74 69 64 5f 6e 75 6d 2c 20 54 43 4c 5f  hostid_num, TCL_
2d5e0 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69  LINK_INT);.#endi
2d5f0 66 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  f.  Tcl_LinkVar(
2d600 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33  interp, "sqlite3
2d610 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 22 2c  _xferopt_count",
2d620 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
2d630 71 6c 69 74 65 33 5f 78 66 65 72 6f 70 74 5f 63  qlite3_xferopt_c
2d640 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
2d650 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
2d660 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
2d670 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
2d680 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28  _count",.      (
2d690 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 70  char*)&sqlite3_p
2d6a0 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
2d6b0 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  t, TCL_LINK_INT)
2d6c0 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
2d6d0 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33  interp, "sqlite3
2d6e0 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
2d6f0 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68  ount",.      (ch
2d700 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 70 61 67  ar*)&sqlite3_pag
2d710 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74  er_writedb_count
2d720 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
2d730 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
2d740 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f  nterp, "sqlite3_
2d750 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75  pager_writej_cou
2d760 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  nt",.      (char
2d770 2a 29 26 73 71 6c 69 74 65 33 5f 70 61 67 65 72  *)&sqlite3_pager
2d780 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 2c 20 54  _writej_count, T
2d790 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69  CL_LINK_INT);.#i
2d7a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2d7b0 54 5f 55 54 46 31 36 0a 20 20 54 63 6c 5f 4c 69  T_UTF16.  Tcl_Li
2d7c0 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 75  nkVar(interp, "u
2d7d0 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f  naligned_string_
2d7e0 63 6f 75 6e 74 65 72 22 2c 0a 20 20 20 20 20 20  counter",.      
2d7f0 28 63 68 61 72 2a 29 26 75 6e 61 6c 69 67 6e 65  (char*)&unaligne
2d800 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72  d_string_counter
2d810 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
2d820 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
2d830 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
2d840 36 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  6.  Tcl_LinkVar(
2d850 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
2d860 6c 61 73 74 5f 6e 65 65 64 65 64 5f 63 6f 6c 6c  last_needed_coll
2d870 61 74 69 6f 6e 22 2c 0a 20 20 20 20 20 20 28 63  ation",.      (c
2d880 68 61 72 2a 29 26 70 7a 4e 65 65 64 65 64 43 6f  har*)&pzNeededCo
2d890 6c 6c 61 74 69 6f 6e 2c 20 54 43 4c 5f 4c 49 4e  llation, TCL_LIN
2d8a0 4b 5f 53 54 52 49 4e 47 7c 54 43 4c 5f 4c 49 4e  K_STRING|TCL_LIN
2d8b0 4b 5f 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a 23 65  K_READ_ONLY);.#e
2d8c0 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
2d8d0 4f 53 5f 57 49 4e 0a 20 20 54 63 6c 5f 4c 69 6e  OS_WIN.  Tcl_Lin
2d8e0 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
2d8f0 6c 69 74 65 5f 6f 73 5f 74 79 70 65 22 2c 0a 20  lite_os_type",. 
2d900 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
2d910 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20 54 43  ite3_os_type, TC
2d920 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e  L_LINK_INT);.#en
2d930 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
2d940 45 5f 54 45 53 54 0a 20 20 54 63 6c 5f 4c 69 6e  E_TEST.  Tcl_Lin
2d950 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
2d960 6c 69 74 65 5f 71 75 65 72 79 5f 70 6c 61 6e 22  lite_query_plan"
2d970 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
2d980 71 75 65 72 79 5f 70 6c 61 6e 2c 20 54 43 4c 5f  query_plan, TCL_
2d990 4c 49 4e 4b 5f 53 54 52 49 4e 47 7c 54 43 4c 5f  LINK_STRING|TCL_
2d9a0 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59 29 3b  LINK_READ_ONLY);
2d9b0 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
2d9c0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 54 63  QLITE_DEBUG.  Tc
2d9d0 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
2d9e0 2c 20 22 73 71 6c 69 74 65 5f 77 68 65 72 65 5f  , "sqlite_where_
2d9f0 74 72 61 63 65 22 2c 0a 20 20 20 20 20 20 28 63  trace",.      (c
2da00 68 61 72 2a 29 26 73 71 6c 69 74 65 33 57 68 65  har*)&sqlite3Whe
2da10 72 65 54 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e  reTrace, TCL_LIN
2da20 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
2da30 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
2da40 71 6c 69 74 65 5f 6f 73 5f 74 72 61 63 65 22 2c  qlite_os_trace",
2da50 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
2da60 71 6c 69 74 65 33 4f 53 54 72 61 63 65 2c 20 54  qlite3OSTrace, T
2da70 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69  CL_LINK_INT);.#i
2da80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2da90 54 5f 57 41 4c 0a 20 20 54 63 6c 5f 4c 69 6e 6b  T_WAL.  Tcl_Link
2daa0 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
2dab0 69 74 65 5f 77 61 6c 5f 74 72 61 63 65 22 2c 0a  ite_wal_trace",.
2dac0 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
2dad0 6c 69 74 65 33 57 61 6c 54 72 61 63 65 2c 20 54  lite3WalTrace, T
2dae0 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65  CL_LINK_INT);.#e
2daf0 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 6e  ndif.#endif.#ifn
2db00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2db10 44 49 53 4b 49 4f 0a 20 20 54 63 6c 5f 4c 69 6e  DISKIO.  Tcl_Lin
2db20 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
2db30 6c 69 74 65 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  lite_opentemp_co
2db40 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61  unt",.      (cha
2db50 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 70 65 6e  r*)&sqlite3_open
2db60 74 65 6d 70 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  temp_count, TCL_
2db70 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69  LINK_INT);.#endi
2db80 66 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  f.  Tcl_LinkVar(
2db90 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
2dba0 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75  static_bind_valu
2dbb0 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  e",.      (char*
2dbc0 29 26 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f  )&sqlite_static_
2dbd0 62 69 6e 64 5f 76 61 6c 75 65 2c 20 54 43 4c 5f  bind_value, TCL_
2dbe0 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a 20 20  LINK_STRING);.  
2dbf0 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
2dc00 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74  rp, "sqlite_stat
2dc10 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65 22 2c 0a  ic_bind_nbyte",.
2dc20 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
2dc30 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64  lite_static_bind
2dc40 5f 6e 62 79 74 65 2c 20 54 43 4c 5f 4c 49 4e 4b  _nbyte, TCL_LINK
2dc50 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e  _INT);.  Tcl_Lin
2dc60 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
2dc70 6c 69 74 65 5f 74 65 6d 70 5f 64 69 72 65 63 74  lite_temp_direct
2dc80 6f 72 79 22 2c 0a 20 20 20 20 20 20 28 63 68 61  ory",.      (cha
2dc90 72 2a 29 26 73 71 6c 69 74 65 33 5f 74 65 6d 70  r*)&sqlite3_temp
2dca0 5f 64 69 72 65 63 74 6f 72 79 2c 20 54 43 4c 5f  _directory, TCL_
2dcb0 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a 20 20  LINK_STRING);.  
2dcc0 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
2dcd0 72 70 2c 20 22 73 71 6c 69 74 65 5f 64 61 74 61  rp, "sqlite_data
2dce0 5f 64 69 72 65 63 74 6f 72 79 22 2c 0a 20 20 20  _directory",.   
2dcf0 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
2dd00 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
2dd10 79 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49  y, TCL_LINK_STRI
2dd20 4e 47 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NG);.  Tcl_LinkV
2dd30 61 72 28 69 6e 74 65 72 70 2c 20 22 62 69 74 6d  ar(interp, "bitm
2dd40 61 73 6b 5f 73 69 7a 65 22 2c 0a 20 20 20 20 20  ask_size",.     
2dd50 20 28 63 68 61 72 2a 29 26 62 69 74 6d 61 73 6b   (char*)&bitmask
2dd60 5f 73 69 7a 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  _size, TCL_LINK_
2dd70 49 4e 54 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41  INT|TCL_LINK_REA
2dd80 44 5f 4f 4e 4c 59 29 3b 0a 20 20 54 63 6c 5f 4c  D_ONLY);.  Tcl_L
2dd90 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
2dda0 73 71 6c 69 74 65 5f 73 79 6e 63 5f 63 6f 75 6e  sqlite_sync_coun
2ddb0 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  t",.      (char*
2ddc0 29 26 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63  )&sqlite3_sync_c
2ddd0 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
2dde0 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
2ddf0 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
2de00 74 65 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  te_fullsync_coun
2de10 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  t",.      (char*
2de20 29 26 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79  )&sqlite3_fullsy
2de30 6e 63 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49  nc_count, TCL_LI
2de40 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66 20 64 65 66  NK_INT);.#if def
2de50 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
2de60 4c 45 5f 46 54 53 33 29 20 26 26 20 64 65 66 69  LE_FTS3) && defi
2de70 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
2de80 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
2de90 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 66  nterp, "sqlite_f
2dea0 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65 6e  ts3_enable_paren
2deb0 74 68 65 73 65 73 22 2c 0a 20 20 20 20 20 20 28  theses",.      (
2dec0 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 66  char*)&sqlite3_f
2ded0 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65 6e  ts3_enable_paren
2dee0 74 68 65 73 65 73 2c 20 54 43 4c 5f 4c 49 4e 4b  theses, TCL_LINK
2def0 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 20 20  _INT);.#endif.  
2df00 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2df10 0a                                               .